Module: wine Branch: master Commit: 5a093509d030d89f7a2980bb00bd02203550dc72 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5a093509d030d89f7a2980bb00...
Author: Józef Kucia jkucia@codeweavers.com Date: Mon Feb 6 14:12:15 2017 +0100
wined3d: Group compute states together.
Signed-off-by: Józef Kucia jkucia@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wined3d/context.c | 4 ++-- dlls/wined3d/state.c | 14 ++++++++++++-- dlls/wined3d/utils.c | 8 ++++++-- dlls/wined3d/wined3d_private.h | 42 +++++++++++++++++++++++++++++++----------- 4 files changed, 51 insertions(+), 17 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 5ae1bdc..e8cc3fc 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -1407,7 +1407,7 @@ static void context_enter(struct wined3d_context *context)
void context_invalidate_compute_state(struct wined3d_context *context, DWORD state_id) { - DWORD representative = context->state_table[state_id].representative; + DWORD representative = context->state_table[state_id].representative - STATE_COMPUTE_OFFSET; unsigned int index, shift;
index = representative / (sizeof(*context->dirty_compute_states) * CHAR_BIT); @@ -3585,7 +3585,7 @@ void context_apply_compute_state(struct wined3d_context *context,
context_load_shader_resources(context, state, 1u << WINED3D_SHADER_TYPE_COMPUTE);
- for (i = 0, state_id = 0; i < ARRAY_SIZE(context->dirty_compute_states); ++i) + for (i = 0, state_id = STATE_COMPUTE_OFFSET; i < ARRAY_SIZE(context->dirty_compute_states); ++i) { for (j = 0; j < sizeof(*context->dirty_compute_states) * CHAR_BIT; ++j, ++state_id) { diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index e469414..540a1b3 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -3731,6 +3731,11 @@ void apply_pixelshader(struct wined3d_context *context, const struct wined3d_sta context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_PIXEL; }
+static void state_compute_shader(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) +{ + context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_COMPUTE; +} + static void state_shader(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { enum wined3d_shader_type shader_type = state_id - STATE_SHADER(0); @@ -4942,13 +4947,18 @@ void state_srgbwrite(struct wined3d_context *context, const struct wined3d_state
static void state_cb(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { - enum wined3d_shader_type shader_type = state_id - STATE_CONSTANT_BUFFER(0); const struct wined3d_gl_info *gl_info = context->gl_info; + enum wined3d_shader_type shader_type; struct wined3d_buffer *buffer; unsigned int i, base, count;
TRACE("context %p, state %p, state_id %#x.\n", context, state, state_id);
+ if (STATE_IS_GRAPHICS_CONSTANT_BUFFER(state_id)) + shader_type = state_id - STATE_GRAPHICS_CONSTANT_BUFFER(0); + else + shader_type = WINED3D_SHADER_TYPE_COMPUTE; + wined3d_gl_limits_get_uniform_block_range(&gl_info->limits, shader_type, &base, &count); for (i = 0; i < count; ++i) { @@ -5188,7 +5198,7 @@ const struct StateEntryTemplate misc_state_template[] = { STATE_FRAMEBUFFER, { STATE_FRAMEBUFFER, context_state_fb }, WINED3D_GL_EXT_NONE }, { STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), { STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), context_state_drawbuf},WINED3D_GL_EXT_NONE }, { STATE_SHADER(WINED3D_SHADER_TYPE_GEOMETRY), { STATE_SHADER(WINED3D_SHADER_TYPE_GEOMETRY), state_shader }, WINED3D_GL_EXT_NONE }, - { STATE_SHADER(WINED3D_SHADER_TYPE_COMPUTE), { STATE_SHADER(WINED3D_SHADER_TYPE_COMPUTE), state_shader }, WINED3D_GL_EXT_NONE }, + { STATE_SHADER(WINED3D_SHADER_TYPE_COMPUTE), { STATE_SHADER(WINED3D_SHADER_TYPE_COMPUTE), state_compute_shader}, WINED3D_GL_EXT_NONE }, {0 /* Terminate */, { 0, 0 }, WINED3D_GL_EXT_NONE }, };
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index c40a339..30a80e5 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -4377,9 +4377,13 @@ const char *debug_d3dstate(DWORD state) } if (STATE_IS_SAMPLER(state)) return wine_dbg_sprintf("STATE_SAMPLER(%#x)", state - STATE_SAMPLER(0)); - if (STATE_IS_SHADER(state)) + if (STATE_IS_COMPUTE_SHADER(state)) + return wine_dbg_sprintf("STATE_SHADER(%s)", debug_shader_type(WINED3D_SHADER_TYPE_COMPUTE)); + if (STATE_IS_GRAPHICS_SHADER(state)) return wine_dbg_sprintf("STATE_SHADER(%s)", debug_shader_type(state - STATE_SHADER(0))); - if (STATE_IS_CONSTANT_BUFFER(state)) + if (STATE_IS_COMPUTE_CONSTANT_BUFFER(state)) + return wine_dbg_sprintf("STATE_CONSTANT_BUFFER(%s)", debug_shader_type(WINED3D_SHADER_TYPE_COMPUTE)); + if (STATE_IS_GRAPHICS_CONSTANT_BUFFER(state)) return wine_dbg_sprintf("STATE_CONSTANT_BUFFER(%s)", debug_shader_type(state - STATE_CONSTANT_BUFFER(0))); if (STATE_IS_SHADER_RESOURCE_BINDING(state)) return "STATE_SHADER_RESOURCE_BINDING"; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index ead8847..ca992b9 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -806,7 +806,9 @@ enum wined3d_shader_type WINED3D_SHADER_TYPE_GEOMETRY, WINED3D_SHADER_TYPE_HULL, WINED3D_SHADER_TYPE_DOMAIN, - WINED3D_SHADER_TYPE_COMPUTE, + WINED3D_SHADER_TYPE_GRAPHICS_COUNT, + + WINED3D_SHADER_TYPE_COMPUTE = WINED3D_SHADER_TYPE_GRAPHICS_COUNT, WINED3D_SHADER_TYPE_COUNT, };
@@ -1360,20 +1362,25 @@ DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN; #define STATE_RENDER(a) (a) #define STATE_IS_RENDER(a) ((a) >= STATE_RENDER(1) && (a) <= STATE_RENDER(WINEHIGHEST_RENDER_STATE))
-#define STATE_TEXTURESTAGE(stage, num) (STATE_RENDER(WINEHIGHEST_RENDER_STATE) + 1 + (stage) * (WINED3D_HIGHEST_TEXTURE_STATE + 1) + (num)) -#define STATE_IS_TEXTURESTAGE(a) ((a) >= STATE_TEXTURESTAGE(0, 1) && (a) <= STATE_TEXTURESTAGE(MAX_TEXTURES - 1, WINED3D_HIGHEST_TEXTURE_STATE)) +#define STATE_TEXTURESTAGE(stage, num) \ + (STATE_RENDER(WINEHIGHEST_RENDER_STATE) + 1 + (stage) * (WINED3D_HIGHEST_TEXTURE_STATE + 1) + (num)) +#define STATE_IS_TEXTURESTAGE(a) \ + ((a) >= STATE_TEXTURESTAGE(0, 1) && (a) <= STATE_TEXTURESTAGE(MAX_TEXTURES - 1, WINED3D_HIGHEST_TEXTURE_STATE))
/* + 1 because samplers start with 0 */ #define STATE_SAMPLER(num) (STATE_TEXTURESTAGE(MAX_TEXTURES - 1, WINED3D_HIGHEST_TEXTURE_STATE) + 1 + (num)) #define STATE_IS_SAMPLER(num) ((num) >= STATE_SAMPLER(0) && (num) <= STATE_SAMPLER(MAX_COMBINED_SAMPLERS - 1))
-#define STATE_SHADER(a) (STATE_SAMPLER(MAX_COMBINED_SAMPLERS) + (a)) -#define STATE_IS_SHADER(a) ((a) >= STATE_SHADER(0) && (a) < STATE_SHADER(WINED3D_SHADER_TYPE_COUNT)) +#define STATE_GRAPHICS_SHADER(a) (STATE_SAMPLER(MAX_COMBINED_SAMPLERS) + (a)) +#define STATE_IS_GRAPHICS_SHADER(a) \ + ((a) >= STATE_GRAPHICS_SHADER(0) && (a) < STATE_GRAPHICS_SHADER(WINED3D_SHADER_TYPE_GRAPHICS_COUNT))
-#define STATE_CONSTANT_BUFFER(a) (STATE_SHADER(WINED3D_SHADER_TYPE_COUNT) + (a)) -#define STATE_IS_CONSTANT_BUFFER(a) ((a) >= STATE_CONSTANT_BUFFER(0) && (a) < STATE_CONSTANT_BUFFER(WINED3D_SHADER_TYPE_COUNT)) +#define STATE_GRAPHICS_CONSTANT_BUFFER(a) (STATE_GRAPHICS_SHADER(WINED3D_SHADER_TYPE_GRAPHICS_COUNT) + (a)) +#define STATE_IS_GRAPHICS_CONSTANT_BUFFER(a) \ + ((a) >= STATE_GRAPHICS_CONSTANT_BUFFER(0) \ + && (a) < STATE_GRAPHICS_CONSTANT_BUFFER(WINED3D_SHADER_TYPE_GRAPHICS_COUNT))
-#define STATE_SHADER_RESOURCE_BINDING (STATE_CONSTANT_BUFFER(WINED3D_SHADER_TYPE_COUNT)) +#define STATE_SHADER_RESOURCE_BINDING (STATE_GRAPHICS_CONSTANT_BUFFER(WINED3D_SHADER_TYPE_GRAPHICS_COUNT)) #define STATE_IS_SHADER_RESOURCE_BINDING(a) ((a) == STATE_SHADER_RESOURCE_BINDING)
#define STATE_UNORDERED_ACCESS_VIEW_BINDING (STATE_SHADER_RESOURCE_BINDING + 1) @@ -1425,9 +1432,22 @@ DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN; #define STATE_COLOR_KEY (STATE_POINT_ENABLE + 1) #define STATE_IS_COLOR_KEY(a) ((a) == STATE_COLOR_KEY)
-#define STATE_HIGHEST (STATE_COLOR_KEY) +#define STATE_COMPUTE_OFFSET (STATE_COLOR_KEY + 1) + +#define STATE_COMPUTE_SHADER (STATE_COMPUTE_OFFSET) +#define STATE_IS_COMPUTE_SHADER(a) ((a) == STATE_COMPUTE_SHADER) + +#define STATE_COMPUTE_CONSTANT_BUFFER (STATE_COMPUTE_SHADER + 1) +#define STATE_IS_COMPUTE_CONSTANT_BUFFER(a) ((a) == STATE_COMPUTE_CONSTANT_BUFFER) + +#define STATE_COMPUTE_HIGHEST (STATE_COMPUTE_CONSTANT_BUFFER) +#define STATE_HIGHEST (STATE_COMPUTE_CONSTANT_BUFFER) + +#define STATE_COMPUTE_COUNT (STATE_COMPUTE_HIGHEST - STATE_COMPUTE_OFFSET + 1)
-#define STATE_COMPUTE_HIGHEST (STATE_CONSTANT_BUFFER(WINED3D_SHADER_TYPE_COMPUTE)) +#define STATE_SHADER(a) ((a) != WINED3D_SHADER_TYPE_COMPUTE ? STATE_GRAPHICS_SHADER(a) : STATE_COMPUTE_SHADER) +#define STATE_CONSTANT_BUFFER(a) \ + ((a) != WINED3D_SHADER_TYPE_COMPUTE ? STATE_GRAPHICS_CONSTANT_BUFFER(a) : STATE_COMPUTE_CONSTANT_BUFFER)
enum fogsource { FOGSOURCE_FFP, @@ -1532,7 +1552,7 @@ struct wined3d_context DWORD dirtyArray[STATE_HIGHEST + 1]; /* Won't get bigger than that, a state is never marked dirty 2 times */ DWORD numDirtyEntries; DWORD isStateDirty[STATE_HIGHEST / (sizeof(DWORD) * CHAR_BIT) + 1]; /* Bitmap to find out quickly if a state is dirty */ - unsigned int dirty_compute_states[STATE_COMPUTE_HIGHEST / (sizeof(unsigned int) * CHAR_BIT) + 1]; + unsigned int dirty_compute_states[STATE_COMPUTE_COUNT / (sizeof(unsigned int) * CHAR_BIT) + 1];
struct wined3d_device *device; struct wined3d_swapchain *swapchain;