[PATCH 1/5] wined3d: Pass the context to the internal texture_preload function
Stefan Dösinger
stefan at codeweavers.com
Mon Sep 16 05:43:16 CDT 2013
---
dlls/wined3d/context.c | 2 +-
dlls/wined3d/device.c | 20 +++++++++++++-------
dlls/wined3d/drawprim.c | 6 ------
dlls/wined3d/surface.c | 14 ++++++--------
dlls/wined3d/texture.c | 34 ++++++++++++----------------------
dlls/wined3d/wined3d_private.h | 8 ++++----
6 files changed, 36 insertions(+), 48 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index af3addc..43befb8 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -2577,7 +2577,7 @@ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_de
* result in changes to the current FBO, due to using e.g. FBO blits for
* updating a resource location. */
device_update_tex_unit_map(device);
- device_preload_textures(device);
+ device_preload_textures(device, context);
if (isStateDirty(context, STATE_VDECL) || isStateDirty(context, STATE_STREAMSRC))
context_update_stream_info(context, state);
if (state->index_buffer)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 627f0eb..d9f7eb1 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -134,17 +134,20 @@ static enum wined3d_primitive_type d3d_primitive_type_from_gl(GLenum primitive_t
}
}
-static void device_preload_texture(const struct wined3d_state *state, unsigned int idx)
+/* Context activation is done by the caller. */
+static void device_preload_texture(const struct wined3d_state *state,
+ struct wined3d_context *context, unsigned int idx)
{
struct wined3d_texture *texture;
enum WINED3DSRGB srgb;
if (!(texture = state->textures[idx])) return;
srgb = state->sampler_states[idx][WINED3D_SAMP_SRGB_TEXTURE] ? SRGB_SRGB : SRGB_RGB;
- texture->texture_ops->texture_preload(texture, srgb);
+ texture->texture_ops->texture_preload(texture, context, srgb);
}
-void device_preload_textures(const struct wined3d_device *device)
+/* Context activation is done by the caller. */
+void device_preload_textures(const struct wined3d_device *device, struct wined3d_context *context)
{
const struct wined3d_state *state = &device->state;
unsigned int i;
@@ -154,7 +157,7 @@ void device_preload_textures(const struct wined3d_device *device)
for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i)
{
if (state->vertex_shader->reg_maps.sampler_type[i])
- device_preload_texture(state, MAX_FRAGMENT_SAMPLERS + i);
+ device_preload_texture(state, context, MAX_FRAGMENT_SAMPLERS + i);
}
}
@@ -163,7 +166,7 @@ void device_preload_textures(const struct wined3d_device *device)
for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i)
{
if (state->pixel_shader->reg_maps.sampler_type[i])
- device_preload_texture(state, i);
+ device_preload_texture(state, context, i);
}
}
else
@@ -173,7 +176,7 @@ void device_preload_textures(const struct wined3d_device *device)
for (i = 0; ffu_map; ffu_map >>= 1, ++i)
{
if (ffu_map & 1)
- device_preload_texture(state, i);
+ device_preload_texture(state, context, i);
}
}
}
@@ -3909,6 +3912,7 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device,
enum wined3d_resource_type type;
unsigned int level_count, i;
HRESULT hr;
+ struct wined3d_context *context;
TRACE("device %p, src_texture %p, dst_texture %p.\n", device, src_texture, dst_texture);
@@ -3947,7 +3951,9 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device,
}
/* Make sure that the destination texture is loaded. */
- dst_texture->texture_ops->texture_preload(dst_texture, SRGB_RGB);
+ context = context_acquire(device, NULL);
+ dst_texture->texture_ops->texture_preload(dst_texture, context, SRGB_RGB);
+ context_release(context);
/* Update every surface level of the texture. */
switch (type)
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 42f6cb7..0b4b3f7 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -613,9 +613,6 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co
}
}
- /* Signals other modules that a drawing is in progress and the stateblock finalized */
- device->isInDraw = TRUE;
-
context = context_acquire(device, device->fb.render_targets[0]);
if (!context->valid)
{
@@ -780,7 +777,4 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co
context_release(context);
TRACE("Done all gl drawing\n");
-
- /* Control goes back to the device, stateblock values may change again */
- device->isInDraw = FALSE;
}
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index b64c8e9..bf25828 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -3705,25 +3705,24 @@ HRESULT CDECL wined3d_surface_flip(struct wined3d_surface *surface, struct wined
void surface_internal_preload(struct wined3d_surface *surface, enum WINED3DSRGB srgb)
{
struct wined3d_device *device = surface->resource.device;
+ struct wined3d_context *context;
TRACE("iface %p, srgb %#x.\n", surface, srgb);
+ /* TODO: Use already acquired context when possible. */
+ context = context_acquire(device, NULL);
+
if (surface->container)
{
struct wined3d_texture *texture = surface->container;
TRACE("Passing to container (%p).\n", texture);
- texture->texture_ops->texture_preload(texture, srgb);
+ texture->texture_ops->texture_preload(texture, context, srgb);
}
else
{
- struct wined3d_context *context;
-
TRACE("(%p) : About to load surface\n", surface);
- /* TODO: Use already acquired context when possible. */
- context = context_acquire(device, NULL);
-
surface_load(surface, srgb == SRGB_SRGB);
if (surface->resource.pool == WINED3D_POOL_DEFAULT)
@@ -3733,9 +3732,8 @@ void surface_internal_preload(struct wined3d_surface *surface, enum WINED3DSRGB
tmp = 0.9f;
context->gl_info->gl_ops.gl.p_glPrioritizeTextures(1, &surface->texture_name, &tmp);
}
-
- context_release(context);
}
+ context_release(context);
}
/* Read the framebuffer back into the surface */
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 5d24ada..56d13f6 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -477,7 +477,10 @@ DWORD CDECL wined3d_texture_get_priority(const struct wined3d_texture *texture)
void CDECL wined3d_texture_preload(struct wined3d_texture *texture)
{
- texture->texture_ops->texture_preload(texture, SRGB_ANY);
+ struct wined3d_context *context;
+ context = context_acquire(texture->resource.device, NULL);
+ texture->texture_ops->texture_preload(texture, context, SRGB_ANY);
+ context_release(context);
}
void * CDECL wined3d_texture_get_parent(const struct wined3d_texture *texture)
@@ -668,12 +671,12 @@ static BOOL texture_srgb_mode(const struct wined3d_texture *texture, enum WINED3
}
}
-static void texture2d_preload(struct wined3d_texture *texture, enum WINED3DSRGB srgb)
+/* Context activation is done by the caller */
+static void texture2d_preload(struct wined3d_texture *texture,
+ struct wined3d_context *context, enum WINED3DSRGB srgb)
{
UINT sub_count = texture->level_count * texture->layer_count;
- struct wined3d_device *device = texture->resource.device;
- const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- struct wined3d_context *context = NULL;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
BOOL srgb_mode;
DWORD flag;
UINT i;
@@ -692,21 +695,12 @@ static void texture2d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
return;
}
- if (!device->isInDraw)
- {
- /* No danger of recursive calls, context_acquire() sets isInDraw to TRUE
- * when loading offscreen render targets into the texture. */
- context = context_acquire(device, NULL);
- }
-
/* Reload the surfaces if the texture is marked dirty. */
for (i = 0; i < sub_count; ++i)
{
surface_load(surface_from_resource(texture->sub_resources[i]), srgb_mode);
}
texture->flags |= flag;
-
- if (context) context_release(context);
}
static void texture2d_sub_resource_add_dirty_region(struct wined3d_resource *sub_resource,
@@ -1050,12 +1044,12 @@ static HRESULT texture3d_bind(struct wined3d_texture *texture,
return wined3d_texture_bind(texture, context, srgb, &dummy);
}
-static void texture3d_preload(struct wined3d_texture *texture, enum WINED3DSRGB srgb)
+/* Context activation is done by the caller. */
+static void texture3d_preload(struct wined3d_texture *texture,
+ struct wined3d_context *context, enum WINED3DSRGB srgb)
{
UINT sub_count = texture->level_count * texture->layer_count;
- struct wined3d_device *device = texture->resource.device;
- const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- struct wined3d_context *context = NULL;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
BOOL srgb_mode;
DWORD flag;
UINT i;
@@ -1074,16 +1068,12 @@ static void texture3d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
return;
}
- context = context_acquire(device, NULL);
-
/* Reload the surfaces if the texture is marked dirty. */
for (i = 0; i < sub_count; ++i)
{
wined3d_volume_load(volume_from_resource(texture->sub_resources[i]), context, srgb_mode);
}
texture->flags |= flag;
-
- context_release(context);
}
static void texture3d_sub_resource_add_dirty_region(struct wined3d_resource *sub_resource,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index a30db57..2fd092a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1883,13 +1883,12 @@ struct wined3d_device
UINT instance_count;
WORD vertexBlendUsed : 1; /* To avoid needless setting of the blend matrices */
- WORD isInDraw : 1;
WORD bCursorVisible : 1;
WORD d3d_initialized : 1;
WORD inScene : 1; /* A flag to check for proper BeginScene / EndScene call pairs */
WORD softwareVertexProcessing : 1; /* process vertex shaders using software or hardware */
WORD filter_messages : 1;
- WORD padding : 9;
+ WORD padding : 10;
BYTE fixed_function_usage_map; /* MAX_TEXTURES, 8 */
@@ -1952,7 +1951,7 @@ void device_context_remove(struct wined3d_device *device, struct wined3d_context
HRESULT device_init(struct wined3d_device *device, struct wined3d *wined3d,
UINT adapter_idx, enum wined3d_device_type device_type, HWND focus_window, DWORD flags,
BYTE surface_alignment, struct wined3d_device_parent *device_parent) DECLSPEC_HIDDEN;
-void device_preload_textures(const struct wined3d_device *device) DECLSPEC_HIDDEN;
+void device_preload_textures(const struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN;
LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL unicode,
UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) DECLSPEC_HIDDEN;
void device_resource_add(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
@@ -2065,7 +2064,8 @@ struct wined3d_texture_ops
{
HRESULT (*texture_bind)(struct wined3d_texture *texture,
struct wined3d_context *context, BOOL srgb);
- void (*texture_preload)(struct wined3d_texture *texture, enum WINED3DSRGB srgb);
+ void (*texture_preload)(struct wined3d_texture *texture, struct wined3d_context *context,
+ enum WINED3DSRGB srgb);
void (*texture_sub_resource_add_dirty_region)(struct wined3d_resource *sub_resource,
const struct wined3d_box *dirty_region);
void (*texture_sub_resource_cleanup)(struct wined3d_resource *sub_resource);
--
1.8.1.5
More information about the wine-patches
mailing list