[Mesa-stable] [PATCH 50/53] st/nine: Allocate vs constbuf buffer for indirect addressing once.

Axel Davy axel.davy at ens.fr
Wed Jan 7 08:37:00 PST 2015


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.

Signed-off-by: Axel Davy <axel.davy at ens.fr>
Signed-off-by: Tiziano Bacocco <tizbac2 at gmail.com>

Cc: "10.4" <mesa-stable at lists.freedesktop.org>
---
 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 68036c0..98f0965 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 dc97529..09b4401 100644
--- a/src/gallium/state_trackers/nine/nine_state.c
+++ b/src/gallium/state_trackers/nine/nine_state.c
@@ -501,7 +501,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) {
@@ -516,9 +516,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 742c6f6..58ca8c9 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.1.3



More information about the mesa-stable mailing list