On Fri, Jan 30, 2015 at 3:34 PM, Axel Davy <axel.d...@ens.fr> wrote: > Count explicitly the slots for float, int and bool constants, > and deduce the constbuf size in nine_shader. > > Signed-off-by: Axel Davy <axel.d...@ens.fr> > --- > src/gallium/state_trackers/nine/nine_shader.c | 17 ++++++++++++++--- > src/gallium/state_trackers/nine/nine_shader.h | 22 ++++++++++------------ > src/gallium/state_trackers/nine/nine_state.h | 5 ----- > src/gallium/state_trackers/nine/pixelshader9.c | 1 - > src/gallium/state_trackers/nine/vertexshader9.c | 2 -- > 5 files changed, 24 insertions(+), 23 deletions(-) > > diff --git a/src/gallium/state_trackers/nine/nine_shader.c > b/src/gallium/state_trackers/nine/nine_shader.c > index 944b646..1984087 100644 > --- a/src/gallium/state_trackers/nine/nine_shader.c > +++ b/src/gallium/state_trackers/nine/nine_shader.c > @@ -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->num_float_consts_slots = 0; > + tx->info->num_int_consts_slots = 0; > + tx->info->num_bool_consts_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->num_float_consts_slots = device->max_vs_const_f; > + > + slot_max = info->num_bool_consts_slots > 0 ? > + device->max_vs_const_f + NINE_MAX_CONST_I > + + info->num_bool_consts_slots : > + info->num_int_consts_slots > 0 ? > + device->max_vs_const_f + info->num_int_consts_slots : > + info->num_float_consts_slots;
Please use an if ladder, no reason to make it so difficult to read. > + 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) { > diff --git a/src/gallium/state_trackers/nine/nine_shader.h > b/src/gallium/state_trackers/nine/nine_shader.h > index ddee372..027f765 100644 > --- a/src/gallium/state_trackers/nine/nine_shader.h > +++ b/src/gallium/state_trackers/nine/nine_shader.h > @@ -63,32 +63,30 @@ struct nine_shader_info > unsigned const_b_base; /* in vec4 (16 byte) units */ > unsigned const_used_size; > > + unsigned num_float_consts_slots; > + unsigned num_int_consts_slots; > + unsigned num_bool_consts_slots; You're more familiar with this code, but these names seem jarring relative to the other stuff... why not const_float_slots const_int_slots etc Actually these are regarding the *used* slots right? So then it should be const_float_used const_int_used etc? > + > 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->num_float_consts_slots < (idx + 1)) > + info->num_float_consts_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->num_int_consts_slots < (idx + 1)) > + info->num_int_consts_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->num_bool_consts_slots < (idx + 1)) > + info->num_bool_consts_slots = idx + 1; > } > > HRESULT > diff --git a/src/gallium/state_trackers/nine/nine_state.h > b/src/gallium/state_trackers/nine/nine_state.h > index 58ca8c9..927bfe1 100644 > --- a/src/gallium/state_trackers/nine/nine_state.h > +++ b/src/gallium/state_trackers/nine/nine_state.h > @@ -91,11 +91,6 @@ > ((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 > diff --git a/src/gallium/state_trackers/nine/pixelshader9.c > b/src/gallium/state_trackers/nine/pixelshader9.c > index dcd2346..3f176a3 100644 > --- a/src/gallium/state_trackers/nine/pixelshader9.c > +++ b/src/gallium/state_trackers/nine/pixelshader9.c > @@ -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); > > diff --git a/src/gallium/state_trackers/nine/vertexshader9.c > b/src/gallium/state_trackers/nine/vertexshader9.c > index 3d40d60..bbd5ce9 100644 > --- a/src/gallium/state_trackers/nine/vertexshader9.c > +++ b/src/gallium/state_trackers/nine/vertexshader9.c > @@ -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; > -- > 2.1.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev