Module: wine Branch: master Commit: f0983f865f418055ead1b9cd9ac4d4a96b6c61f4 URL: https://gitlab.winehq.org/wine/wine/-/commit/f0983f865f418055ead1b9cd9ac4d4a...
Author: Elizabeth Figura zfigura@codeweavers.com Date: Wed Nov 15 10:31:56 2023 -0600
wined3d: Pass the constant update mask to wined3d_device_context_push_constants().
We will want to pass multiple constants in the same buffer (e.g. FFP_MODELVIEW, FFP_PROJ) covered by different update flags.
---
dlls/wined3d/cs.c | 23 ++++++++++++----------- dlls/wined3d/stateblock.c | 18 ++++++++++++------ dlls/wined3d/wined3d_private.h | 2 +- 3 files changed, 25 insertions(+), 18 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 958c23d76a7..3cf0cb6c5b1 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -414,6 +414,7 @@ struct wined3d_cs_push_constants enum wined3d_push_constants type; unsigned int start_idx; unsigned int count; + uint32_t update_mask; };
struct wined3d_cs_reset_state @@ -2140,18 +2141,17 @@ static const struct push_constant_info { size_t size; unsigned int max_count; - DWORD mask; enum wined3d_shader_type shader_type; enum vkd3d_shader_d3dbc_constant_register shader_binding; } wined3d_cs_push_constant_info[] = { - [WINED3D_PUSH_CONSTANTS_VS_F] = {sizeof(struct wined3d_vec4), WINED3D_MAX_VS_CONSTS_F, WINED3D_SHADER_CONST_VS_F, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_PS_F] = {sizeof(struct wined3d_vec4), WINED3D_MAX_PS_CONSTS_F, WINED3D_SHADER_CONST_PS_F, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_VS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_CONST_VS_I, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_PS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_CONST_PS_I, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_VS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_CONST_VS_B, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_PS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_CONST_PS_B, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_VS_F] = {sizeof(struct wined3d_vec4), WINED3D_MAX_VS_CONSTS_F, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_PS_F] = {sizeof(struct wined3d_vec4), WINED3D_MAX_PS_CONSTS_F, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_VS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_PS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_VS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER}, + [WINED3D_PUSH_CONSTANTS_PS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER}, };
static bool prepare_push_constant_buffer(struct wined3d_device_context *context, enum wined3d_push_constants type) @@ -2206,11 +2206,11 @@ static void wined3d_cs_exec_push_constants(struct wined3d_cs *cs, const void *da device->shader_backend->shader_update_float_pixel_constants(device, op->start_idx, op->count);
for (i = 0, context_count = device->context_count; i < context_count; ++i) - device->contexts[i]->constant_update_mask |= wined3d_cs_push_constant_info[op->type].mask; + device->contexts[i]->constant_update_mask |= op->update_mask; }
static void wined3d_device_context_emit_push_constants(struct wined3d_device_context *context, - enum wined3d_push_constants type, unsigned int start_idx, unsigned int count) + enum wined3d_push_constants type, uint32_t update_mask, unsigned int start_idx, unsigned int count) { struct wined3d_cs *cs = wined3d_cs_from_context(context); struct wined3d_cs_push_constants *op; @@ -2218,6 +2218,7 @@ static void wined3d_device_context_emit_push_constants(struct wined3d_device_con op = wined3d_device_context_require_space(&cs->c, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); op->opcode = WINED3D_CS_OP_PUSH_CONSTANTS; op->type = type; + op->update_mask = update_mask; op->start_idx = start_idx; op->count = count;
@@ -2225,7 +2226,7 @@ static void wined3d_device_context_emit_push_constants(struct wined3d_device_con }
void wined3d_device_context_push_constants(struct wined3d_device_context *context, - enum wined3d_push_constants type, unsigned int start_idx, + enum wined3d_push_constants type, uint32_t update_mask, unsigned int start_idx, unsigned int count, const void *constants) { const struct push_constant_info *info = &wined3d_cs_push_constant_info[type]; @@ -2239,7 +2240,7 @@ void wined3d_device_context_push_constants(struct wined3d_device_context *contex wined3d_box_set(&box, byte_offset, 0, byte_offset + byte_size, 1, 0, 1); wined3d_device_context_emit_update_sub_resource(context, &context->device->push_constants[type]->resource, 0, &box, constants, byte_size, byte_size); - wined3d_device_context_emit_push_constants(context, type, start_idx, count); + wined3d_device_context_emit_push_constants(context, type, update_mask, start_idx, count); }
static void wined3d_cs_exec_reset_state(struct wined3d_cs *cs, const void *data) diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 217ebda743f..9d597e293a3 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -2287,7 +2287,8 @@ static void wined3d_device_set_vs_consts_b(struct wined3d_device *device, TRACE("Set BOOL constant %u to %#x.\n", start_idx + i, constants[i]); }
- wined3d_device_context_push_constants(&device->cs->c, WINED3D_PUSH_CONSTANTS_VS_B, start_idx, count, constants); + wined3d_device_context_push_constants(&device->cs->c, WINED3D_PUSH_CONSTANTS_VS_B, + WINED3D_SHADER_CONST_VS_B, start_idx, count, constants); }
static void wined3d_device_set_vs_consts_i(struct wined3d_device *device, @@ -2303,7 +2304,8 @@ static void wined3d_device_set_vs_consts_i(struct wined3d_device *device, TRACE("Set ivec4 constant %u to %s.\n", start_idx + i, debug_ivec4(&constants[i])); }
- wined3d_device_context_push_constants(&device->cs->c, WINED3D_PUSH_CONSTANTS_VS_I, start_idx, count, constants); + wined3d_device_context_push_constants(&device->cs->c, WINED3D_PUSH_CONSTANTS_VS_I, + WINED3D_SHADER_CONST_VS_I, start_idx, count, constants); }
static void wined3d_device_set_vs_consts_f(struct wined3d_device *device, @@ -2319,7 +2321,8 @@ static void wined3d_device_set_vs_consts_f(struct wined3d_device *device, TRACE("Set vec4 constant %u to %s.\n", start_idx + i, debug_vec4(&constants[i])); }
- wined3d_device_context_push_constants(&device->cs->c, WINED3D_PUSH_CONSTANTS_VS_F, start_idx, count, constants); + wined3d_device_context_push_constants(&device->cs->c, WINED3D_PUSH_CONSTANTS_VS_F, + WINED3D_SHADER_CONST_VS_F, start_idx, count, constants); }
static void wined3d_device_set_ps_consts_b(struct wined3d_device *device, @@ -2335,7 +2338,8 @@ static void wined3d_device_set_ps_consts_b(struct wined3d_device *device, TRACE("Set BOOL constant %u to %#x.\n", start_idx + i, constants[i]); }
- wined3d_device_context_push_constants(&device->cs->c, WINED3D_PUSH_CONSTANTS_PS_B, start_idx, count, constants); + wined3d_device_context_push_constants(&device->cs->c, WINED3D_PUSH_CONSTANTS_PS_B, + WINED3D_SHADER_CONST_PS_B, start_idx, count, constants); }
static void wined3d_device_set_ps_consts_i(struct wined3d_device *device, @@ -2351,7 +2355,8 @@ static void wined3d_device_set_ps_consts_i(struct wined3d_device *device, TRACE("Set ivec4 constant %u to %s.\n", start_idx + i, debug_ivec4(&constants[i])); }
- wined3d_device_context_push_constants(&device->cs->c, WINED3D_PUSH_CONSTANTS_PS_I, start_idx, count, constants); + wined3d_device_context_push_constants(&device->cs->c, WINED3D_PUSH_CONSTANTS_PS_I, + WINED3D_SHADER_CONST_PS_I, start_idx, count, constants); }
static void wined3d_device_set_ps_consts_f(struct wined3d_device *device, @@ -2367,7 +2372,8 @@ static void wined3d_device_set_ps_consts_f(struct wined3d_device *device, TRACE("Set vec4 constant %u to %s.\n", start_idx + i, debug_vec4(&constants[i])); }
- wined3d_device_context_push_constants(&device->cs->c, WINED3D_PUSH_CONSTANTS_PS_F, start_idx, count, constants); + wined3d_device_context_push_constants(&device->cs->c, WINED3D_PUSH_CONSTANTS_PS_F, + WINED3D_SHADER_CONST_PS_F, start_idx, count, constants); }
/* Note lights are real special cases. Although the device caps state only diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 8c36a033f6e..178911dd08f 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3705,7 +3705,7 @@ void wined3d_device_context_emit_update_sub_resource(struct wined3d_device_conte HRESULT wined3d_device_context_emit_unmap(struct wined3d_device_context *context, struct wined3d_resource *resource, unsigned int sub_resource_idx); void wined3d_device_context_push_constants(struct wined3d_device_context *context, - enum wined3d_push_constants type, unsigned int start_idx, + enum wined3d_push_constants type, uint32_t update_mask, unsigned int start_idx, unsigned int count, const void *constants);
static inline void wined3d_resource_reference(struct wined3d_resource *resource)