From f8a74410f16b8a01da329975d10b631cb2a928e5 Mon Sep 17 00:00:00 2001 From: Axel Davy Date: Sat, 3 Jan 2015 11:29:40 +0100 Subject: [PATCH] st/nine: Allocate vs constbuf buffer for indirect addressing once. When the shader does indirect addressing on the constants, we allocate a temporary constant buffer to which we copy the constants from the app given user constants and the constants filled in the shader. This patch makes this buffer be allocated once. Reviewed-by: Ilia Mirkin Signed-off-by: Axel Davy Signed-off-by: Tiziano Bacocco Cc: "10.4" --- src/gallium/state_trackers/nine/device9.c | 5 ++++- src/gallium/state_trackers/nine/nine_state.c | 5 +---- src/gallium/state_trackers/nine/nine_state.h | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c index dae7bd45767..ef3d2b0be58 100644 --- a/src/gallium/state_trackers/nine/device9.c +++ b/src/gallium/state_trackers/nine/device9.c @@ -267,7 +267,9 @@ NineDevice9_ctor( struct NineDevice9 *This, /* Include space for I,B constants for user constbuf. */ This->state.vs_const_f = CALLOC(This->vs_const_size, 1); This->state.ps_const_f = CALLOC(This->ps_const_size, 1); - if (!This->state.vs_const_f || !This->state.ps_const_f) + This->state.vs_lconstf_temp = CALLOC(This->vs_const_size,1); + if (!This->state.vs_const_f || !This->state.ps_const_f || + !This->state.vs_lconstf_temp) return E_OUTOFMEMORY; if (strstr(pScreen->get_name(pScreen), "AMD") || @@ -347,6 +349,7 @@ NineDevice9_dtor( struct NineDevice9 *This ) pipe_resource_reference(&This->constbuf_ps, NULL); FREE(This->state.vs_const_f); FREE(This->state.ps_const_f); + FREE(This->state.vs_lconstf_temp); if (This->swapchains) { for (i = 0; i < This->nswapchains; ++i) diff --git a/src/gallium/state_trackers/nine/nine_state.c b/src/gallium/state_trackers/nine/nine_state.c index e019dfb0f41..1187a20bdb3 100644 --- a/src/gallium/state_trackers/nine/nine_state.c +++ b/src/gallium/state_trackers/nine/nine_state.c @@ -500,7 +500,7 @@ update_vs_constants_userbuf(struct NineDevice9 *device) const struct nine_lconstf *lconstf = &device->state.vs->lconstf; const struct nine_range *r = lconstf->ranges; unsigned n = 0; - float *dst = (float *)MALLOC(cb.buffer_size); + float *dst = device->state.vs_lconstf_temp; float *src = (float *)cb.user_buffer; memcpy(dst, src, cb.buffer_size); while (r) { @@ -515,9 +515,6 @@ update_vs_constants_userbuf(struct NineDevice9 *device) pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &cb); - if (device->state.vs->lconstf.ranges) - FREE((void *)cb.user_buffer); - if (device->state.changed.vs_const_f) { struct nine_range *r = device->state.changed.vs_const_f; struct nine_range *p = r; diff --git a/src/gallium/state_trackers/nine/nine_state.h b/src/gallium/state_trackers/nine/nine_state.h index 742c6f67425..58ca8c9f635 100644 --- a/src/gallium/state_trackers/nine/nine_state.h +++ b/src/gallium/state_trackers/nine/nine_state.h @@ -144,6 +144,7 @@ struct nine_state float *vs_const_f; int vs_const_i[NINE_MAX_CONST_I][4]; BOOL vs_const_b[NINE_MAX_CONST_B]; + float *vs_lconstf_temp; uint32_t vs_key; struct NinePixelShader9 *ps; -- 2.30.2