iris: clear stencil
This commit is contained in:
@@ -35,6 +35,24 @@
|
||||
#include "iris_screen.h"
|
||||
#include "intel/compiler/brw_compiler.h"
|
||||
|
||||
static void
|
||||
split_depth_stencil_resources(struct pipe_resource *res,
|
||||
struct pipe_resource **out_z,
|
||||
struct pipe_resource **out_s)
|
||||
{
|
||||
const struct util_format_description *desc =
|
||||
util_format_description(res->format);
|
||||
|
||||
if (util_format_has_depth(desc)) {
|
||||
*out_z = res;
|
||||
*out_s = iris_resource_get_separate_stencil(res);
|
||||
} else {
|
||||
assert(util_format_has_stencil(desc));
|
||||
*out_z = NULL;
|
||||
*out_s = res;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The pipe->clear() driver hook.
|
||||
*
|
||||
@@ -60,21 +78,31 @@ iris_clear(struct pipe_context *ctx,
|
||||
|
||||
if (buffers & PIPE_CLEAR_DEPTHSTENCIL) {
|
||||
struct pipe_surface *psurf = cso_fb->zsbuf;
|
||||
struct pipe_resource *z_res;
|
||||
struct pipe_resource *stencil_res;
|
||||
struct blorp_surf z_surf;
|
||||
struct blorp_surf stencil_surf;
|
||||
const unsigned num_layers =
|
||||
psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1;
|
||||
|
||||
iris_blorp_surf_for_resource(&z_surf, psurf->texture,
|
||||
ISL_AUX_USAGE_NONE, true);
|
||||
split_depth_stencil_resources(psurf->texture, &z_res, &stencil_res);
|
||||
|
||||
blorp_clear_depth_stencil(&blorp_batch, &z_surf, NULL /* XXX */,
|
||||
if (z_res) {
|
||||
iris_blorp_surf_for_resource(&z_surf, z_res,
|
||||
ISL_AUX_USAGE_NONE, true);
|
||||
}
|
||||
|
||||
if (stencil_res) {
|
||||
iris_blorp_surf_for_resource(&stencil_surf, stencil_res,
|
||||
ISL_AUX_USAGE_NONE, true);
|
||||
}
|
||||
|
||||
blorp_clear_depth_stencil(&blorp_batch, &z_surf, &stencil_surf,
|
||||
psurf->u.tex.level, psurf->u.tex.first_layer,
|
||||
num_layers, 0, 0, psurf->width, psurf->height,
|
||||
(buffers & PIPE_CLEAR_DEPTH) != 0,
|
||||
depth, 0 /* XXX */, stencil);
|
||||
|
||||
if (buffers & PIPE_CLEAR_STENCIL)
|
||||
fprintf(stderr, "XXX: stencil clears not implemented\n");
|
||||
(buffers & PIPE_CLEAR_DEPTH) != 0, depth,
|
||||
(buffers & PIPE_CLEAR_STENCIL) ? 0xff : 0,
|
||||
stencil);
|
||||
}
|
||||
|
||||
if (buffers & PIPE_CLEAR_COLOR) {
|
||||
|
@@ -161,6 +161,15 @@ pipe_bind_to_isl_usage(unsigned bindings)
|
||||
return usage;
|
||||
}
|
||||
|
||||
struct pipe_resource *
|
||||
iris_resource_get_separate_stencil(struct pipe_resource *p_res)
|
||||
{
|
||||
/* For packed depth-stencil, we treat depth as the primary resource
|
||||
* and store S8 as the "second plane" resource.
|
||||
*/
|
||||
return p_res->next;
|
||||
}
|
||||
|
||||
static void
|
||||
iris_resource_destroy(struct pipe_screen *screen,
|
||||
struct pipe_resource *resource)
|
||||
@@ -195,15 +204,17 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
|
||||
struct iris_screen *screen = (struct iris_screen *)pscreen;
|
||||
struct gen_device_info *devinfo = &screen->devinfo;
|
||||
struct iris_resource *res = iris_alloc_resource(pscreen, templ);
|
||||
const struct util_format_description *format_desc =
|
||||
util_format_description(templ->format);
|
||||
|
||||
if (!res)
|
||||
return NULL;
|
||||
|
||||
bool depth_or_stencil = util_format_is_depth_or_stencil(templ->format);
|
||||
|
||||
const bool has_depth = util_format_has_depth(format_desc);
|
||||
uint64_t modifier = DRM_FORMAT_MOD_INVALID;
|
||||
|
||||
if (modifiers_count == 0 || !modifiers) {
|
||||
if (depth_or_stencil) {
|
||||
if (has_depth) {
|
||||
modifier = I915_FORMAT_MOD_Y_TILED;
|
||||
} else if (templ->bind & PIPE_BIND_DISPLAY_TARGET) {
|
||||
/* Display is X-tiled for historical reasons. */
|
||||
@@ -230,14 +241,21 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
|
||||
const struct isl_drm_modifier_info *mod_info =
|
||||
isl_drm_modifier_get_info(modifier);
|
||||
|
||||
enum isl_tiling tiling = templ->format == PIPE_FORMAT_S8_UINT ?
|
||||
ISL_TILING_W : mod_info->tiling;
|
||||
|
||||
isl_surf_usage_flags_t usage = pipe_bind_to_isl_usage(templ->bind);
|
||||
|
||||
if (templ->target == PIPE_TEXTURE_CUBE ||
|
||||
templ->target == PIPE_TEXTURE_CUBE_ARRAY)
|
||||
usage |= ISL_SURF_USAGE_CUBE_BIT;
|
||||
|
||||
if (depth_or_stencil && templ->usage != PIPE_USAGE_STAGING)
|
||||
usage |= ISL_SURF_USAGE_DEPTH_BIT;
|
||||
if (templ->usage != PIPE_USAGE_STAGING) {
|
||||
if (templ->format == PIPE_FORMAT_S8_UINT)
|
||||
usage |= ISL_SURF_USAGE_STENCIL_BIT;
|
||||
else if (has_depth)
|
||||
usage |= ISL_SURF_USAGE_DEPTH_BIT;
|
||||
}
|
||||
|
||||
enum pipe_format pfmt = templ->format;
|
||||
|
||||
@@ -265,7 +283,7 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
|
||||
.min_alignment_B = 0,
|
||||
.row_pitch_B = 0,
|
||||
.usage = usage,
|
||||
.tiling_flags = 1 << mod_info->tiling);
|
||||
.tiling_flags = 1 << tiling);
|
||||
assert(isl_surf_created_successfully);
|
||||
|
||||
enum iris_memory_zone memzone = IRIS_MEMZONE_OTHER;
|
||||
|
@@ -87,6 +87,8 @@ iris_resource_bo(struct pipe_resource *p_res)
|
||||
|
||||
enum isl_format iris_isl_format_for_pipe_format(enum pipe_format pf);
|
||||
|
||||
struct pipe_resource *iris_resource_get_separate_stencil(struct pipe_resource *);
|
||||
|
||||
void iris_init_screen_resource_functions(struct pipe_screen *pscreen);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user