iris: clear stencil
This commit is contained in:
@@ -35,6 +35,24 @@
|
|||||||
#include "iris_screen.h"
|
#include "iris_screen.h"
|
||||||
#include "intel/compiler/brw_compiler.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.
|
* The pipe->clear() driver hook.
|
||||||
*
|
*
|
||||||
@@ -60,21 +78,31 @@ iris_clear(struct pipe_context *ctx,
|
|||||||
|
|
||||||
if (buffers & PIPE_CLEAR_DEPTHSTENCIL) {
|
if (buffers & PIPE_CLEAR_DEPTHSTENCIL) {
|
||||||
struct pipe_surface *psurf = cso_fb->zsbuf;
|
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 z_surf;
|
||||||
|
struct blorp_surf stencil_surf;
|
||||||
const unsigned num_layers =
|
const unsigned num_layers =
|
||||||
psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1;
|
psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1;
|
||||||
|
|
||||||
iris_blorp_surf_for_resource(&z_surf, psurf->texture,
|
split_depth_stencil_resources(psurf->texture, &z_res, &stencil_res);
|
||||||
ISL_AUX_USAGE_NONE, true);
|
|
||||||
|
|
||||||
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,
|
psurf->u.tex.level, psurf->u.tex.first_layer,
|
||||||
num_layers, 0, 0, psurf->width, psurf->height,
|
num_layers, 0, 0, psurf->width, psurf->height,
|
||||||
(buffers & PIPE_CLEAR_DEPTH) != 0,
|
(buffers & PIPE_CLEAR_DEPTH) != 0, depth,
|
||||||
depth, 0 /* XXX */, stencil);
|
(buffers & PIPE_CLEAR_STENCIL) ? 0xff : 0,
|
||||||
|
stencil);
|
||||||
if (buffers & PIPE_CLEAR_STENCIL)
|
|
||||||
fprintf(stderr, "XXX: stencil clears not implemented\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buffers & PIPE_CLEAR_COLOR) {
|
if (buffers & PIPE_CLEAR_COLOR) {
|
||||||
|
@@ -161,6 +161,15 @@ pipe_bind_to_isl_usage(unsigned bindings)
|
|||||||
return usage;
|
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
|
static void
|
||||||
iris_resource_destroy(struct pipe_screen *screen,
|
iris_resource_destroy(struct pipe_screen *screen,
|
||||||
struct pipe_resource *resource)
|
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 iris_screen *screen = (struct iris_screen *)pscreen;
|
||||||
struct gen_device_info *devinfo = &screen->devinfo;
|
struct gen_device_info *devinfo = &screen->devinfo;
|
||||||
struct iris_resource *res = iris_alloc_resource(pscreen, templ);
|
struct iris_resource *res = iris_alloc_resource(pscreen, templ);
|
||||||
|
const struct util_format_description *format_desc =
|
||||||
|
util_format_description(templ->format);
|
||||||
|
|
||||||
if (!res)
|
if (!res)
|
||||||
return NULL;
|
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;
|
uint64_t modifier = DRM_FORMAT_MOD_INVALID;
|
||||||
|
|
||||||
if (modifiers_count == 0 || !modifiers) {
|
if (modifiers_count == 0 || !modifiers) {
|
||||||
if (depth_or_stencil) {
|
if (has_depth) {
|
||||||
modifier = I915_FORMAT_MOD_Y_TILED;
|
modifier = I915_FORMAT_MOD_Y_TILED;
|
||||||
} else if (templ->bind & PIPE_BIND_DISPLAY_TARGET) {
|
} else if (templ->bind & PIPE_BIND_DISPLAY_TARGET) {
|
||||||
/* Display is X-tiled for historical reasons. */
|
/* 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 =
|
const struct isl_drm_modifier_info *mod_info =
|
||||||
isl_drm_modifier_get_info(modifier);
|
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);
|
isl_surf_usage_flags_t usage = pipe_bind_to_isl_usage(templ->bind);
|
||||||
|
|
||||||
if (templ->target == PIPE_TEXTURE_CUBE ||
|
if (templ->target == PIPE_TEXTURE_CUBE ||
|
||||||
templ->target == PIPE_TEXTURE_CUBE_ARRAY)
|
templ->target == PIPE_TEXTURE_CUBE_ARRAY)
|
||||||
usage |= ISL_SURF_USAGE_CUBE_BIT;
|
usage |= ISL_SURF_USAGE_CUBE_BIT;
|
||||||
|
|
||||||
if (depth_or_stencil && templ->usage != PIPE_USAGE_STAGING)
|
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;
|
usage |= ISL_SURF_USAGE_DEPTH_BIT;
|
||||||
|
}
|
||||||
|
|
||||||
enum pipe_format pfmt = templ->format;
|
enum pipe_format pfmt = templ->format;
|
||||||
|
|
||||||
@@ -265,7 +283,7 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
|
|||||||
.min_alignment_B = 0,
|
.min_alignment_B = 0,
|
||||||
.row_pitch_B = 0,
|
.row_pitch_B = 0,
|
||||||
.usage = usage,
|
.usage = usage,
|
||||||
.tiling_flags = 1 << mod_info->tiling);
|
.tiling_flags = 1 << tiling);
|
||||||
assert(isl_surf_created_successfully);
|
assert(isl_surf_created_successfully);
|
||||||
|
|
||||||
enum iris_memory_zone memzone = IRIS_MEMZONE_OTHER;
|
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);
|
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);
|
void iris_init_screen_resource_functions(struct pipe_screen *pscreen);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user