broadcom/vc5: Start adding support for rendering to Z32F_S8X24_UINT.

There may be some more RCL work to be done (I think I need to split my Z/S
stores when doing separate stencil), but this gets piglit's "texwrap
GL_ARB_depth_buffer_float" working.

v2: Unwrap the z32f_wrapper before calling the helper, rather than having
    the helper have a callback.
v3: Rebase on Rob Clark's u_transfer_helper instead
This commit is contained in:
Eric Anholt 2017-12-05 18:58:41 -08:00
parent 308076fd55
commit 7a30517cce
3 changed files with 94 additions and 5 deletions

View file

@ -369,6 +369,28 @@ vc5_emit_rcl(struct vc5_job *job)
if (job->resolve & PIPE_CLEAR_DEPTHSTENCIL)
rsc->writes++;
/* Emit the separate stencil packet if we have a resource for
* it. The HW will only load/store this buffer if the
* Z/Stencil config doesn't have stencil in its format.
*/
if (rsc->separate_stencil) {
cl_emit(&job->rcl,
TILE_RENDERING_MODE_CONFIGURATION_Z_STENCIL_CONFIG,
zs) {
zs.address =
cl_address(rsc->separate_stencil->bo,
surf->separate_stencil_offset);
zs.z_stencil_id = 1; /* Separate stencil */
zs.padded_height_of_output_image_in_uif_blocks =
surf->separate_stencil_padded_height_of_output_image_in_uif_blocks;
assert(surf->tiling != VC5_TILING_RASTER);
zs.memory_format = surf->separate_stencil_tiling;
}
}
}
/* Ends rendering mode config. */

View file

@ -27,7 +27,9 @@
#include "util/u_format.h"
#include "util/u_inlines.h"
#include "util/u_surface.h"
#include "util/u_transfer_helper.h"
#include "util/u_upload_mgr.h"
#include "util/u_format_zs.h"
#include "drm_fourcc.h"
#include "vc5_screen.h"
@ -368,6 +370,7 @@ vc5_resource_destroy(struct pipe_screen *pscreen,
struct pipe_resource *prsc)
{
struct vc5_resource *rsc = vc5_resource(prsc);
vc5_bo_unreference(&rsc->bo);
free(rsc);
}
@ -607,6 +610,8 @@ vc5_resource_create_with_modifiers(struct pipe_screen *pscreen,
return NULL;
}
rsc->internal_format = prsc->format;
vc5_setup_slices(rsc);
if (!vc5_resource_bo_alloc(rsc))
goto fail;
@ -719,6 +724,10 @@ vc5_create_surface(struct pipe_context *pctx,
unsigned level = surf_tmpl->u.tex.level;
struct vc5_resource_slice *slice = &rsc->slices[level];
struct vc5_resource_slice *separate_stencil_slice = NULL;
if (rsc->separate_stencil)
separate_stencil_slice = &rsc->separate_stencil->slices[level];
pipe_reference_init(&psurf->reference, 1);
pipe_resource_reference(&psurf->texture, ptex);
@ -733,6 +742,15 @@ vc5_create_surface(struct pipe_context *pctx,
surface->offset = (slice->offset +
psurf->u.tex.first_layer * rsc->cube_map_stride);
surface->tiling = slice->tiling;
if (separate_stencil_slice) {
surface->separate_stencil_offset =
(separate_stencil_slice->offset +
psurf->u.tex.first_layer *
rsc->separate_stencil->cube_map_stride);
surface->separate_stencil_tiling =
separate_stencil_slice->tiling;
}
surface->format = vc5_get_rt_format(psurf->format);
if (util_format_is_depth_or_stencil(psurf->format)) {
@ -760,6 +778,13 @@ vc5_create_surface(struct pipe_context *pctx,
surface->padded_height_of_output_image_in_uif_blocks =
((slice->size / slice->stride) /
(2 * vc5_utile_height(rsc->cpp)));
if (separate_stencil_slice) {
surface->separate_stencil_padded_height_of_output_image_in_uif_blocks =
((separate_stencil_slice->size /
separate_stencil_slice->stride) /
(2 * vc5_utile_height(rsc->separate_stencil->cpp)));
}
}
return &surface->base;
@ -780,23 +805,57 @@ vc5_flush_resource(struct pipe_context *pctx, struct pipe_resource *resource)
*/
}
static enum pipe_format
vc5_resource_get_internal_format(struct pipe_resource *prsc)
{
return vc5_resource(prsc)->internal_format;
}
static void
vc5_resource_set_stencil(struct pipe_resource *prsc,
struct pipe_resource *stencil)
{
vc5_resource(prsc)->separate_stencil = vc5_resource(stencil);
}
static struct pipe_resource *
vc5_resource_get_stencil(struct pipe_resource *prsc)
{
struct vc5_resource *rsc = vc5_resource(prsc);
return &rsc->separate_stencil->base;
}
static const struct u_transfer_vtbl transfer_vtbl = {
.resource_create = vc5_resource_create,
.resource_destroy = vc5_resource_destroy,
.transfer_map = vc5_resource_transfer_map,
.transfer_unmap = vc5_resource_transfer_unmap,
.transfer_flush_region = u_default_transfer_flush_region,
.get_internal_format = vc5_resource_get_internal_format,
.set_stencil = vc5_resource_set_stencil,
.get_stencil = vc5_resource_get_stencil,
};
void
vc5_resource_screen_init(struct pipe_screen *pscreen)
{
pscreen->resource_create_with_modifiers =
vc5_resource_create_with_modifiers;
pscreen->resource_create = vc5_resource_create;
pscreen->resource_create = u_transfer_helper_resource_create;
pscreen->resource_from_handle = vc5_resource_from_handle;
pscreen->resource_get_handle = vc5_resource_get_handle;
pscreen->resource_destroy = vc5_resource_destroy;
pscreen->resource_destroy = u_transfer_helper_resource_destroy;
pscreen->transfer_helper = u_transfer_helper_create(&transfer_vtbl,
true, false, false);
}
void
vc5_resource_context_init(struct pipe_context *pctx)
{
pctx->transfer_map = vc5_resource_transfer_map;
pctx->transfer_flush_region = u_default_transfer_flush_region;
pctx->transfer_unmap = vc5_resource_transfer_unmap;
pctx->transfer_map = u_transfer_helper_transfer_map;
pctx->transfer_flush_region = u_transfer_helper_transfer_flush_region;
pctx->transfer_unmap = u_transfer_helper_transfer_unmap;
pctx->buffer_subdata = u_default_buffer_subdata;
pctx->texture_subdata = u_default_texture_subdata;
pctx->create_surface = vc5_create_surface;

View file

@ -83,7 +83,9 @@ struct vc5_resource_slice {
struct vc5_surface {
struct pipe_surface base;
uint32_t offset;
uint32_t separate_stencil_offset;
enum vc5_tiling_mode tiling;
enum vc5_tiling_mode separate_stencil_tiling;
/**
* Output image format for TILE_RENDERING_MODE_CONFIGURATION
*/
@ -102,6 +104,7 @@ struct vc5_surface {
uint8_t internal_bpp;
uint32_t padded_height_of_output_image_in_uif_blocks;
uint32_t separate_stencil_padded_height_of_output_image_in_uif_blocks;
};
struct vc5_resource {
@ -130,6 +133,11 @@ struct vc5_resource {
* buffer) may get marked.
*/
uint32_t initialized_buffers;
enum pipe_format internal_format;
/* Resource storing the S8 part of a Z32F_S8 resource, or NULL. */
struct vc5_resource *separate_stencil;
};
static inline struct vc5_resource *