st/nine: Refactor how user constbufs sizes are calculated
authorAxel Davy <axel.davy@ens.fr>
Wed, 7 Jan 2015 10:07:23 +0000 (11:07 +0100)
committerAxel Davy <axel.davy@ens.fr>
Thu, 5 Feb 2015 23:07:18 +0000 (00:07 +0100)
Count explicitly the slots for float, int and bool constants,
and deduce the constbuf size in nine_shader.

Reviewed-by: Tiziano Bacocco <tizbac2@gmail.com>
Signed-off-by: Axel Davy <axel.davy@ens.fr>
src/gallium/state_trackers/nine/nine_shader.c
src/gallium/state_trackers/nine/nine_shader.h
src/gallium/state_trackers/nine/nine_state.h
src/gallium/state_trackers/nine/pixelshader9.c
src/gallium/state_trackers/nine/vertexshader9.c

index 944b646b30d8d182b84ef3350df3ecff6ec66a73..3d3dcf3f6b411391b5484762ba5fd022417a9bb4 100644 (file)
@@ -2995,7 +2995,9 @@ tx_ctor(struct shader_translator *tx, struct nine_shader_info *info)
     info->position_t = FALSE;
     info->point_size = FALSE;
 
-    tx->info->const_used_size = 0;
+    tx->info->const_float_slots = 0;
+    tx->info->const_int_slots = 0;
+    tx->info->const_bool_slots = 0;
 
     info->sampler_mask = 0x0;
     info->rt_mask = 0x0;
@@ -3065,6 +3067,7 @@ nine_translate_shader(struct NineDevice9 *device, struct nine_shader_info *info)
     struct shader_translator *tx;
     HRESULT hr = D3D_OK;
     const unsigned processor = tgsi_processor_from_type(info->type);
+    unsigned slot_max;
 
     user_assert(processor != ~0, D3DERR_INVALIDCALL);
 
@@ -3196,8 +3199,16 @@ nine_translate_shader(struct NineDevice9 *device, struct nine_shader_info *info)
         hr = D3D_OK;
     }
 
-    if (tx->indirect_const_access)
-        info->const_used_size = ~0;
+    if (tx->indirect_const_access) /* vs only */
+        info->const_float_slots = device->max_vs_const_f;
+
+    slot_max = info->const_bool_slots > 0 ?
+                   device->max_vs_const_f + NINE_MAX_CONST_I
+                   + info->const_bool_slots :
+                       info->const_int_slots > 0 ?
+                           device->max_vs_const_f + info->const_int_slots :
+                               info->const_float_slots;
+    info->const_used_size = sizeof(float[4]) * slot_max; /* slots start from 1 */
 
     info->cso = ureg_create_shader_and_destroy(tx->ureg, device->pipe);
     if (!info->cso) {
index ddee3724079a9eb093230dde11dcd444f0811b57..56c5d99b4d2200a5811dd291ff578fdc5ed0d569 100644 (file)
@@ -63,32 +63,30 @@ struct nine_shader_info
     unsigned const_b_base; /* in vec4 (16 byte) units */
     unsigned const_used_size;
 
+    unsigned const_float_slots;
+    unsigned const_int_slots;
+    unsigned const_bool_slots;
+
     struct nine_lconstf lconstf; /* out, NOTE: members to be free'd by user */
 };
 
 static INLINE void
 nine_info_mark_const_f_used(struct nine_shader_info *info, int idx)
 {
-    unsigned size = (idx + 1) * 16;
-
-    if (info->const_used_size < size)
-        info->const_used_size = size;
+    if (info->const_float_slots < (idx + 1))
+        info->const_float_slots = idx + 1;
 }
 static INLINE void
 nine_info_mark_const_i_used(struct nine_shader_info *info, int idx)
 {
-    unsigned size = (info->const_i_base + (idx + 1)) * 16;
-
-    if (info->const_used_size < size)
-        info->const_used_size = size;
+    if (info->const_int_slots < (idx + 1))
+        info->const_int_slots = idx + 1;
 }
 static INLINE void
 nine_info_mark_const_b_used(struct nine_shader_info *info, int idx)
 {
-    unsigned size = (info->const_b_base + ((idx + 4) / 4)) * 16;
-
-    if (info->const_used_size < size)
-        info->const_used_size = size;
+    if (info->const_bool_slots < (idx + 1))
+        info->const_bool_slots = idx + 1;
 }
 
 HRESULT
index 58ca8c9f63565b13b34716102ccd54bf3b96067b..927bfe18cdd4c799c2e148077b07198f0ae8a8e5 100644 (file)
     ((nconstf)        * 4 * sizeof(float) + \
      NINE_MAX_CONST_I * 4 * sizeof(int))
 
-#define NINE_CONSTBUF_SIZE(nconstf)         \
-    ((nconstf)        * 4 * sizeof(float) + \
-     NINE_MAX_CONST_I * 4 * sizeof(int) + \
-     NINE_MAX_CONST_B * 1 * sizeof(float))
-
 
 #define NINE_MAX_LIGHTS        65536
 #define NINE_MAX_LIGHTS_ACTIVE 8
index dcd234670dbae76ebb09ac2518ded079f079b83f..3f176a312bf586ed183e74294704694c7a5248ee 100644 (file)
@@ -73,7 +73,6 @@ NinePixelShader9_ctor( struct NinePixelShader9 *This,
     This->rt_mask = info.rt_mask;
     This->const_used_size = info.const_used_size;
     /* no constant relative addressing for ps */
-    assert(info.const_used_size != ~0);
     assert(info.lconstf.data == NULL);
     assert(info.lconstf.ranges == NULL);
 
index 3d40d60c0620d2c33707165ef499797cfbbfd5db..bbd5ce99d9a0f6866abc941eb50757e31edf5d7a 100644 (file)
@@ -72,8 +72,6 @@ NineVertexShader9_ctor( struct NineVertexShader9 *This,
 
     This->variant.cso = info.cso;
     This->const_used_size = info.const_used_size;
-    if (info.const_used_size == ~0)
-        This->const_used_size = NINE_CONSTBUF_SIZE(device->max_vs_const_f);
     This->lconstf = info.lconstf;
     This->sampler_mask = info.sampler_mask;
     This->position_t = info.position_t;