wined3d: Merge surface_bind_and_dirtify() and volume_bind_and_dirtify() into wined3d_texture_bind_and_dirtify().

This commit is contained in:
Henri Verbeet 2013-11-21 00:10:20 +01:00 committed by Alexandre Julliard
parent 2e63e8f9cc
commit f91eab6d3e
4 changed files with 37 additions and 57 deletions

View File

@ -594,28 +594,6 @@ static void surface_evict_sysmem(struct wined3d_surface *surface)
surface_invalidate_location(surface, SFLAG_INSYSMEM); surface_invalidate_location(surface, SFLAG_INSYSMEM);
} }
/* Context activation is done by the caller. */
static void surface_bind_and_dirtify(struct wined3d_surface *surface,
struct wined3d_context *context, BOOL srgb)
{
DWORD active_sampler;
/* We don't need a specific texture unit, but after binding the texture
* the current unit is dirty. Read the unit back instead of switching to
* 0, this avoids messing around with the state manager's GL states. The
* current texture unit should always be a valid one.
*
* To be more specific, this is tricky because we can implicitly be
* called from sampler() in state.c. This means we can't touch anything
* other than whatever happens to be the currently active texture, or we
* would risk marking already applied sampler states dirty again. */
active_sampler = context->rev_tex_unit_map[context->active_texture];
if (active_sampler != WINED3D_UNMAPPED_STAGE)
context_invalidate_state(context, STATE_SAMPLER(active_sampler));
wined3d_texture_bind(surface->container, context, srgb);
}
static void surface_force_reload(struct wined3d_surface *surface) static void surface_force_reload(struct wined3d_surface *surface)
{ {
surface->flags &= ~(SFLAG_ALLOCATED | SFLAG_SRGBALLOCATED); surface->flags &= ~(SFLAG_ALLOCATED | SFLAG_SRGBALLOCATED);
@ -628,13 +606,13 @@ static void surface_release_client_storage(struct wined3d_surface *surface)
if (surface->container->texture_rgb.name) if (surface->container->texture_rgb.name)
{ {
surface_bind_and_dirtify(surface, context, FALSE); wined3d_texture_bind_and_dirtify(surface->container, context, FALSE);
gl_info->gl_ops.gl.p_glTexImage2D(surface->texture_target, surface->texture_level, gl_info->gl_ops.gl.p_glTexImage2D(surface->texture_target, surface->texture_level,
GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
} }
if (surface->container->texture_srgb.name) if (surface->container->texture_srgb.name)
{ {
surface_bind_and_dirtify(surface, context, TRUE); wined3d_texture_bind_and_dirtify(surface->container, context, TRUE);
gl_info->gl_ops.gl.p_glTexImage2D(surface->texture_target, surface->texture_level, gl_info->gl_ops.gl.p_glTexImage2D(surface->texture_target, surface->texture_level,
GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
} }
@ -3746,7 +3724,7 @@ void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb)
device_invalidate_state(device, STATE_FRAMEBUFFER); device_invalidate_state(device, STATE_FRAMEBUFFER);
surface_prepare_texture(surface, context, srgb); surface_prepare_texture(surface, context, srgb);
surface_bind_and_dirtify(surface, context, srgb); wined3d_texture_bind_and_dirtify(surface->container, context, srgb);
TRACE("Reading back offscreen render target %p.\n", surface); TRACE("Reading back offscreen render target %p.\n", surface);
@ -3778,7 +3756,7 @@ static void surface_prepare_texture_internal(struct wined3d_surface *surface,
surface->flags |= SFLAG_CONVERTED; surface->flags |= SFLAG_CONVERTED;
else surface->flags &= ~SFLAG_CONVERTED; else surface->flags &= ~SFLAG_CONVERTED;
surface_bind_and_dirtify(surface, context, srgb); wined3d_texture_bind_and_dirtify(surface->container, context, srgb);
surface_allocate_surface(surface, context->gl_info, &format, srgb); surface_allocate_surface(surface, context->gl_info, &format, srgb);
surface->flags |= alloc_flag; surface->flags |= alloc_flag;
} }
@ -5087,7 +5065,7 @@ static void surface_load_sysmem(struct wined3d_surface *surface,
/* TODO: Use already acquired context when possible. */ /* TODO: Use already acquired context when possible. */
context = context_acquire(device, NULL); context = context_acquire(device, NULL);
surface_bind_and_dirtify(surface, context, !(surface->flags & SFLAG_INTEXTURE)); wined3d_texture_bind_and_dirtify(surface->container, context, !(surface->flags & SFLAG_INTEXTURE));
surface_download_data(surface, gl_info); surface_download_data(surface, gl_info);
context_release(context); context_release(context);
@ -5214,7 +5192,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface,
context = context_acquire(device, NULL); context = context_acquire(device, NULL);
surface_prepare_texture(surface, context, srgb); surface_prepare_texture(surface, context, srgb);
surface_bind_and_dirtify(surface, context, srgb); wined3d_texture_bind_and_dirtify(surface->container, context, srgb);
if (surface->CKeyFlags & WINEDDSD_CKSRCBLT) if (surface->CKeyFlags & WINEDDSD_CKSRCBLT)
{ {

View File

@ -257,6 +257,28 @@ void wined3d_texture_bind(struct wined3d_texture *texture,
} }
} }
/* Context activation is done by the caller. */
void wined3d_texture_bind_and_dirtify(struct wined3d_texture *texture,
struct wined3d_context *context, BOOL srgb)
{
DWORD active_sampler;
/* We don't need a specific texture unit, but after binding the texture
* the current unit is dirty. Read the unit back instead of switching to
* 0, this avoids messing around with the state manager's GL states. The
* current texture unit should always be a valid one.
*
* To be more specific, this is tricky because we can implicitly be
* called from sampler() in state.c. This means we can't touch anything
* other than whatever happens to be the currently active texture, or we
* would risk marking already applied sampler states dirty again. */
active_sampler = context->rev_tex_unit_map[context->active_texture];
if (active_sampler != WINED3D_UNMAPPED_STAGE)
context_invalidate_state(context, STATE_SAMPLER(active_sampler));
wined3d_texture_bind(texture, context, srgb);
}
/* Context activation is done by the caller. */ /* Context activation is done by the caller. */
static void apply_wrap(const struct wined3d_gl_info *gl_info, GLenum target, static void apply_wrap(const struct wined3d_gl_info *gl_info, GLenum target,
enum wined3d_texture_address d3d_wrap, GLenum param, BOOL cond_np2) enum wined3d_texture_address d3d_wrap, GLenum param, BOOL cond_np2)

View File

@ -27,28 +27,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface); WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
WINE_DECLARE_DEBUG_CHANNEL(d3d_perf); WINE_DECLARE_DEBUG_CHANNEL(d3d_perf);
/* Context activation is done by the caller. */
static void volume_bind_and_dirtify(const struct wined3d_volume *volume,
struct wined3d_context *context, BOOL srgb)
{
DWORD active_sampler;
/* We don't need a specific texture unit, but after binding the texture the current unit is dirty.
* Read the unit back instead of switching to 0, this avoids messing around with the state manager's
* gl states. The current texture unit should always be a valid one.
*
* To be more specific, this is tricky because we can implicitly be called
* from sampler() in state.c. This means we can't touch anything other than
* whatever happens to be the currently active texture, or we would risk
* marking already applied sampler states dirty again. */
active_sampler = context->rev_tex_unit_map[context->active_texture];
if (active_sampler != WINED3D_UNMAPPED_STAGE)
context_invalidate_state(context, STATE_SAMPLER(active_sampler));
wined3d_texture_bind(volume->container, context, srgb);
}
void volume_set_container(struct wined3d_volume *volume, struct wined3d_texture *container) void volume_set_container(struct wined3d_volume *volume, struct wined3d_texture *container)
{ {
TRACE("volume %p, container %p.\n", volume, container); TRACE("volume %p, container %p.\n", volume, container);
@ -274,9 +252,9 @@ static void wined3d_volume_srgb_transfer(struct wined3d_volume *volume,
if (!data.addr) if (!data.addr)
return; return;
volume_bind_and_dirtify(volume, context, !dest_is_srgb); wined3d_texture_bind_and_dirtify(volume->container, context, !dest_is_srgb);
wined3d_volume_download_data(volume, context, &data); wined3d_volume_download_data(volume, context, &data);
volume_bind_and_dirtify(volume, context, dest_is_srgb); wined3d_texture_bind_and_dirtify(volume->container, context, dest_is_srgb);
wined3d_volume_upload_data(volume, context, &data); wined3d_volume_upload_data(volume, context, &data);
HeapFree(GetProcessHeap(), 0, data.addr); HeapFree(GetProcessHeap(), 0, data.addr);
@ -376,9 +354,9 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume,
struct wined3d_bo_address data = {0, volume->resource.heap_memory}; struct wined3d_bo_address data = {0, volume->resource.heap_memory};
if (volume->locations & WINED3D_LOCATION_TEXTURE_RGB) if (volume->locations & WINED3D_LOCATION_TEXTURE_RGB)
volume_bind_and_dirtify(volume, context, FALSE); wined3d_texture_bind_and_dirtify(volume->container, context, FALSE);
else else
volume_bind_and_dirtify(volume, context, TRUE); wined3d_texture_bind_and_dirtify(volume->container, context, TRUE);
volume->download_count++; volume->download_count++;
wined3d_volume_download_data(volume, context, &data); wined3d_volume_download_data(volume, context, &data);
@ -406,9 +384,9 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume,
struct wined3d_bo_address data = {volume->pbo, NULL}; struct wined3d_bo_address data = {volume->pbo, NULL};
if (volume->locations & WINED3D_LOCATION_TEXTURE_RGB) if (volume->locations & WINED3D_LOCATION_TEXTURE_RGB)
volume_bind_and_dirtify(volume, context, FALSE); wined3d_texture_bind_and_dirtify(volume->container, context, FALSE);
else else
volume_bind_and_dirtify(volume, context, TRUE); wined3d_texture_bind_and_dirtify(volume->container, context, TRUE);
wined3d_volume_download_data(volume, context, &data); wined3d_volume_download_data(volume, context, &data);
} }
@ -430,7 +408,7 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume,
/* Context activation is done by the caller. */ /* Context activation is done by the caller. */
void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context *context, BOOL srgb_mode) void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context *context, BOOL srgb_mode)
{ {
volume_bind_and_dirtify(volume, context, srgb_mode); wined3d_texture_bind_and_dirtify(volume->container, context, srgb_mode);
if (srgb_mode) if (srgb_mode)
{ {

View File

@ -2105,6 +2105,8 @@ void wined3d_texture_apply_state_changes(struct wined3d_texture *texture,
const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
void wined3d_texture_bind(struct wined3d_texture *texture, void wined3d_texture_bind(struct wined3d_texture *texture,
struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN; struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
void wined3d_texture_bind_and_dirtify(struct wined3d_texture *texture,
struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
void wined3d_texture_set_dirty(struct wined3d_texture *texture) DECLSPEC_HIDDEN; void wined3d_texture_set_dirty(struct wined3d_texture *texture) DECLSPEC_HIDDEN;
#define WINED3D_VFLAG_ALLOCATED 0x00000001 #define WINED3D_VFLAG_ALLOCATED 0x00000001