Commit 2179e991 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Pass a texture and sub-resource index to surface_load_fb_texture().

parent 661791cb
...@@ -7832,7 +7832,7 @@ static DWORD arbfp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bl ...@@ -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 * 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 * use the surface's texture as scratch texture, and flip the source
* rectangle instead. */ * 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 = *src_rect;
s.top = wined3d_texture_get_level_height(src_texture, src_level) - s.top; s.top = wined3d_texture_get_level_height(src_texture, src_level) - s.top;
......
...@@ -1479,22 +1479,21 @@ error: ...@@ -1479,22 +1479,21 @@ error:
* *
* Context activation is done by the caller. This function may temporarily * Context activation is done by the caller. This function may temporarily
* switch to a different context and restore the original one before return. */ * 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_device *device = texture->resource.device;
struct wined3d_texture *restore_texture;
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
struct wined3d_context *context = old_ctx; unsigned int restore_idx, level;
struct wined3d_surface *restore_rt = NULL;
unsigned int level;
GLenum target; GLenum target;
restore_rt = context_get_rt_surface(old_ctx); restore_texture = context->current_rt.texture;
if (restore_rt != surface) 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); context = context_acquire(device, texture, sub_resource_idx);
else else
restore_rt = NULL; restore_texture = NULL;
gl_info = context->gl_info; gl_info = context->gl_info;
device_invalidate_state(device, STATE_FRAMEBUFFER); device_invalidate_state(device, STATE_FRAMEBUFFER);
...@@ -1502,7 +1501,7 @@ void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb, struct ...@@ -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_prepare_texture(texture, context, srgb);
wined3d_texture_bind_and_dirtify(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)) if (wined3d_resource_is_offscreen(&texture->resource))
gl_info->gl_ops.gl.p_glReadBuffer(context_get_offscreen_gl_buffer(context)); 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 ...@@ -1517,8 +1516,8 @@ void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb, struct
wined3d_texture_get_level_height(texture, level)); wined3d_texture_get_level_height(texture, level));
checkGLcall("glCopyTexSubImage2D"); checkGLcall("glCopyTexSubImage2D");
if (restore_rt) if (restore_texture)
context_restore(context, restore_rt); context_restore(context, restore_texture->sub_resources[sub_resource_idx].u.surface);
} }
/* Does a direct frame buffer -> texture copy. Stretching is done with single /* 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 ...@@ -2184,7 +2183,7 @@ BOOL texture2d_load_texture(struct wined3d_texture *texture, unsigned int sub_re
&& wined3d_resource_is_offscreen(&texture->resource) && wined3d_resource_is_offscreen(&texture->resource)
&& (sub_resource->locations & WINED3D_LOCATION_DRAWABLE)) && (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; return TRUE;
} }
......
...@@ -3236,6 +3236,8 @@ static inline unsigned int wined3d_texture_get_level_pow2_height(const struct wi ...@@ -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, BOOL texture2d_load_drawable(struct wined3d_texture *texture, unsigned int sub_resource_idx,
struct wined3d_context *context) DECLSPEC_HIDDEN; 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, BOOL texture2d_load_renderbuffer(struct wined3d_texture *texture, unsigned int sub_resource_idx,
struct wined3d_context *context, DWORD dst_location) DECLSPEC_HIDDEN; struct wined3d_context *context, DWORD dst_location) DECLSPEC_HIDDEN;
BOOL texture2d_load_sysmem(struct wined3d_texture *texture, unsigned int sub_resource_idx, 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 ...@@ -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, 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, 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; 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, 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, 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, unsigned int src_pitch, const POINT *dst_point, BOOL srgb,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment