[PATCH 1/6] wined3d: Pass a texture and sub-resource index to surface_load_fb_texture().
Henri Verbeet
hverbeet at codeweavers.com
Fri Mar 9 00:31:51 CST 2018
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/wined3d/arb_program_shader.c | 2 +-
dlls/wined3d/surface.c | 25 ++++++++++++-------------
dlls/wined3d/wined3d_private.h | 4 ++--
3 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 87a233f..23f4d04 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -7832,7 +7832,7 @@ static DWORD arbfp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bl
* flip in the blitter, we don't actually need that flip anyway. So we
* use the surface's texture as scratch texture, and flip the source
* rectangle instead. */
- surface_load_fb_texture(src_surface, FALSE, context);
+ texture2d_load_fb_texture(src_texture, src_sub_resource_idx, FALSE, context);
s = *src_rect;
s.top = wined3d_texture_get_level_height(src_texture, src_level) - s.top;
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 201a563..c2b1cd5 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1479,22 +1479,21 @@ error:
*
* Context activation is done by the caller. This function may temporarily
* switch to a different context and restore the original one before return. */
-void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb, struct wined3d_context *old_ctx)
+void texture2d_load_fb_texture(struct wined3d_texture *texture,
+ unsigned int sub_resource_idx, BOOL srgb, struct wined3d_context *context)
{
- unsigned int sub_resource_idx = surface_get_sub_resource_idx(surface);
- struct wined3d_texture *texture = surface->container;
struct wined3d_device *device = texture->resource.device;
+ struct wined3d_texture *restore_texture;
const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context = old_ctx;
- struct wined3d_surface *restore_rt = NULL;
- unsigned int level;
+ unsigned int restore_idx, level;
GLenum target;
- restore_rt = context_get_rt_surface(old_ctx);
- if (restore_rt != surface)
+ restore_texture = context->current_rt.texture;
+ restore_idx = context->current_rt.sub_resource_idx;
+ if (restore_texture != texture || restore_idx != sub_resource_idx)
context = context_acquire(device, texture, sub_resource_idx);
else
- restore_rt = NULL;
+ restore_texture = NULL;
gl_info = context->gl_info;
device_invalidate_state(device, STATE_FRAMEBUFFER);
@@ -1502,7 +1501,7 @@ void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb, struct
wined3d_texture_prepare_texture(texture, context, srgb);
wined3d_texture_bind_and_dirtify(texture, context, srgb);
- TRACE("Reading back offscreen render target %p.\n", surface);
+ TRACE("Reading back offscreen render target %p, %u.\n", texture, sub_resource_idx);
if (wined3d_resource_is_offscreen(&texture->resource))
gl_info->gl_ops.gl.p_glReadBuffer(context_get_offscreen_gl_buffer(context));
@@ -1517,8 +1516,8 @@ void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb, struct
wined3d_texture_get_level_height(texture, level));
checkGLcall("glCopyTexSubImage2D");
- if (restore_rt)
- context_restore(context, restore_rt);
+ if (restore_texture)
+ context_restore(context, restore_texture->sub_resources[sub_resource_idx].u.surface);
}
/* Does a direct frame buffer -> texture copy. Stretching is done with single
@@ -2184,7 +2183,7 @@ BOOL texture2d_load_texture(struct wined3d_texture *texture, unsigned int sub_re
&& wined3d_resource_is_offscreen(&texture->resource)
&& (sub_resource->locations & WINED3D_LOCATION_DRAWABLE))
{
- surface_load_fb_texture(sub_resource->u.surface, srgb, context);
+ texture2d_load_fb_texture(texture, sub_resource_idx, srgb, context);
return TRUE;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 853f9e2..e3d669a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3236,6 +3236,8 @@ static inline unsigned int wined3d_texture_get_level_pow2_height(const struct wi
BOOL texture2d_load_drawable(struct wined3d_texture *texture, unsigned int sub_resource_idx,
struct wined3d_context *context) DECLSPEC_HIDDEN;
+void texture2d_load_fb_texture(struct wined3d_texture *texture, unsigned int sub_resource_idx,
+ BOOL srgb, struct wined3d_context *context) DECLSPEC_HIDDEN;
BOOL texture2d_load_renderbuffer(struct wined3d_texture *texture, unsigned int sub_resource_idx,
struct wined3d_context *context, DWORD dst_location) DECLSPEC_HIDDEN;
BOOL texture2d_load_sysmem(struct wined3d_texture *texture, unsigned int sub_resource_idx,
@@ -3346,8 +3348,6 @@ static inline struct wined3d_texture_sub_resource *surface_get_sub_resource(stru
HRESULT wined3d_surface_blt(struct wined3d_surface *dst_surface, const struct wined3d_box *dst_box,
struct wined3d_surface *src_surface, const struct wined3d_box *src_box, DWORD flags,
const struct wined3d_blt_fx *blt_fx, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN;
-void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb,
- struct wined3d_context *context) DECLSPEC_HIDDEN;
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,
--
2.1.4
More information about the wine-devel
mailing list