iris: implement ARB_clear_texture
This commit is contained in:
parent
84b30a2900
commit
ee8cb7e0ee
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue