blorp: Set view usage to ISL_SURF_USAGE_STORAGE_BIT for compute

Suggested-by: Kenneth Graunke <kenneth@whitecape.org>
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11564>
This commit is contained in:
Jordan Justen 2021-08-04 20:39:58 -07:00 committed by Marge Bot
parent dd35b9fa34
commit 44ba094b1d
4 changed files with 33 additions and 23 deletions

View file

@ -77,12 +77,13 @@ blorp_batch_finish(struct blorp_batch *batch)
}
void
brw_blorp_surface_info_init(struct blorp_context *blorp,
brw_blorp_surface_info_init(struct blorp_batch *batch,
struct brw_blorp_surface_info *info,
const struct blorp_surf *surf,
unsigned int level, float layer,
enum isl_format format, bool is_render_target)
enum isl_format format, bool is_dest)
{
struct blorp_context *blorp = batch->blorp;
memset(info, 0, sizeof(*info));
assert(level < surf->surf->levels);
assert(layer < MAX2(surf->surf->logical_level0_px.depth >> level,
@ -105,9 +106,18 @@ brw_blorp_surface_info_init(struct blorp_context *blorp,
info->clear_color = surf->clear_color;
info->clear_color_addr = surf->clear_color_addr;
isl_surf_usage_flags_t view_usage;
if (is_dest) {
if (batch->flags & BLORP_BATCH_USE_COMPUTE)
view_usage = ISL_SURF_USAGE_STORAGE_BIT;
else
view_usage = ISL_SURF_USAGE_RENDER_TARGET_BIT;
} else {
view_usage = ISL_SURF_USAGE_TEXTURE_BIT;
}
info->view = (struct isl_view) {
.usage = is_render_target ? ISL_SURF_USAGE_RENDER_TARGET_BIT :
ISL_SURF_USAGE_TEXTURE_BIT,
.usage = view_usage,
.format = format,
.base_level = level,
.levels = 1,
@ -117,7 +127,7 @@ brw_blorp_surface_info_init(struct blorp_context *blorp,
info->view.array_len = MAX2(info->surf.logical_level0_px.depth,
info->surf.logical_level0_px.array_len);
if (!is_render_target &&
if (!is_dest &&
(info->surf.dim == ISL_SURF_DIM_3D ||
info->surf.msaa_layout == ISL_MSAA_LAYOUT_ARRAY)) {
/* 3-D textures don't support base_array layer and neither do 2-D
@ -138,7 +148,7 @@ brw_blorp_surface_info_init(struct blorp_context *blorp,
/* Sandy Bridge and earlier have a limit of a maximum of 512 layers for
* layered rendering.
*/
if (is_render_target && blorp->isl_dev->info->ver <= 6)
if (is_dest && blorp->isl_dev->info->ver <= 6)
info->view.array_len = MIN2(info->view.array_len, 512);
if (surf->tile_x_sa || surf->tile_y_sa) {
@ -422,7 +432,7 @@ blorp_hiz_op(struct blorp_batch *batch, struct blorp_surf *surf,
for (uint32_t a = 0; a < num_layers; a++) {
const uint32_t layer = start_layer + a;
brw_blorp_surface_info_init(batch->blorp, &params.depth, surf, level,
brw_blorp_surface_info_init(batch, &params.depth, surf, level,
layer, surf->surf->format, true);
/* Align the rectangle primitive to 8x4 pixels.

View file

@ -2353,9 +2353,9 @@ blorp_blit(struct blorp_batch *batch,
}
}
brw_blorp_surface_info_init(batch->blorp, &params.src, src_surf, src_level,
brw_blorp_surface_info_init(batch, &params.src, src_surf, src_level,
src_layer, src_format, false);
brw_blorp_surface_info_init(batch->blorp, &params.dst, dst_surf, dst_level,
brw_blorp_surface_info_init(batch, &params.dst, dst_surf, dst_level,
dst_layer, dst_format, true);
params.src.view.swizzle = src_swizzle;
@ -2657,9 +2657,9 @@ blorp_copy(struct blorp_batch *batch,
blorp_params_init(&params);
params.snapshot_type = INTEL_SNAPSHOT_COPY;
brw_blorp_surface_info_init(batch->blorp, &params.src, src_surf, src_level,
brw_blorp_surface_info_init(batch, &params.src, src_surf, src_level,
src_layer, ISL_FORMAT_UNSUPPORTED, false);
brw_blorp_surface_info_init(batch->blorp, &params.dst, dst_surf, dst_level,
brw_blorp_surface_info_init(batch, &params.dst, dst_surf, dst_level,
dst_layer, ISL_FORMAT_UNSUPPORTED, true);
struct brw_blorp_blit_prog_key wm_prog_key = {

View file

@ -359,7 +359,7 @@ blorp_fast_clear(struct blorp_batch *batch,
if (!blorp_params_get_clear_kernel(batch, &params, true, false))
return;
brw_blorp_surface_info_init(batch->blorp, &params.dst, surf, level,
brw_blorp_surface_info_init(batch, &params.dst, surf, level,
start_layer, format, true);
params.num_samples = params.dst.surf.samples;
@ -459,7 +459,7 @@ blorp_clear(struct blorp_batch *batch,
return;
while (num_layers > 0) {
brw_blorp_surface_info_init(batch->blorp, &params.dst, surf, level,
brw_blorp_surface_info_init(batch, &params.dst, surf, level,
start_layer, format, true);
params.dst.view.swizzle = swizzle;
@ -635,7 +635,7 @@ blorp_clear_stencil_as_rgba(struct blorp_batch *batch,
for (uint32_t a = 0; a < num_layers; a++) {
uint32_t layer = start_layer + a;
brw_blorp_surface_info_init(batch->blorp, &params.dst, surf, level,
brw_blorp_surface_info_init(batch, &params.dst, surf, level,
layer, ISL_FORMAT_UNSUPPORTED, true);
if (surf->surf->samples > 1)
@ -704,7 +704,7 @@ blorp_clear_depth_stencil(struct blorp_batch *batch,
params.num_layers = num_layers;
if (stencil_mask) {
brw_blorp_surface_info_init(batch->blorp, &params.stencil, stencil,
brw_blorp_surface_info_init(batch, &params.stencil, stencil,
level, start_layer,
ISL_FORMAT_UNSUPPORTED, true);
params.stencil_mask = stencil_mask;
@ -726,7 +726,7 @@ blorp_clear_depth_stencil(struct blorp_batch *batch,
}
if (clear_depth) {
brw_blorp_surface_info_init(batch->blorp, &params.depth, depth,
brw_blorp_surface_info_init(batch, &params.depth, depth,
level, start_layer,
ISL_FORMAT_UNSUPPORTED, true);
params.z = depth_value;
@ -918,7 +918,7 @@ blorp_hiz_clear_depth_stencil(struct blorp_batch *batch,
for (uint32_t l = 0; l < num_layers; l++) {
const uint32_t layer = start_layer + l;
if (clear_stencil) {
brw_blorp_surface_info_init(batch->blorp, &params.stencil, stencil,
brw_blorp_surface_info_init(batch, &params.stencil, stencil,
level, layer,
ISL_FORMAT_UNSUPPORTED, true);
params.stencil_mask = 0xff;
@ -930,7 +930,7 @@ blorp_hiz_clear_depth_stencil(struct blorp_batch *batch,
/* If we're clearing depth, we must have HiZ */
assert(depth && isl_aux_usage_has_hiz(depth->aux_usage));
brw_blorp_surface_info_init(batch->blorp, &params.depth, depth,
brw_blorp_surface_info_init(batch, &params.depth, depth,
level, layer,
ISL_FORMAT_UNSUPPORTED, true);
params.depth.clear_color.f32[0] = depth_value;
@ -1073,7 +1073,7 @@ blorp_ccs_resolve(struct blorp_batch *batch,
default:
assert(false);
}
brw_blorp_surface_info_init(batch->blorp, &params.dst, surf,
brw_blorp_surface_info_init(batch, &params.dst, surf,
level, start_layer, format, true);
/* From the Ivy Bridge PRM, Vol2 Part1 11.9 "Render Target Resolve":
@ -1244,9 +1244,9 @@ blorp_mcs_partial_resolve(struct blorp_batch *batch,
params.x1 = surf->surf->logical_level0_px.width;
params.y1 = surf->surf->logical_level0_px.height;
brw_blorp_surface_info_init(batch->blorp, &params.src, surf, 0,
brw_blorp_surface_info_init(batch, &params.src, surf, 0,
start_layer, format, false);
brw_blorp_surface_info_init(batch->blorp, &params.dst, surf, 0,
brw_blorp_surface_info_init(batch, &params.dst, surf, 0,
start_layer, format, true);
params.num_samples = params.dst.surf.samples;

View file

@ -68,11 +68,11 @@ struct brw_blorp_surface_info
};
void
brw_blorp_surface_info_init(struct blorp_context *blorp,
brw_blorp_surface_info_init(struct blorp_batch *batch,
struct brw_blorp_surface_info *info,
const struct blorp_surf *surf,
unsigned int level, float layer,
enum isl_format format, bool is_render_target);
enum isl_format format, bool is_dest);
void
blorp_surf_convert_to_single_slice(const struct isl_device *isl_dev,
struct brw_blorp_surface_info *info);