Module: wine Branch: master Commit: 56464f5e074897a607b7b3f98c591537adca55cf URL: https://source.winehq.org/git/wine.git/?a=commit;h=56464f5e074897a607b7b3f98...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Tue Mar 13 14:11:04 2018 +0330
wined3d: Pass a texture and sub-resource index to texture2d_destroy_dc().
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wined3d/texture.c | 28 +++++++++++++++++----------- dlls/wined3d/wined3d_private.h | 8 -------- 2 files changed, 17 insertions(+), 19 deletions(-)
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 07c08d8..6abc7e7 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -1406,18 +1406,20 @@ static void texture2d_create_dc(void *object)
static void texture2d_destroy_dc(void *object) { - struct wined3d_surface *surface = object; + const struct wined3d_texture_idx *idx = object; D3DKMT_DESTROYDCFROMMEMORY destroy_desc; struct wined3d_context *context = NULL; struct wined3d_texture *texture; + struct wined3d_surface *surface; struct wined3d_bo_address data; unsigned int sub_resource_idx; struct wined3d_device *device; NTSTATUS status;
- texture = surface->container; - sub_resource_idx = surface_get_sub_resource_idx(surface); + texture = idx->texture; + sub_resource_idx = idx->sub_resource_idx; device = texture->resource.device; + surface = texture->sub_resources[sub_resource_idx].u.surface;
if (!surface->dc) { @@ -1453,7 +1455,6 @@ HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, UINT const struct wined3d_format *format = wined3d_get_format(gl_info, format_id, texture->resource.usage); UINT resource_size = wined3d_format_calculate_size(format, device->surface_alignment, width, height, 1); struct wined3d_texture_sub_resource *sub_resource; - struct wined3d_surface *surface; DWORD valid_location = 0; BOOL create_dib = FALSE;
@@ -1500,10 +1501,11 @@ HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, UINT wined3d_resource_wait_idle(&texture->resource);
sub_resource = &texture->sub_resources[0]; - surface = sub_resource->u.surface; - if (surface->dc) + if (sub_resource->u.surface->dc) { - wined3d_cs_destroy_object(device->cs, texture2d_destroy_dc, surface); + struct wined3d_texture_idx texture_idx = {texture, 0}; + + wined3d_cs_destroy_object(device->cs, texture2d_destroy_dc, &texture_idx); device->cs->ops->finish(device->cs, WINED3D_CS_QUEUE_DEFAULT); create_dib = TRUE; } @@ -1889,7 +1891,11 @@ static void texture2d_cleanup_sub_resources(struct wined3d_texture *texture) TRACE("surface %p.\n", surface);
if (surface->dc) - texture2d_destroy_dc(surface); + { + struct wined3d_texture_idx texture_idx = {texture, i}; + + texture2d_destroy_dc(&texture_idx); + } } if (context) context_release(context); @@ -2360,8 +2366,6 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3
surface = &surfaces[idx]; surface->container = texture; - surface->texture_level = i; - surface->texture_layer = j;
sub_resource = &texture->sub_resources[idx]; sub_resource->locations = WINED3D_LOCATION_DISCARDED; @@ -3224,7 +3228,9 @@ HRESULT CDECL wined3d_texture_release_dc(struct wined3d_texture *texture, unsign
if (!(texture->resource.usage & WINED3DUSAGE_OWNDC) && !(device->wined3d->flags & WINED3D_NO3D)) { - wined3d_cs_destroy_object(device->cs, texture2d_destroy_dc, surface); + struct wined3d_texture_idx texture_idx = {texture, sub_resource_idx}; + + wined3d_cs_destroy_object(device->cs, texture2d_destroy_dc, &texture_idx); device->cs->ops->finish(device->cs, WINED3D_CS_QUEUE_DEFAULT); }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 247e712..9dc193a 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3335,19 +3335,11 @@ struct wined3d_surface { struct wined3d_texture *container;
- unsigned int texture_level; - unsigned int texture_layer; - /* For GetDC */ HBITMAP bitmap; HDC dc; };
-static inline unsigned int surface_get_sub_resource_idx(const struct wined3d_surface *surface) -{ - return surface->texture_layer * surface->container->level_count + surface->texture_level; -} - void wined3d_surface_upload_data(struct wined3d_texture *texture, unsigned int sub_resource_idx, const struct wined3d_gl_info *gl_info, const struct wined3d_format *format, const RECT *src_rect, unsigned int src_pitch, const POINT *dst_point, BOOL srgb,