blorp: Pass the batch to lookup/upload_shader instead of context

This will allow drivers to pin shader buffers if necessary.

i965 and anv do not need to do this today, but iris will.

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
Kenneth Graunke
2019-01-09 15:15:49 -08:00
parent 084a1cdbb7
commit ad9832d17b
7 changed files with 44 additions and 35 deletions

View File

@@ -43,18 +43,20 @@ struct brw_blorp_const_color_prog_key
};
static bool
blorp_params_get_clear_kernel(struct blorp_context *blorp,
blorp_params_get_clear_kernel(struct blorp_batch *batch,
struct blorp_params *params,
bool use_replicated_data,
bool clear_rgb_as_red)
{
struct blorp_context *blorp = batch->blorp;
const struct brw_blorp_const_color_prog_key blorp_key = {
.shader_type = BLORP_SHADER_TYPE_CLEAR,
.use_simd16_replicated_data = use_replicated_data,
.clear_rgb_as_red = clear_rgb_as_red,
};
if (blorp->lookup_shader(blorp, &blorp_key, sizeof(blorp_key),
if (blorp->lookup_shader(batch, &blorp_key, sizeof(blorp_key),
&params->wm_prog_kernel, &params->wm_prog_data))
return true;
@@ -104,7 +106,7 @@ blorp_params_get_clear_kernel(struct blorp_context *blorp,
&prog_data);
bool result =
blorp->upload_shader(blorp, &blorp_key, sizeof(blorp_key),
blorp->upload_shader(batch, &blorp_key, sizeof(blorp_key),
program, prog_data.base.program_size,
&prog_data.base, sizeof(prog_data),
&params->wm_prog_kernel, &params->wm_prog_data);
@@ -126,9 +128,10 @@ struct layer_offset_vs_key {
* vertex shader.
*/
static bool
blorp_params_get_layer_offset_vs(struct blorp_context *blorp,
blorp_params_get_layer_offset_vs(struct blorp_batch *batch,
struct blorp_params *params)
{
struct blorp_context *blorp = batch->blorp;
struct layer_offset_vs_key blorp_key = {
.shader_type = BLORP_SHADER_TYPE_LAYER_OFFSET_VS,
};
@@ -136,7 +139,7 @@ blorp_params_get_layer_offset_vs(struct blorp_context *blorp,
if (params->wm_prog_data)
blorp_key.num_inputs = params->wm_prog_data->num_varying_inputs;
if (blorp->lookup_shader(blorp, &blorp_key, sizeof(blorp_key),
if (blorp->lookup_shader(batch, &blorp_key, sizeof(blorp_key),
&params->vs_prog_kernel, &params->vs_prog_data))
return true;
@@ -194,7 +197,7 @@ blorp_params_get_layer_offset_vs(struct blorp_context *blorp,
blorp_compile_vs(blorp, mem_ctx, b.shader, &vs_prog_data);
bool result =
blorp->upload_shader(blorp, &blorp_key, sizeof(blorp_key),
blorp->upload_shader(batch, &blorp_key, sizeof(blorp_key),
program, vs_prog_data.base.base.program_size,
&vs_prog_data.base.base, sizeof(vs_prog_data),
&params->vs_prog_kernel, &params->vs_prog_data);
@@ -351,7 +354,7 @@ blorp_fast_clear(struct blorp_batch *batch,
get_fast_clear_rect(batch->blorp->isl_dev, surf->aux_surf,
&params.x0, &params.y0, &params.x1, &params.y1);
if (!blorp_params_get_clear_kernel(batch->blorp, &params, true, false))
if (!blorp_params_get_clear_kernel(batch, &params, true, false))
return;
brw_blorp_surface_info_init(batch->blorp, &params.dst, surf, level,
@@ -453,12 +456,12 @@ blorp_clear(struct blorp_batch *batch,
}
}
if (!blorp_params_get_clear_kernel(batch->blorp, &params,
if (!blorp_params_get_clear_kernel(batch, &params,
use_simd16_replicated_data,
clear_rgb_as_red))
return;
if (!blorp_ensure_sf_program(batch->blorp, &params))
if (!blorp_ensure_sf_program(batch, &params))
return;
while (num_layers > 0) {
@@ -589,7 +592,7 @@ blorp_clear_depth_stencil(struct blorp_batch *batch,
* we disable statistics in 3DSTATE_WM. Give it the usual clear shader
* to work around the issue.
*/
if (!blorp_params_get_clear_kernel(batch->blorp, &params, false, false))
if (!blorp_params_get_clear_kernel(batch, &params, false, false))
return;
}
@@ -829,7 +832,7 @@ blorp_clear_attachments(struct blorp_batch *batch,
* is tiled or not, we have to assume it may be linear. This means no
* SIMD16_REPDATA for us. :-(
*/
if (!blorp_params_get_clear_kernel(batch->blorp, &params, false, false))
if (!blorp_params_get_clear_kernel(batch, &params, false, false))
return;
}
@@ -847,7 +850,7 @@ blorp_clear_attachments(struct blorp_batch *batch,
params.stencil_ref = stencil_value;
}
if (!blorp_params_get_layer_offset_vs(batch->blorp, &params))
if (!blorp_params_get_layer_offset_vs(batch, &params))
return;
params.vs_inputs.base_layer = start_layer;
@@ -914,7 +917,7 @@ blorp_ccs_resolve(struct blorp_batch *batch,
* color" message.
*/
if (!blorp_params_get_clear_kernel(batch->blorp, &params, true, false))
if (!blorp_params_get_clear_kernel(batch, &params, true, false))
return;
batch->blorp->exec(batch, &params);
@@ -936,9 +939,10 @@ struct blorp_mcs_partial_resolve_key
};
static bool
blorp_params_get_mcs_partial_resolve_kernel(struct blorp_context *blorp,
blorp_params_get_mcs_partial_resolve_kernel(struct blorp_batch *batch,
struct blorp_params *params)
{
struct blorp_context *blorp = batch->blorp;
const struct blorp_mcs_partial_resolve_key blorp_key = {
.shader_type = BLORP_SHADER_TYPE_MCS_PARTIAL_RESOLVE,
.indirect_clear_color = params->dst.clear_color_addr.buffer != NULL,
@@ -946,7 +950,7 @@ blorp_params_get_mcs_partial_resolve_kernel(struct blorp_context *blorp,
.num_samples = params->num_samples,
};
if (blorp->lookup_shader(blorp, &blorp_key, sizeof(blorp_key),
if (blorp->lookup_shader(batch, &blorp_key, sizeof(blorp_key),
&params->wm_prog_kernel, &params->wm_prog_data))
return true;
@@ -1002,7 +1006,7 @@ blorp_params_get_mcs_partial_resolve_kernel(struct blorp_context *blorp,
&prog_data);
bool result =
blorp->upload_shader(blorp, &blorp_key, sizeof(blorp_key),
blorp->upload_shader(batch, &blorp_key, sizeof(blorp_key),
program, prog_data.base.program_size,
&prog_data.base, sizeof(prog_data),
&params->wm_prog_kernel, &params->wm_prog_data);
@@ -1039,7 +1043,7 @@ blorp_mcs_partial_resolve(struct blorp_batch *batch,
memcpy(&params.wm_inputs.clear_color,
surf->clear_color.f32, sizeof(float) * 4);
if (!blorp_params_get_mcs_partial_resolve_kernel(batch->blorp, &params))
if (!blorp_params_get_mcs_partial_resolve_kernel(batch, &params))
return;
batch->blorp->exec(batch, &params);
@@ -1192,7 +1196,7 @@ blorp_ccs_ambiguate(struct blorp_batch *batch,
memset(&params.wm_inputs.clear_color, 0,
sizeof(params.wm_inputs.clear_color));
if (!blorp_params_get_clear_kernel(batch->blorp, &params, true, false))
if (!blorp_params_get_clear_kernel(batch, &params, true, false))
return;
batch->blorp->exec(batch, &params);