iris: implement ARB_clear_texture

This commit is contained in:
Kenneth Graunke 2018-08-15 01:34:10 -07:00
parent 84b30a2900
commit ee8cb7e0ee
2 changed files with 95 additions and 1 deletions

View File

@ -114,6 +114,99 @@ iris_clear(struct pipe_context *ctx,
blorp_batch_finish(&blorp_batch);
}
static void
iris_clear_texture(struct pipe_context *ctx,
struct pipe_resource *p_res,
unsigned level,
const struct pipe_box *box,
const void *data)
{
struct iris_context *ice = (void *) ctx;
struct iris_resource *res = (void *) p_res;
struct iris_batch *batch = &ice->render_batch;
const struct gen_device_info *devinfo = &batch->screen->devinfo;
iris_batch_maybe_flush(batch, 1500);
struct blorp_batch blorp_batch;
blorp_batch_init(&ice->blorp, &blorp_batch, batch, 0);
if (util_format_is_depth_or_stencil(p_res->format)) {
const struct util_format_description *fmt_desc =
util_format_description(p_res->format);
struct iris_resource *z_res;
struct iris_resource *stencil_res;
struct blorp_surf z_surf;
struct blorp_surf stencil_surf;
float depth = 0.0;
uint8_t stencil = 0;
iris_get_depth_stencil_resources(p_res, &z_res, &stencil_res);
if (z_res) {
iris_blorp_surf_for_resource(&z_surf, &z_res->base,
ISL_AUX_USAGE_NONE, true);
fmt_desc->unpack_z_float(&depth, 0, data, 0, 1, 1);
}
if (stencil_res) {
iris_blorp_surf_for_resource(&stencil_surf, &stencil_res->base,
ISL_AUX_USAGE_NONE, true);
fmt_desc->unpack_s_8uint(&stencil, 0, data, 0, 1, 1);
}
blorp_clear_depth_stencil(&blorp_batch, &z_surf, &stencil_surf,
level, box->z, box->depth,
box->x, box->y,
box->x + box->width,
box->y + box->height,
z_res != NULL, depth,
stencil_res ? 0xff : 0, stencil);
} else {
union isl_color_value color;
bool color_write_disable[4] = { false, false, false, false };
struct blorp_surf surf;
iris_blorp_surf_for_resource(&surf, p_res, ISL_AUX_USAGE_NONE, true);
enum isl_format format = res->surf.format;
if (!isl_format_supports_rendering(devinfo, format) &&
isl_format_is_rgbx(format))
format = isl_format_rgbx_to_rgba(format);
if (!isl_format_supports_rendering(devinfo, format)) {
const struct isl_format_layout *fmtl = isl_format_get_layout(format);
// XXX: actually just get_copy_format_for_bpb from BLORP
// XXX: don't cut and paste this
switch (fmtl->bpb) {
case 8: format = ISL_FORMAT_R8_UINT; break;
case 16: format = ISL_FORMAT_R8G8_UINT; break;
case 24: format = ISL_FORMAT_R8G8B8_UINT; break;
case 32: format = ISL_FORMAT_R8G8B8A8_UINT; break;
case 48: format = ISL_FORMAT_R16G16B16_UINT; break;
case 64: format = ISL_FORMAT_R16G16B16A16_UINT; break;
case 96: format = ISL_FORMAT_R32G32B32_UINT; break;
case 128: format = ISL_FORMAT_R32G32B32A32_UINT; break;
default:
unreachable("Unknown format bpb");
}
}
isl_color_value_unpack(&color, format, data);
blorp_clear(&blorp_batch, &surf, format, ISL_SWIZZLE_IDENTITY,
level, box->z, box->depth, box->x, box->y,
box->x + box->width, box->y + box->height,
color, color_write_disable);
}
blorp_batch_finish(&blorp_batch);
}
static void
iris_clear_render_target(struct pipe_context *ctx,
struct pipe_surface *dst,
@ -142,6 +235,7 @@ void
iris_init_clear_functions(struct pipe_context *ctx)
{
ctx->clear = iris_clear;
ctx->clear_texture = iris_clear_texture;
ctx->clear_render_target = iris_clear_render_target;
ctx->clear_depth_stencil = iris_clear_depth_stencil;
}

View File

@ -162,6 +162,7 @@ iris_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_TGSI_CLOCK:
case PIPE_CAP_TGSI_BALLOT:
case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
case PIPE_CAP_CLEAR_TEXTURE:
return true;
case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
@ -286,7 +287,6 @@ iris_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
case PIPE_CAP_TGSI_TXQS:
case PIPE_CAP_SHAREABLE_SHADERS:
case PIPE_CAP_CLEAR_TEXTURE:
case PIPE_CAP_DRAW_PARAMETERS:
case PIPE_CAP_TGSI_PACK_HALF_FLOAT:
case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL: