mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 06:58:05 +02:00
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:
parent
8b5b5fe394
commit
5df62dce34
3 changed files with 41 additions and 35 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue