wined3d: Merge surface_bind_and_dirtify() and volume_bind_and_dirtify() into wined3d_texture_bind_and_dirtify().
This commit is contained in:
parent
2e63e8f9cc
commit
f91eab6d3e
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue