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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user