[Mesa-dev] [PATCH 16/53] st/nine: Rework of boolean constants
Axel Davy
axel.davy at ens.fr
Wed Jan 7 08:36:26 PST 2015
Convert them to shader booleans at earlier stage
Signed-off-by: Axel Davy <axel.davy at ens.fr>
Cc: "10.4" <mesa-stable at lists.freedesktop.org>
---
src/gallium/state_trackers/nine/device9.c | 35 +++++++++++++---------------
src/gallium/state_trackers/nine/device9.h | 6 ++---
src/gallium/state_trackers/nine/nine_state.c | 13 +++--------
3 files changed, 22 insertions(+), 32 deletions(-)
diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c
index 1d97688..d747a7a 100644
--- a/src/gallium/state_trackers/nine/device9.c
+++ b/src/gallium/state_trackers/nine/device9.c
@@ -293,13 +293,6 @@ NineDevice9_ctor( struct NineDevice9 *This,
return E_OUTOFMEMORY;
}
- This->vs_bool_true = pScreen->get_shader_param(pScreen,
- PIPE_SHADER_VERTEX,
- PIPE_SHADER_CAP_INTEGERS) ? 0xFFFFFFFF : fui(1.0f);
- This->ps_bool_true = pScreen->get_shader_param(pScreen,
- PIPE_SHADER_FRAGMENT,
- PIPE_SHADER_CAP_INTEGERS) ? 0xFFFFFFFF : fui(1.0f);
-
/* Allocate upload helper for drivers that suck (from st pov ;). */
{
unsigned bind = 0;
@@ -314,6 +307,8 @@ NineDevice9_ctor( struct NineDevice9 *This,
}
This->driver_caps.window_space_position_support = GET_PCAP(TGSI_VS_WINDOW_SPACE_POSITION);
+ This->driver_caps.vs_integer = pScreen->get_shader_param(pScreen, PIPE_SHADER_VERTEX, PIPE_SHADER_CAP_INTEGERS);
+ This->driver_caps.ps_integer = pScreen->get_shader_param(pScreen, PIPE_SHADER_FRAGMENT, PIPE_SHADER_CAP_INTEGERS);
nine_ff_init(This); /* initialize fixed function code */
@@ -2981,6 +2976,8 @@ NineDevice9_SetVertexShaderConstantB( struct NineDevice9 *This,
UINT BoolCount )
{
struct nine_state *state = This->update;
+ int i;
+ uint32_t bool_true = This->driver_caps.vs_integer ? 0xFFFFFFFF : fui(1.0f);
DBG("This=%p StartRegister=%u pConstantData=%p BoolCount=%u\n",
This, StartRegister, pConstantData, BoolCount);
@@ -2989,9 +2986,8 @@ NineDevice9_SetVertexShaderConstantB( struct NineDevice9 *This,
user_assert(StartRegister + BoolCount <= NINE_MAX_CONST_B, D3DERR_INVALIDCALL);
user_assert(pConstantData, D3DERR_INVALIDCALL);
- memcpy(&state->vs_const_b[StartRegister],
- pConstantData,
- BoolCount * sizeof(state->vs_const_b[0]));
+ for (i = 0; i < BoolCount; i++)
+ state->vs_const_b[StartRegister + i] = pConstantData[i] ? bool_true : 0;
state->changed.vs_const_b |= ((1 << BoolCount) - 1) << StartRegister;
state->changed.group |= NINE_STATE_VS_CONST;
@@ -3006,14 +3002,14 @@ NineDevice9_GetVertexShaderConstantB( struct NineDevice9 *This,
UINT BoolCount )
{
const struct nine_state *state = &This->state;
+ int i;
user_assert(StartRegister < NINE_MAX_CONST_B, D3DERR_INVALIDCALL);
user_assert(StartRegister + BoolCount <= NINE_MAX_CONST_B, D3DERR_INVALIDCALL);
user_assert(pConstantData, D3DERR_INVALIDCALL);
- memcpy(pConstantData,
- &state->vs_const_b[StartRegister],
- BoolCount * sizeof(state->vs_const_b[0]));
+ for (i = 0; i < BoolCount; i++)
+ pConstantData[i] = state->vs_const_b[StartRegister + i] != 0 ? TRUE : FALSE;
return D3D_OK;
}
@@ -3286,6 +3282,8 @@ NineDevice9_SetPixelShaderConstantB( struct NineDevice9 *This,
UINT BoolCount )
{
struct nine_state *state = This->update;
+ int i;
+ uint32_t bool_true = This->driver_caps.ps_integer ? 0xFFFFFFFF : fui(1.0f);
DBG("This=%p StartRegister=%u pConstantData=%p BoolCount=%u\n",
This, StartRegister, pConstantData, BoolCount);
@@ -3294,9 +3292,8 @@ NineDevice9_SetPixelShaderConstantB( struct NineDevice9 *This,
user_assert(StartRegister + BoolCount <= NINE_MAX_CONST_B, D3DERR_INVALIDCALL);
user_assert(pConstantData, D3DERR_INVALIDCALL);
- memcpy(&state->ps_const_b[StartRegister],
- pConstantData,
- BoolCount * sizeof(state->ps_const_b[0]));
+ for (i = 0; i < BoolCount; i++)
+ state->ps_const_b[StartRegister + i] = pConstantData[i] ? bool_true : 0;
state->changed.ps_const_b |= ((1 << BoolCount) - 1) << StartRegister;
state->changed.group |= NINE_STATE_PS_CONST;
@@ -3311,14 +3308,14 @@ NineDevice9_GetPixelShaderConstantB( struct NineDevice9 *This,
UINT BoolCount )
{
const struct nine_state *state = &This->state;
+ int i;
user_assert(StartRegister < NINE_MAX_CONST_B, D3DERR_INVALIDCALL);
user_assert(StartRegister + BoolCount <= NINE_MAX_CONST_B, D3DERR_INVALIDCALL);
user_assert(pConstantData, D3DERR_INVALIDCALL);
- memcpy(pConstantData,
- &state->ps_const_b[StartRegister],
- BoolCount * sizeof(state->ps_const_b[0]));
+ for (i = 0; i < BoolCount; i++)
+ pConstantData[i] = state->ps_const_b[StartRegister + i] != 0 ? TRUE : FALSE;
return D3D_OK;
}
diff --git a/src/gallium/state_trackers/nine/device9.h b/src/gallium/state_trackers/nine/device9.h
index 3649e1b..cf2138a 100644
--- a/src/gallium/state_trackers/nine/device9.h
+++ b/src/gallium/state_trackers/nine/device9.h
@@ -78,9 +78,7 @@ struct NineDevice9
struct pipe_resource *constbuf_vs;
struct pipe_resource *constbuf_ps;
uint16_t max_vs_const_f;
- uint16_t max_ps_const_f;
- uint32_t vs_bool_true;
- uint32_t ps_bool_true;
+ uint16_t max_ps_const_f;;
struct gen_mipmap_state *gen_mipmap;
@@ -111,6 +109,8 @@ struct NineDevice9
boolean user_vbufs;
boolean user_ibufs;
boolean window_space_position_support;
+ boolean vs_integer;
+ boolean ps_integer;
} driver_caps;
struct u_upload_mgr *upload;
diff --git a/src/gallium/state_trackers/nine/nine_state.c b/src/gallium/state_trackers/nine/nine_state.c
index e4e6788..00da62b 100644
--- a/src/gallium/state_trackers/nine/nine_state.c
+++ b/src/gallium/state_trackers/nine/nine_state.c
@@ -347,7 +347,6 @@ update_constants(struct NineDevice9 *device, unsigned shader_type)
const int *const_i;
const BOOL *const_b;
uint32_t data_b[NINE_MAX_CONST_B];
- uint32_t b_true;
uint16_t dirty_i;
uint16_t dirty_b;
const unsigned usage = PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE;
@@ -381,7 +380,6 @@ update_constants(struct NineDevice9 *device, unsigned shader_type)
dirty_b = device->state.changed.vs_const_b;
device->state.changed.vs_const_b = 0;
const_b = device->state.vs_const_b;
- b_true = device->vs_bool_true;
lconstf = &device->state.vs->lconstf;
device->state.ff.clobber.vs_const = TRUE;
@@ -406,7 +404,6 @@ update_constants(struct NineDevice9 *device, unsigned shader_type)
dirty_b = device->state.changed.ps_const_b;
device->state.changed.ps_const_b = 0;
const_b = device->state.ps_const_b;
- b_true = device->ps_bool_true;
lconstf = &device->state.ps->lconstf;
device->state.ff.clobber.ps_const = TRUE;
@@ -421,7 +418,7 @@ update_constants(struct NineDevice9 *device, unsigned shader_type)
x = buf->width0 - (NINE_MAX_CONST_B - i) * 4;
c -= i;
for (n = 0; n < c; ++n, ++i)
- data_b[n] = const_b[i] ? b_true : 0;
+ data_b[n] = const_b[i];
box.x = x;
box.width = n * 4;
DBG("upload ConstantB [%u .. %u]\n", x, x + n - 1);
@@ -491,9 +488,7 @@ update_vs_constants_userbuf(struct NineDevice9 *device)
if (state->changed.vs_const_b) {
int *idst = (int *)&state->vs_const_f[4 * device->max_vs_const_f];
uint32_t *bdst = (uint32_t *)&idst[4 * NINE_MAX_CONST_I];
- int i;
- for (i = 0; i < NINE_MAX_CONST_B; ++i)
- bdst[i] = state->vs_const_b[i] ? device->vs_bool_true : 0;
+ memcpy(bdst, state->vs_const_b, sizeof(state->vs_const_b));
state->changed.vs_const_b = 0;
}
@@ -557,9 +552,7 @@ update_ps_constants_userbuf(struct NineDevice9 *device)
if (state->changed.ps_const_b) {
int *idst = (int *)&state->ps_const_f[4 * device->max_ps_const_f];
uint32_t *bdst = (uint32_t *)&idst[4 * NINE_MAX_CONST_I];
- int i;
- for (i = 0; i < NINE_MAX_CONST_B; ++i)
- bdst[i] = state->ps_const_b[i] ? device->ps_bool_true : 0;
+ memcpy(bdst, state->ps_const_b, sizeof(state->ps_const_b));
state->changed.ps_const_b = 0;
}
--
2.1.3
More information about the mesa-dev
mailing list