ilo: make constant buffer 0 upload optional

Add ILO_KERNEL_SKIP_CBUF0_UPLOAD so that we can skip constant buffer 0 upload
when the kernel does not need it.
This commit is contained in:
Chia-I Wu 2013-07-18 05:43:00 +08:00
parent 8b5b5fe394
commit 5df62dce34
3 changed files with 41 additions and 35 deletions

View file

@ -1060,6 +1060,9 @@ ilo_shader_get_kernel_param(const struct ilo_shader_state *shader,
case ILO_KERNEL_URB_DATA_START_REG:
val = kernel->in.start_grf;
break;
case ILO_KERNEL_SKIP_CBUF0_UPLOAD:
val = false;
break;
case ILO_KERNEL_VS_INPUT_INSTANCEID:
val = shader->info.has_instanceid;

View file

@ -34,6 +34,7 @@ enum ilo_kernel_param {
ILO_KERNEL_INPUT_COUNT,
ILO_KERNEL_OUTPUT_COUNT,
ILO_KERNEL_URB_DATA_START_REG,
ILO_KERNEL_SKIP_CBUF0_UPLOAD,
ILO_KERNEL_VS_INPUT_INSTANCEID,
ILO_KERNEL_VS_INPUT_VERTEXID,

View file

@ -84,45 +84,47 @@ finalize_shader_states(struct ilo_context *ilo)
}
}
static void
finalize_cbuf_state(struct ilo_context *ilo,
struct ilo_cbuf_state *cbuf,
const struct ilo_shader_state *sh)
{
uint32_t upload_mask = cbuf->enabled_mask;
/* skip CBUF0 if the kernel does not need it */
upload_mask &=
~ilo_shader_get_kernel_param(sh, ILO_KERNEL_SKIP_CBUF0_UPLOAD);
while (upload_mask) {
const enum pipe_format elem_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
unsigned offset, i;
i = u_bit_scan(&upload_mask);
/* no need to upload */
if (cbuf->cso[i].resource)
continue;
u_upload_data(ilo->uploader, 0, cbuf->cso[i].user_buffer_size,
cbuf->cso[i].user_buffer, &offset, &cbuf->cso[i].resource);
ilo_gpe_init_view_surface_for_buffer(ilo->dev,
ilo_buffer(cbuf->cso[i].resource),
offset, cbuf->cso[i].user_buffer_size,
util_format_get_blocksize(elem_format), elem_format,
false, false, &cbuf->cso[i].surface);
ilo->dirty |= ILO_DIRTY_CBUF;
}
}
static void
finalize_constant_buffers(struct ilo_context *ilo)
{
int sh;
if (ilo->dirty & (ILO_DIRTY_CBUF | ILO_DIRTY_VS))
finalize_cbuf_state(ilo, &ilo->cbuf[PIPE_SHADER_VERTEX], ilo->vs);
if (!(ilo->dirty & ILO_DIRTY_CBUF))
return;
/* TODO push constants? */
for (sh = 0; sh < PIPE_SHADER_TYPES; sh++) {
unsigned enabled_mask = ilo->cbuf[sh].enabled_mask;
while (enabled_mask) {
struct ilo_cbuf_cso *cbuf;
int i;
i = u_bit_scan(&enabled_mask);
cbuf = &ilo->cbuf[sh].cso[i];
/* upload user buffer */
if (cbuf->user_buffer) {
const enum pipe_format elem_format =
PIPE_FORMAT_R32G32B32A32_FLOAT;
unsigned offset;
u_upload_data(ilo->uploader, 0, cbuf->user_buffer_size,
cbuf->user_buffer, &offset, &cbuf->resource);
ilo_gpe_init_view_surface_for_buffer(ilo->dev,
ilo_buffer(cbuf->resource),
offset, cbuf->user_buffer_size,
util_format_get_blocksize(elem_format), elem_format,
false, false, &cbuf->surface);
cbuf->user_buffer = NULL;
cbuf->user_buffer_size = 0;
}
}
}
if (ilo->dirty & (ILO_DIRTY_CBUF | ILO_DIRTY_FS))
finalize_cbuf_state(ilo, &ilo->cbuf[PIPE_SHADER_FRAGMENT], ilo->fs);
}
static void