From: Zebediah Figura zfigura@codeweavers.com
--- dlls/wined3d/texture.c | 24 ++++++++++++++++++++++++ dlls/wined3d/wined3d.spec | 1 + dlls/wined3d/wined3d_private.h | 2 ++ include/wine/wined3d.h | 1 + 4 files changed, 28 insertions(+)
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 3dfecc949d1..722c3db23b2 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -4667,6 +4667,30 @@ void wined3d_texture_update_sub_resource(struct wined3d_texture *texture, unsign wined3d_texture_invalidate_location(texture, sub_resource_idx, ~WINED3D_LOCATION_TEXTURE_RGB); }
+struct wined3d_shader_resource_view * CDECL wined3d_texture_acquire_identity_srv(struct wined3d_texture *texture) +{ + struct wined3d_view_desc desc; + HRESULT hr; + + if (texture->identity_srv) + return texture->identity_srv; + + desc.format_id = texture->resource.format->id; + desc.flags = 0; + desc.u.texture.level_idx = 0; + desc.u.texture.level_count = texture->level_count; + desc.u.texture.layer_idx = 0; + desc.u.texture.layer_count = texture->layer_count; + if (FAILED(hr = wined3d_shader_resource_view_create(&desc, &texture->resource, + NULL, &wined3d_null_parent_ops, &texture->identity_srv))) + { + ERR("Failed to create shader resource view, hr %#lx.\n", hr); + return NULL; + } + + return texture->identity_srv; +} + static void wined3d_texture_no3d_upload_data(struct wined3d_context *context, const struct wined3d_const_bo_address *src_bo_addr, const struct wined3d_format *src_format, const struct wined3d_box *src_box, unsigned int src_row_pitch, unsigned int src_slice_pitch, diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 2eaf83160c1..72e0e3fd8fa 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -298,6 +298,7 @@ @ cdecl wined3d_swapchain_state_resize_target(ptr ptr) @ cdecl wined3d_swapchain_state_set_fullscreen(ptr ptr ptr)
+@ cdecl wined3d_texture_acquire_identity_srv(ptr) @ cdecl wined3d_texture_add_dirty_region(ptr long ptr) @ cdecl wined3d_texture_create(ptr ptr long long long ptr ptr ptr ptr) @ cdecl wined3d_texture_decref(ptr) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index bb955873467..eda3a515ea7 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3335,6 +3335,8 @@ struct wined3d_texture unsigned int row_pitch; unsigned int slice_pitch;
+ struct wined3d_shader_resource_view *identity_srv; + /* May only be accessed from the command stream worker thread. */ struct wined3d_texture_async { diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index c2f7950ad3f..03b6989bb72 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2866,6 +2866,7 @@ HRESULT __cdecl wined3d_swapchain_state_resize_target(struct wined3d_swapchain_s HRESULT __cdecl wined3d_swapchain_state_set_fullscreen(struct wined3d_swapchain_state *state, const struct wined3d_swapchain_desc *desc, const struct wined3d_display_mode *mode);
+struct wined3d_shader_resource_view * __cdecl wined3d_texture_acquire_identity_srv(struct wined3d_texture *texture); HRESULT __cdecl wined3d_texture_add_dirty_region(struct wined3d_texture *texture, UINT layer, const struct wined3d_box *dirty_region); HRESULT __cdecl wined3d_texture_create(struct wined3d_device *device, const struct wined3d_resource_desc *desc,