From: Matteo Bruni mbruni@codeweavers.com
Fixes: c065b4fe0b3622e0c737a4c7c1c514273ad2d8a7 --- dlls/wined3d/arb_program_shader.c | 12 ++++++++++++ dlls/wined3d/cs.c | 7 +++++-- dlls/wined3d/wined3d_private.h | 1 + 3 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 272a25902d9..59c4c6f2350 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -678,6 +678,8 @@ static void shader_arb_load_constants_internal(struct shader_arb_priv *priv, str const struct arb_vs_compiled_shader *gl_shader = priv->compiled_vprog;
/* Load DirectX 9 float constants for vertex shader */ + if (!wined3d_cs_prepare_push_constant_buffer(context_gl->c.device, WINED3D_PUSH_CONSTANTS_VS_F)) + return; priv->highest_dirty_vs_const = shader_arb_load_constants_f(vshader, gl_info, GL_VERTEX_PROGRAM_ARB, priv->highest_dirty_vs_const, wined3d_buffer_load_sysmem(device->push_constants[WINED3D_PUSH_CONSTANTS_VS_F], &context_gl->c), @@ -692,6 +694,8 @@ static void shader_arb_load_constants_internal(struct shader_arb_priv *priv, str UINT rt_height = state->fb.render_targets[0]->height;
/* Load DirectX 9 float constants for pixel shader */ + if (!wined3d_cs_prepare_push_constant_buffer(context_gl->c.device, WINED3D_PUSH_CONSTANTS_PS_F)) + return; priv->highest_dirty_ps_const = shader_arb_load_constants_f(pshader, gl_info, GL_FRAGMENT_PROGRAM_ARB, priv->highest_dirty_ps_const, wined3d_buffer_load_sysmem(device->push_constants[WINED3D_PUSH_CONSTANTS_PS_F], &context_gl->c), @@ -4433,7 +4437,11 @@ static void find_arb_ps_compile_args(const struct wined3d_state *state, int i; WORD int_skip;
+ if (!wined3d_cs_prepare_push_constant_buffer(context_gl->c.device, WINED3D_PUSH_CONSTANTS_PS_B)) + return; bool_consts = wined3d_buffer_load_sysmem(device->push_constants[WINED3D_PUSH_CONSTANTS_PS_B], &context_gl->c); + if (!wined3d_cs_prepare_push_constant_buffer(context_gl->c.device, WINED3D_PUSH_CONSTANTS_PS_I)) + return; int_consts = wined3d_buffer_load_sysmem(device->push_constants[WINED3D_PUSH_CONSTANTS_PS_I], &context_gl->c);
find_ps_compile_args(state, shader, context_gl->c.stream_info.position_transformed, &args->super, &context_gl->c); @@ -4496,7 +4504,11 @@ static void find_arb_vs_compile_args(const struct wined3d_state *state, int i; WORD int_skip;
+ if (!wined3d_cs_prepare_push_constant_buffer(context_gl->c.device, WINED3D_PUSH_CONSTANTS_VS_B)) + return; bool_consts = wined3d_buffer_load_sysmem(device->push_constants[WINED3D_PUSH_CONSTANTS_VS_B], &context_gl->c); + if (!wined3d_cs_prepare_push_constant_buffer(context_gl->c.device, WINED3D_PUSH_CONSTANTS_VS_I)) + return; int_consts = wined3d_buffer_load_sysmem(device->push_constants[WINED3D_PUSH_CONSTANTS_VS_I], &context_gl->c);
find_vs_compile_args(state, shader, &args->super, &context_gl->c); diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index aa011ea7714..ad923e3b827 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -2129,7 +2129,7 @@ wined3d_cs_push_constant_info[] = [WINED3D_PUSH_CONSTANTS_PS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_CONST_PS_B}, };
-static bool prepare_push_constant_buffer(struct wined3d_device *device, enum wined3d_push_constants type) +bool wined3d_cs_prepare_push_constant_buffer(struct wined3d_device *device, enum wined3d_push_constants type) { const struct push_constant_info *info = &wined3d_cs_push_constant_info[type]; HRESULT hr; @@ -2139,8 +2139,11 @@ static bool prepare_push_constant_buffer(struct wined3d_device *device, enum win .byte_width = info->max_count * info->size, .bind_flags = 0, .access = WINED3D_RESOURCE_ACCESS_CPU | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W, + .usage = WINED3DUSAGE_PRIVATE, };
+ TRACE("device %p, type %#x.\n", device, type); + if (!device->push_constants[type] && FAILED(hr = wined3d_buffer_create(device, &desc, NULL, NULL, &wined3d_null_parent_ops, &device->push_constants[type]))) { @@ -2193,7 +2196,7 @@ void wined3d_device_context_push_constants(struct wined3d_device_context *contex unsigned int byte_size = count * info->size; struct wined3d_box box;
- if (!prepare_push_constant_buffer(context->device, type)) + if (!wined3d_cs_prepare_push_constant_buffer(context->device, type)) return;
wined3d_box_set(&box, byte_offset, 0, byte_offset + byte_size, 1, 0, 1); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 0b72bf298e2..e6253a41b39 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3656,6 +3656,7 @@ void wined3d_cs_init_object(struct wined3d_cs *cs, void (*callback)(void *object), void *object) DECLSPEC_HIDDEN; void wined3d_cs_map_bo_address(struct wined3d_cs *cs, struct wined3d_bo_address *addr, size_t size, unsigned int flags) DECLSPEC_HIDDEN; +bool wined3d_cs_prepare_push_constant_buffer(struct wined3d_device *device, enum wined3d_push_constants type); void wined3d_device_context_set_depth_bounds(struct wined3d_device_context *context, bool enable, float min_depth, float max_depth);