st/nine: Rework ff constant buffers

Always use a user constant buffer for ff.
It means we have to:
. commit the user constant buffer for ff when we use it
. commit back the non-ff constant buffer when we stop using it

Signed-off-by: Axel Davy <axel.davy@ens.fr>
This commit is contained in:
Axel Davy
2015-03-24 11:06:22 +01:00
parent 993e68fa6a
commit 87ec6b56b2
4 changed files with 55 additions and 85 deletions
@@ -3244,6 +3244,10 @@ NineDevice9_SetVertexShader( struct NineDevice9 *This,
DBG("This=%p pShader=%p\n", This, pShader);
/* ff -> non-ff: commit back non-ff constants */
if (!state->vs && pShader)
state->commit |= NINE_STATE_COMMIT_CONST_VS;
nine_bind(&state->vs, pShader);
state->changed.group |= NINE_STATE_VS;
@@ -3572,6 +3576,10 @@ NineDevice9_SetPixelShader( struct NineDevice9 *This,
DBG("This=%p pShader=%p\n", This, pShader);
/* ff -> non-ff: commit back non-ff constants */
if (!state->ps && pShader)
state->commit |= NINE_STATE_COMMIT_CONST_PS;
nine_bind(&state->ps, pShader);
state->changed.group |= NINE_STATE_PS;
+37 -77
View File
@@ -1763,28 +1763,22 @@ nine_ff_load_viewport_info(struct NineDevice9 *device)
void
nine_ff_update(struct NineDevice9 *device)
{
struct pipe_context *pipe = device->pipe;
struct nine_state *state = &device->state;
struct pipe_constant_buffer cb;
DBG("vs=%p ps=%p\n", device->state.vs, device->state.ps);
/* NOTE: the only reference belongs to the hash table */
if (!device->state.vs)
if (!device->state.vs) {
device->ff.vs = nine_ff_get_vs(device);
if (!device->state.ps)
device->state.changed.group |= NINE_STATE_VS;
}
if (!device->state.ps) {
device->ff.ps = nine_ff_get_ps(device);
device->state.changed.group |= NINE_STATE_PS;
}
if (!device->state.vs) {
if (device->state.ff.clobber.vs_const) {
device->state.ff.clobber.vs_const = FALSE;
device->state.changed.group |=
NINE_STATE_FF_VSTRANSF |
NINE_STATE_FF_MATERIAL |
NINE_STATE_FF_LIGHTING |
NINE_STATE_FF_OTHER;
device->state.ff.changed.transform[0] |= 0xff000c;
device->state.ff.changed.transform[8] |= 0xff;
}
nine_ff_load_vs_transforms(device);
nine_ff_load_tex_matrices(device);
nine_ff_load_lights(device);
@@ -1793,79 +1787,45 @@ nine_ff_update(struct NineDevice9 *device)
memset(state->ff.changed.transform, 0, sizeof(state->ff.changed.transform));
device->state.changed.group |= NINE_STATE_VS;
device->state.changed.group |= NINE_STATE_VS_CONST;
cb.buffer_offset = 0;
cb.buffer = NULL;
cb.user_buffer = device->ff.vs_const;
cb.buffer_size = NINE_FF_NUM_VS_CONST * 4 * sizeof(float);
if (device->prefer_user_constbuf) {
struct pipe_context *pipe = device->pipe;
struct pipe_constant_buffer cb;
cb.buffer_offset = 0;
cb.buffer = NULL;
cb.user_buffer = device->ff.vs_const;
cb.buffer_size = NINE_FF_NUM_VS_CONST * 4 * sizeof(float);
if (!device->driver_caps.user_cbufs) {
u_upload_data(device->constbuf_uploader,
0,
cb.buffer_size,
cb.user_buffer,
&cb.buffer_offset,
&cb.buffer);
u_upload_unmap(device->constbuf_uploader);
cb.user_buffer = NULL;
}
pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &cb);
} else {
struct pipe_box box;
u_box_1d(0, NINE_FF_NUM_VS_CONST * 4 * sizeof(float), &box);
pipe->transfer_inline_write(pipe, device->constbuf_vs, 0,
0, &box,
device->ff.vs_const, 0, 0);
nine_ranges_insert(&device->state.changed.vs_const_f, 0, NINE_FF_NUM_VS_CONST,
&device->range_pool);
if (!device->driver_caps.user_cbufs) {
u_upload_data(device->constbuf_uploader,
0,
cb.buffer_size,
cb.user_buffer,
&cb.buffer_offset,
&cb.buffer);
u_upload_unmap(device->constbuf_uploader);
cb.user_buffer = NULL;
}
state->pipe.cb_vs_ff = cb;
state->commit |= NINE_STATE_COMMIT_CONST_VS;
}
if (!device->state.ps) {
if (device->state.ff.clobber.ps_const) {
device->state.ff.clobber.ps_const = FALSE;
device->state.changed.group |=
NINE_STATE_FF_PSSTAGES |
NINE_STATE_FF_OTHER;
}
nine_ff_load_ps_params(device);
device->state.changed.group |= NINE_STATE_PS;
device->state.changed.group |= NINE_STATE_PS_CONST;
cb.buffer_offset = 0;
cb.buffer = NULL;
cb.user_buffer = device->ff.ps_const;
cb.buffer_size = NINE_FF_NUM_PS_CONST * 4 * sizeof(float);
if (device->prefer_user_constbuf) {
struct pipe_context *pipe = device->pipe;
struct pipe_constant_buffer cb;
cb.buffer_offset = 0;
cb.buffer = NULL;
cb.user_buffer = device->ff.ps_const;
cb.buffer_size = NINE_FF_NUM_PS_CONST * 4 * sizeof(float);
if (!device->driver_caps.user_cbufs) {
u_upload_data(device->constbuf_uploader,
0,
cb.buffer_size,
cb.user_buffer,
&cb.buffer_offset,
&cb.buffer);
u_upload_unmap(device->constbuf_uploader);
cb.user_buffer = NULL;
}
pipe->set_constant_buffer(pipe, PIPE_SHADER_FRAGMENT, 0, &cb);
} else {
struct pipe_box box;
u_box_1d(0, NINE_FF_NUM_PS_CONST * 4 * sizeof(float), &box);
pipe->transfer_inline_write(pipe, device->constbuf_ps, 0,
0, &box,
device->ff.ps_const, 0, 0);
nine_ranges_insert(&device->state.changed.ps_const_f, 0, NINE_FF_NUM_PS_CONST,
&device->range_pool);
if (!device->driver_caps.user_cbufs) {
u_upload_data(device->constbuf_uploader,
0,
cb.buffer_size,
cb.user_buffer,
&cb.buffer_offset,
&cb.buffer);
u_upload_unmap(device->constbuf_uploader);
cb.user_buffer = NULL;
}
state->pipe.cb_ps_ff = cb;
state->commit |= NINE_STATE_COMMIT_CONST_PS;
}
device->state.changed.group &= ~NINE_STATE_FF;
+8 -4
View File
@@ -119,7 +119,6 @@ upload_constants(struct NineDevice9 *device, unsigned shader_type)
lconstf_ranges = device->state.vs->lconstf.ranges;
lconstf_data = device->state.vs->lconstf.data;
device->state.ff.clobber.vs_const = TRUE;
device->state.changed.group &= ~NINE_STATE_VS_CONST;
} else {
DBG("PS\n");
@@ -145,7 +144,6 @@ upload_constants(struct NineDevice9 *device, unsigned shader_type)
lconstf_ranges = NULL;
lconstf_data = NULL;
device->state.ff.clobber.ps_const = TRUE;
device->state.changed.group &= ~NINE_STATE_PS_CONST;
}
@@ -909,7 +907,10 @@ commit_vs_constants(struct NineDevice9 *device)
{
struct pipe_context *pipe = device->pipe;
pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &device->state.pipe.cb_vs);
if (unlikely(!device->state.vs))
pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &device->state.pipe.cb_vs_ff);
else
pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &device->state.pipe.cb_vs);
}
static inline void
@@ -917,7 +918,10 @@ commit_ps_constants(struct NineDevice9 *device)
{
struct pipe_context *pipe = device->pipe;
pipe->set_constant_buffer(pipe, PIPE_SHADER_FRAGMENT, 0, &device->state.pipe.cb_ps);
if (unlikely(!device->state.ps))
pipe->set_constant_buffer(pipe, PIPE_SHADER_FRAGMENT, 0, &device->state.pipe.cb_ps_ff);
else
pipe->set_constant_buffer(pipe, PIPE_SHADER_FRAGMENT, 0, &device->state.pipe.cb_ps);
}
/* State Update */
+2 -4
View File
@@ -194,10 +194,6 @@ struct nine_state
uint32_t tex_stage[NINE_MAX_SAMPLERS][(NINED3DTSS_COUNT + 31) / 32];
uint32_t transform[(NINED3DTS_COUNT + 31) / 32];
} changed;
struct {
boolean vs_const;
boolean ps_const;
} clobber;
D3DMATRIX *transform; /* access only via nine_state_access_transform */
unsigned num_transforms;
@@ -222,6 +218,8 @@ struct nine_state
struct pipe_blend_state blend;
struct pipe_constant_buffer cb_vs;
struct pipe_constant_buffer cb_ps;
struct pipe_constant_buffer cb_vs_ff;
struct pipe_constant_buffer cb_ps_ff;
} pipe;
};