Signed-off-by: Henri Verbeet hverbeet@codeweavers.com --- dlls/wined3d/texture.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-)
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 0abf5ad86e3..07c08d8af02 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -1334,23 +1334,30 @@ void wined3d_texture_set_compatible_renderbuffer(struct wined3d_texture *texture checkGLcall("set_compatible_renderbuffer"); }
+struct wined3d_texture_idx +{ + struct wined3d_texture *texture; + unsigned int sub_resource_idx; +}; + static void texture2d_create_dc(void *object) { - struct wined3d_surface *surface = object; + const struct wined3d_texture_idx *idx = object; struct wined3d_context *context = NULL; unsigned int sub_resource_idx, level; const struct wined3d_format *format; unsigned int row_pitch, slice_pitch; struct wined3d_texture *texture; + struct wined3d_surface *surface; struct wined3d_bo_address data; D3DKMT_CREATEDCFROMMEMORY desc; struct wined3d_device *device; NTSTATUS status;
- TRACE("surface %p.\n", surface); + TRACE("texture %p, sub_resource_idx %u.\n", idx->texture, idx->sub_resource_idx);
- texture = surface->container; - sub_resource_idx = surface_get_sub_resource_idx(surface); + texture = idx->texture; + sub_resource_idx = idx->sub_resource_idx; level = sub_resource_idx % texture->level_count; device = texture->resource.device;
@@ -1390,10 +1397,11 @@ static void texture2d_create_dc(void *object) return; }
+ surface = texture->sub_resources[sub_resource_idx].u.surface; surface->dc = desc.hDc; surface->bitmap = desc.hBitmap;
- TRACE("Created DC %p, bitmap %p for surface %p.\n", surface->dc, surface->bitmap, surface); + TRACE("Created DC %p, bitmap %p for texture %p, %u.\n", surface->dc, surface->bitmap, texture, sub_resource_idx); }
static void texture2d_destroy_dc(void *object) @@ -1563,7 +1571,9 @@ HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, UINT
if (create_dib) { - wined3d_cs_init_object(device->cs, texture2d_create_dc, surface); + struct wined3d_texture_idx texture_idx = {texture, 0}; + + wined3d_cs_init_object(device->cs, texture2d_create_dc, &texture_idx); device->cs->ops->finish(device->cs, WINED3D_CS_QUEUE_DEFAULT); }
@@ -2377,7 +2387,9 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3
if ((desc->usage & WINED3DUSAGE_OWNDC) || (device->wined3d->flags & WINED3D_NO3D)) { - wined3d_cs_init_object(device->cs, texture2d_create_dc, surface); + struct wined3d_texture_idx texture_idx = {texture, idx}; + + wined3d_cs_init_object(device->cs, texture2d_create_dc, &texture_idx); device->cs->ops->finish(device->cs, WINED3D_CS_QUEUE_DEFAULT); if (!surface->dc) { @@ -3163,7 +3175,9 @@ HRESULT CDECL wined3d_texture_get_dc(struct wined3d_texture *texture, unsigned i
if (!surface->dc) { - wined3d_cs_init_object(device->cs, texture2d_create_dc, surface); + struct wined3d_texture_idx texture_idx = {texture, sub_resource_idx}; + + wined3d_cs_init_object(device->cs, texture2d_create_dc, &texture_idx); device->cs->ops->finish(device->cs, WINED3D_CS_QUEUE_DEFAULT); } if (!surface->dc)