From: Zebediah Figura zfigura@codeweavers.com
--- dlls/d3d8/tests/visual.c | 88 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+)
diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c index 068a29f3847..b51760544c4 100644 --- a/dlls/d3d8/tests/visual.c +++ b/dlls/d3d8/tests/visual.c @@ -5941,6 +5941,93 @@ done: DestroyWindow(window); }
+static void test_buffer_no_dirty_update(void) +{ + unsigned int refcount, colour; + IDirect3DVertexBuffer8 *vb; + IDirect3DDevice8 *device; + IDirect3D8 *d3d; + HWND window; + HRESULT hr; + BYTE *data; + + static const struct + { + struct vec3 position; + DWORD diffuse; + } + green_quad[] = + { + {{-1.0f, -1.0f, 0.1f}, 0xff00ff00}, + {{-1.0f, 1.0f, 0.1f}, 0xff00ff00}, + {{ 1.0f, -1.0f, 0.1f}, 0xff00ff00}, + + {{ 1.0f, -1.0f, 0.1f}, 0xff00ff00}, + {{-1.0f, 1.0f, 0.1f}, 0xff00ff00}, + {{ 1.0f, 1.0f, 0.1f}, 0xff00ff00}, + }, + red_quad[] = + { + {{-1.0f, -1.0f, 0.1f}, 0xffff0000}, + {{-1.0f, 1.0f, 0.1f}, 0xffff0000}, + {{ 1.0f, -1.0f, 0.1f}, 0xffff0000}, + + {{ 1.0f, -1.0f, 0.1f}, 0xffff0000}, + {{-1.0f, 1.0f, 0.1f}, 0xffff0000}, + {{ 1.0f, 1.0f, 0.1f}, 0xffff0000}, + }; + + window = create_window(); + d3d = Direct3DCreate8(D3D_SDK_VERSION); + ok(!!d3d, "Failed to create a D3D object.\n"); + if (!(device = create_device(d3d, window, window, TRUE))) + { + skip("Failed to create a D3D device.\n"); + goto done; + } + + hr = IDirect3DDevice8_CreateVertexBuffer(device, sizeof(green_quad), 0, 0, D3DPOOL_MANAGED, &vb); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + + hr = IDirect3DVertexBuffer8_Lock(vb, 0, 0, &data, 0); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + memcpy(data, red_quad, sizeof(red_quad)); + hr = IDirect3DVertexBuffer8_Unlock(vb); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + + hr = IDirect3DVertexBuffer8_Lock(vb, 0, 0, &data, D3DLOCK_NO_DIRTY_UPDATE); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + memcpy(data, green_quad, sizeof(green_quad)); + hr = IDirect3DVertexBuffer8_Unlock(vb); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + + hr = IDirect3DDevice8_BeginScene(device); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetRenderState(device, D3DRS_LIGHTING, FALSE); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetRenderState(device, D3DRS_ZENABLE, FALSE); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetVertexShader(device, D3DFVF_XYZ | D3DFVF_DIFFUSE); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetStreamSource(device, 0, vb, sizeof(*green_quad)); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_DrawPrimitive(device, D3DPT_TRIANGLELIST, 0, 2); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_EndScene(device); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + colour = getPixelColor(device, 320, 240); + ok(color_match(colour, 0x0000ff00, 1), "Got unexpected colour 0x%08x.\n", colour); + + IDirect3DVertexBuffer8_Release(vb); + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +done: + IDirect3D8_Release(d3d); + DestroyWindow(window); +} + static void test_3dc_formats(void) { static const char ati1n_data[] = @@ -11942,6 +12029,7 @@ START_TEST(visual) volume_dxtn_test(); volume_v16u16_test(); add_dirty_rect_test(); + test_buffer_no_dirty_update(); test_3dc_formats(); test_fog_interpolation(); test_negative_fixedfunction_fog();
From: Zebediah Figura zfigura@codeweavers.com
--- dlls/d3d9/tests/visual.c | 88 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c index 8be60d5e2fb..5c31d25f2eb 100644 --- a/dlls/d3d9/tests/visual.c +++ b/dlls/d3d9/tests/visual.c @@ -19815,6 +19815,93 @@ static void add_dirty_rect_test(void) DestroyWindow(window); }
+static void test_buffer_no_dirty_update(void) +{ + unsigned int refcount, colour; + IDirect3DVertexBuffer9 *vb; + IDirect3DDevice9 *device; + IDirect3D9 *d3d; + HWND window; + HRESULT hr; + void *data; + + static const struct + { + struct vec3 position; + DWORD diffuse; + } + green_quad[] = + { + {{-1.0f, -1.0f, 0.1f}, 0xff00ff00}, + {{-1.0f, 1.0f, 0.1f}, 0xff00ff00}, + {{ 1.0f, -1.0f, 0.1f}, 0xff00ff00}, + + {{ 1.0f, -1.0f, 0.1f}, 0xff00ff00}, + {{-1.0f, 1.0f, 0.1f}, 0xff00ff00}, + {{ 1.0f, 1.0f, 0.1f}, 0xff00ff00}, + }, + red_quad[] = + { + {{-1.0f, -1.0f, 0.1f}, 0xffff0000}, + {{-1.0f, 1.0f, 0.1f}, 0xffff0000}, + {{ 1.0f, -1.0f, 0.1f}, 0xffff0000}, + + {{ 1.0f, -1.0f, 0.1f}, 0xffff0000}, + {{-1.0f, 1.0f, 0.1f}, 0xffff0000}, + {{ 1.0f, 1.0f, 0.1f}, 0xffff0000}, + }; + + window = create_window(); + d3d = Direct3DCreate9(D3D_SDK_VERSION); + ok(!!d3d, "Failed to create a D3D object.\n"); + if (!(device = create_device(d3d, window, window, TRUE))) + { + skip("Failed to create a D3D device.\n"); + goto done; + } + + hr = IDirect3DDevice9_CreateVertexBuffer(device, sizeof(green_quad), 0, 0, D3DPOOL_MANAGED, &vb, NULL); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + + hr = IDirect3DVertexBuffer9_Lock(vb, 0, 0, &data, 0); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + memcpy(data, red_quad, sizeof(red_quad)); + hr = IDirect3DVertexBuffer9_Unlock(vb); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + + hr = IDirect3DVertexBuffer9_Lock(vb, 0, 0, &data, D3DLOCK_NO_DIRTY_UPDATE); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + memcpy(data, green_quad, sizeof(green_quad)); + hr = IDirect3DVertexBuffer9_Unlock(vb); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + + hr = IDirect3DDevice9_BeginScene(device); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_LIGHTING, FALSE); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_ZENABLE, FALSE); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_DIFFUSE); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice9_SetStreamSource(device, 0, vb, 0, sizeof(*green_quad)); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice9_DrawPrimitive(device, D3DPT_TRIANGLELIST, 0, 2); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice9_EndScene(device); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + colour = getPixelColor(device, 320, 240); + ok(color_match(colour, 0x0000ff00, 1), "Got unexpected colour 0x%09x.\n", colour); + + IDirect3DVertexBuffer9_Release(vb); + refcount = IDirect3DDevice9_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); +done: + IDirect3D9_Release(d3d); + DestroyWindow(window); +} + static void test_per_stage_constant(void) { IDirect3DDevice9 *device; @@ -27744,6 +27831,7 @@ START_TEST(visual) volume_srgb_test(); volume_dxtn_test(); add_dirty_rect_test(); + test_buffer_no_dirty_update(); multisampled_depth_buffer_test(); resz_test(); stencil_cull_test();
From: Zebediah Figura zfigura@codeweavers.com
--- dlls/d3d8/buffer.c | 4 ++-- dlls/d3d8/d3d8_private.h | 8 ++++++++ dlls/d3d8/texture.c | 13 +++---------- 3 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/dlls/d3d8/buffer.c b/dlls/d3d8/buffer.c index 463ea93e17c..1b5098c64c9 100644 --- a/dlls/d3d8/buffer.c +++ b/dlls/d3d8/buffer.c @@ -296,7 +296,7 @@ HRESULT vertexbuffer_init(struct d3d8_vertexbuffer *buffer, struct d3d8_device * buffer->usage = usage;
desc.byte_width = size; - desc.usage = usage & WINED3DUSAGE_MASK; + desc.usage = wined3d_usage_from_d3d(pool, usage); desc.bind_flags = 0; desc.access = wined3daccess_from_d3dpool(pool, usage) | map_access_from_usage(usage); /* Buffers are always readable. */ @@ -600,7 +600,7 @@ HRESULT indexbuffer_init(struct d3d8_indexbuffer *buffer, struct d3d8_device *de return D3DERR_INVALIDCALL;
desc.byte_width = size; - desc.usage = (usage & WINED3DUSAGE_MASK) | WINED3DUSAGE_STATICDECL; + desc.usage = wined3d_usage_from_d3d(pool, usage) | WINED3DUSAGE_STATICDECL; desc.bind_flags = 0; desc.access = wined3daccess_from_d3dpool(pool, usage) | map_access_from_usage(usage); /* Buffers are always readable. */ diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h index da701a2a8d3..0fb3bd5b73e 100644 --- a/dlls/d3d8/d3d8_private.h +++ b/dlls/d3d8/d3d8_private.h @@ -353,6 +353,14 @@ static inline unsigned int wined3daccess_from_d3dpool(D3DPOOL pool, unsigned int return access; }
+static inline unsigned int wined3d_usage_from_d3d(D3DPOOL pool, DWORD usage) +{ + usage &= WINED3DUSAGE_MASK; + if (pool == D3DPOOL_SCRATCH) + usage |= WINED3DUSAGE_SCRATCH; + return usage; +} + static inline unsigned int wined3d_bind_flags_from_d3d8_usage(DWORD usage) { unsigned int bind_flags = 0; diff --git a/dlls/d3d8/texture.c b/dlls/d3d8/texture.c index f383b374bde..5f96336f2d8 100644 --- a/dlls/d3d8/texture.c +++ b/dlls/d3d8/texture.c @@ -1105,9 +1105,7 @@ HRESULT texture_init(struct d3d8_texture *texture, struct d3d8_device *device, desc.format = wined3dformat_from_d3dformat(format); desc.multisample_type = WINED3D_MULTISAMPLE_NONE; desc.multisample_quality = 0; - desc.usage = usage & WINED3DUSAGE_MASK; - if (pool == D3DPOOL_SCRATCH) - desc.usage |= WINED3DUSAGE_SCRATCH; + desc.usage = wined3d_usage_from_d3d(pool, usage); desc.bind_flags = wined3d_bind_flags_from_d3d8_usage(usage) | WINED3D_BIND_SHADER_RESOURCE; desc.access = wined3daccess_from_d3dpool(pool, usage); desc.width = width; @@ -1158,10 +1156,7 @@ HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *devic desc.format = wined3dformat_from_d3dformat(format); desc.multisample_type = WINED3D_MULTISAMPLE_NONE; desc.multisample_quality = 0; - desc.usage = usage & WINED3DUSAGE_MASK; - desc.usage |= WINED3DUSAGE_LEGACY_CUBEMAP; - if (pool == D3DPOOL_SCRATCH) - desc.usage |= WINED3DUSAGE_SCRATCH; + desc.usage = wined3d_usage_from_d3d(pool, usage) | WINED3DUSAGE_LEGACY_CUBEMAP; desc.bind_flags = wined3d_bind_flags_from_d3d8_usage(usage) | WINED3D_BIND_SHADER_RESOURCE; desc.access = wined3daccess_from_d3dpool(pool, usage); desc.width = edge_length; @@ -1216,9 +1211,7 @@ HRESULT volumetexture_init(struct d3d8_texture *texture, struct d3d8_device *dev desc.format = wined3dformat_from_d3dformat(format); desc.multisample_type = WINED3D_MULTISAMPLE_NONE; desc.multisample_quality = 0; - desc.usage = usage & WINED3DUSAGE_MASK; - if (pool == D3DPOOL_SCRATCH) - desc.usage |= WINED3DUSAGE_SCRATCH; + desc.usage = wined3d_usage_from_d3d(pool, usage); desc.bind_flags = wined3d_bind_flags_from_d3d8_usage(usage) | WINED3D_BIND_SHADER_RESOURCE; desc.access = wined3daccess_from_d3dpool(pool, usage); desc.width = width;
From: Zebediah Figura zfigura@codeweavers.com
--- dlls/d3d9/buffer.c | 4 ++-- dlls/d3d9/d3d9_private.h | 13 ++++++++----- dlls/d3d9/device.c | 6 ++---- dlls/d3d9/texture.c | 13 +++---------- 4 files changed, 15 insertions(+), 21 deletions(-)
diff --git a/dlls/d3d9/buffer.c b/dlls/d3d9/buffer.c index 0ffb48a66c8..e6224f95763 100644 --- a/dlls/d3d9/buffer.c +++ b/dlls/d3d9/buffer.c @@ -303,7 +303,7 @@ HRESULT vertexbuffer_init(struct d3d9_vertexbuffer *buffer, struct d3d9_device * d3d9_resource_init(&buffer->resource);
desc.byte_width = size; - desc.usage = usage & WINED3DUSAGE_MASK; + desc.usage = wined3d_usage_from_d3d(pool, usage); desc.bind_flags = 0; desc.access = wined3daccess_from_d3dpool(pool, usage) | map_access_from_usage(usage); /* Buffers are always readable. */ @@ -611,7 +611,7 @@ HRESULT indexbuffer_init(struct d3d9_indexbuffer *buffer, struct d3d9_device *de return D3DERR_INVALIDCALL;
desc.byte_width = size; - desc.usage = (usage & WINED3DUSAGE_MASK) | WINED3DUSAGE_STATICDECL; + desc.usage = wined3d_usage_from_d3d(pool, usage) | WINED3DUSAGE_STATICDECL; desc.bind_flags = 0; desc.access = wined3daccess_from_d3dpool(pool, usage) | map_access_from_usage(usage); /* Buffers are always readable. */ diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h index eb01b15338a..caa146ccd85 100644 --- a/dlls/d3d9/d3d9_private.h +++ b/dlls/d3d9/d3d9_private.h @@ -373,6 +373,14 @@ static inline unsigned int wined3daccess_from_d3dpool(D3DPOOL pool, unsigned int return access; }
+static inline unsigned int wined3d_usage_from_d3d(D3DPOOL pool, DWORD usage) +{ + usage &= WINED3DUSAGE_MASK; + if (pool == D3DPOOL_SCRATCH) + usage |= WINED3DUSAGE_SCRATCH; + return usage; +} + static inline unsigned int wined3d_bind_flags_from_d3d9_usage(DWORD usage) { unsigned int bind_flags = 0; @@ -385,11 +393,6 @@ static inline unsigned int wined3d_bind_flags_from_d3d9_usage(DWORD usage) return bind_flags; }
-static inline DWORD wined3dusage_from_d3dusage(unsigned int usage) -{ - return usage & WINED3DUSAGE_MASK; -} - static inline enum wined3d_multisample_type wined3d_multisample_type_from_d3d(D3DMULTISAMPLE_TYPE type) { return (enum wined3d_multisample_type)type; diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 894659e9ff9..9b8e44f6891 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -1976,10 +1976,8 @@ static HRESULT WINAPI d3d9_device_CreateOffscreenPlainSurface(IDirect3DDevice9Ex } }
- usage = 0; - if (pool == D3DPOOL_SCRATCH) - usage |= WINED3DUSAGE_SCRATCH; - access = wined3daccess_from_d3dpool(pool, usage) + usage = wined3d_usage_from_d3d(pool, 0); + access = wined3daccess_from_d3dpool(pool, 0) | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
return d3d9_device_create_surface(device, 0, wined3dformat_from_d3dformat(format), diff --git a/dlls/d3d9/texture.c b/dlls/d3d9/texture.c index 19f0363db07..31bf95834b8 100644 --- a/dlls/d3d9/texture.c +++ b/dlls/d3d9/texture.c @@ -1317,9 +1317,7 @@ HRESULT texture_init(struct d3d9_texture *texture, struct d3d9_device *device, desc.format = wined3dformat_from_d3dformat(format); desc.multisample_type = WINED3D_MULTISAMPLE_NONE; desc.multisample_quality = 0; - desc.usage = wined3dusage_from_d3dusage(usage); - if (pool == D3DPOOL_SCRATCH) - desc.usage |= WINED3DUSAGE_SCRATCH; + desc.usage = wined3d_usage_from_d3d(pool, usage); desc.bind_flags = wined3d_bind_flags_from_d3d9_usage(usage) | WINED3D_BIND_SHADER_RESOURCE; desc.access = wined3daccess_from_d3dpool(pool, usage); desc.width = width; @@ -1414,10 +1412,7 @@ HRESULT cubetexture_init(struct d3d9_texture *texture, struct d3d9_device *devic desc.format = wined3dformat_from_d3dformat(format); desc.multisample_type = WINED3D_MULTISAMPLE_NONE; desc.multisample_quality = 0; - desc.usage = wined3dusage_from_d3dusage(usage); - desc.usage |= WINED3DUSAGE_LEGACY_CUBEMAP; - if (pool == D3DPOOL_SCRATCH) - desc.usage |= WINED3DUSAGE_SCRATCH; + desc.usage = wined3d_usage_from_d3d(pool, usage) | WINED3DUSAGE_LEGACY_CUBEMAP; desc.bind_flags = wined3d_bind_flags_from_d3d9_usage(usage) | WINED3D_BIND_SHADER_RESOURCE; desc.access = wined3daccess_from_d3dpool(pool, usage); desc.width = edge_length; @@ -1500,9 +1495,7 @@ HRESULT volumetexture_init(struct d3d9_texture *texture, struct d3d9_device *dev desc.format = wined3dformat_from_d3dformat(format); desc.multisample_type = WINED3D_MULTISAMPLE_NONE; desc.multisample_quality = 0; - desc.usage = wined3dusage_from_d3dusage(usage); - if (pool == D3DPOOL_SCRATCH) - desc.usage |= WINED3DUSAGE_SCRATCH; + desc.usage = wined3d_usage_from_d3d(pool, usage); desc.bind_flags = wined3d_bind_flags_from_d3d9_usage(usage) | WINED3D_BIND_SHADER_RESOURCE; desc.access = wined3daccess_from_d3dpool(pool, usage); desc.width = width;
From: Matteo Bruni mbruni@codeweavers.com
We would like to use two different textures for the CPU and GPU parts of managed textures, which means that wined3d_resource_access_is_managed() as such will no longer be useful. --- dlls/d3d8/d3d8_private.h | 5 +++++ dlls/d3d9/d3d9_private.h | 5 +++++ dlls/ddraw/surface.c | 1 + dlls/wined3d/buffer.c | 2 +- dlls/wined3d/device.c | 2 +- dlls/wined3d/resource.c | 7 ++++--- dlls/wined3d/texture.c | 8 +++----- dlls/wined3d/utils.c | 1 + include/wine/wined3d.h | 1 + 9 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h index 0fb3bd5b73e..656f7f1859d 100644 --- a/dlls/d3d8/d3d8_private.h +++ b/dlls/d3d8/d3d8_private.h @@ -308,6 +308,9 @@ static inline DWORD d3dusage_from_wined3dusage(unsigned int wined3d_usage, unsig
static inline D3DPOOL d3dpool_from_wined3daccess(unsigned int access, unsigned int usage) { + if (usage & WINED3DUSAGE_MANAGED) + return D3DPOOL_MANAGED; + switch (access & (WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU)) { default: @@ -358,6 +361,8 @@ static inline unsigned int wined3d_usage_from_d3d(D3DPOOL pool, DWORD usage) usage &= WINED3DUSAGE_MASK; if (pool == D3DPOOL_SCRATCH) usage |= WINED3DUSAGE_SCRATCH; + else if (pool == D3DPOOL_MANAGED) + usage |= WINED3DUSAGE_MANAGED; return usage; }
diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h index caa146ccd85..858568f5e1c 100644 --- a/dlls/d3d9/d3d9_private.h +++ b/dlls/d3d9/d3d9_private.h @@ -318,6 +318,9 @@ static inline DWORD d3dusage_from_wined3dusage(unsigned int wined3d_usage, unsig
static inline D3DPOOL d3dpool_from_wined3daccess(unsigned int access, unsigned int usage) { + if (usage & WINED3DUSAGE_MANAGED) + return D3DPOOL_MANAGED; + switch (access & (WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_CPU)) { default: @@ -378,6 +381,8 @@ static inline unsigned int wined3d_usage_from_d3d(D3DPOOL pool, DWORD usage) usage &= WINED3DUSAGE_MASK; if (pool == D3DPOOL_SCRATCH) usage |= WINED3DUSAGE_SCRATCH; + else if (pool == D3DPOOL_MANAGED) + usage |= WINED3DUSAGE_MANAGED; return usage; }
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index afba0d5ac4b..d663769fd34 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -6433,6 +6433,7 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_ | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W; /* Managed textures have the system memory flag set. */ desc->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + wined3d_desc.usage |= WINED3DUSAGE_MANAGED; } else if (desc->ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY) { diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index a3c725136dd..3a2263d109f 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -1296,7 +1296,7 @@ static HRESULT wined3d_buffer_init(struct wined3d_buffer *buffer, struct wined3d buffer, buffer->resource.size, buffer->resource.usage, buffer->resource.heap_memory);
if (device->create_parms.flags & WINED3DCREATE_SOFTWARE_VERTEXPROCESSING - || wined3d_resource_access_is_managed(access)) + || (desc->usage & WINED3DUSAGE_MANAGED)) { /* SWvp and managed buffers always return the same pointer in buffer * maps and retain data in DISCARD maps. Keep a system memory copy of diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 498e2075875..f215da6d310 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -5525,7 +5525,7 @@ void CDECL wined3d_device_evict_managed_resources(struct wined3d_device *device) { TRACE("Checking resource %p for eviction.\n", resource);
- if (wined3d_resource_access_is_managed(resource->access) && !resource->map_count) + if ((resource->usage & WINED3DUSAGE_MANAGED) && !resource->map_count) { TRACE("Evicting %p.\n", resource); wined3d_cs_emit_unload_resource(device->cs, resource); diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c index 857750d6bd7..08edce3630c 100644 --- a/dlls/wined3d/resource.c +++ b/dlls/wined3d/resource.c @@ -32,6 +32,7 @@ static void resource_check_usage(DWORD usage, unsigned int access) | WINED3DUSAGE_STATICDECL | WINED3DUSAGE_OVERLAY | WINED3DUSAGE_SCRATCH + | WINED3DUSAGE_MANAGED | WINED3DUSAGE_PRIVATE | WINED3DUSAGE_LEGACY_CUBEMAP | ~WINED3DUSAGE_MASK; @@ -97,8 +98,8 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device * return WINED3DERR_INVALIDCALL; }
- /* Dynamic usage is incompatible with GPU writes. */ - if (usage & WINED3DUSAGE_DYNAMIC) + /* Dynamic and managed usages are incompatible with GPU writes. */ + if (usage & (WINED3DUSAGE_DYNAMIC | WINED3DUSAGE_MANAGED)) { WARN("Bind flags %s are incompatible with resource usage %s.\n", wined3d_debug_bind_flags(bind_flags), debug_d3dusage(usage)); @@ -268,7 +269,7 @@ DWORD CDECL wined3d_resource_set_priority(struct wined3d_resource *resource, DWO { DWORD prev;
- if (!wined3d_resource_access_is_managed(resource->access)) + if (!(resource->usage & WINED3DUSAGE_MANAGED)) { WARN("Called on non-managed resource %p, ignoring.\n", resource); return 0; diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 39ef6376203..15d87e02183 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -1736,7 +1736,7 @@ DWORD CDECL wined3d_texture_set_lod(struct wined3d_texture *texture, DWORD lod) /* The d3d9:texture test shows that SetLOD is ignored on non-managed * textures. The call always returns 0, and GetLOD always returns 0. */ resource = &texture->resource; - if (!wined3d_resource_access_is_managed(resource->access)) + if (!(resource->usage & WINED3DUSAGE_MANAGED)) { TRACE("Ignoring LOD on texture with resource access %s.\n", wined3d_debug_resource_access(resource->access)); @@ -3872,11 +3872,9 @@ static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struc } format = wined3d_get_format(device->adapter, desc->format, desc->bind_flags);
- if (desc->usage & WINED3DUSAGE_DYNAMIC && (wined3d_resource_access_is_managed(desc->access) - || desc->usage & WINED3DUSAGE_SCRATCH)) + if ((desc->usage & WINED3DUSAGE_DYNAMIC) && (desc->usage & (WINED3DUSAGE_MANAGED | WINED3DUSAGE_SCRATCH))) { - WARN("Attempted to create a dynamic texture with access %s and usage %s.\n", - wined3d_debug_resource_access(desc->access), debug_d3dusage(desc->usage)); + WARN("Attempted to create a dynamic texture with usage %s.\n", debug_d3dusage(desc->usage)); return WINED3DERR_INVALIDCALL; }
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 06c95135678..47500460a2e 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -4950,6 +4950,7 @@ const char *debug_d3dusage(DWORD usage) WINED3DUSAGE_TO_STR(WINED3DUSAGE_OWNDC); WINED3DUSAGE_TO_STR(WINED3DUSAGE_STATICDECL); WINED3DUSAGE_TO_STR(WINED3DUSAGE_OVERLAY); + WINED3DUSAGE_TO_STR(WINED3DUSAGE_MANAGED); WINED3DUSAGE_TO_STR(WINED3DUSAGE_QUERY_FILTER); WINED3DUSAGE_TO_STR(WINED3DUSAGE_QUERY_GENMIPMAP); WINED3DUSAGE_TO_STR(WINED3DUSAGE_QUERY_LEGACYBUMPMAP); diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 5d51de70863..1348b6fe368 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -953,6 +953,7 @@ enum wined3d_memory_segment_group #define WINED3DUSAGE_OWNDC 0x02000000 #define WINED3DUSAGE_STATICDECL 0x04000000 #define WINED3DUSAGE_OVERLAY 0x08000000 +#define WINED3DUSAGE_MANAGED 0x20000000
#define WINED3DUSAGE_QUERY_GENMIPMAP 0x00000400 #define WINED3DUSAGE_QUERY_LEGACYBUMPMAP 0x00008000
This merge request was approved by Jan Sikorski.
This merge request was approved by Zebediah Figura.