mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 22:00:13 +01:00
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:
parent
308076fd55
commit
7a30517cce
3 changed files with 94 additions and 5 deletions
|
|
@ -369,6 +369,28 @@ vc5_emit_rcl(struct vc5_job *job)
|
||||||
|
|
||||||
if (job->resolve & PIPE_CLEAR_DEPTHSTENCIL)
|
if (job->resolve & PIPE_CLEAR_DEPTHSTENCIL)
|
||||||
rsc->writes++;
|
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. */
|
/* Ends rendering mode config. */
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,9 @@
|
||||||
#include "util/u_format.h"
|
#include "util/u_format.h"
|
||||||
#include "util/u_inlines.h"
|
#include "util/u_inlines.h"
|
||||||
#include "util/u_surface.h"
|
#include "util/u_surface.h"
|
||||||
|
#include "util/u_transfer_helper.h"
|
||||||
#include "util/u_upload_mgr.h"
|
#include "util/u_upload_mgr.h"
|
||||||
|
#include "util/u_format_zs.h"
|
||||||
|
|
||||||
#include "drm_fourcc.h"
|
#include "drm_fourcc.h"
|
||||||
#include "vc5_screen.h"
|
#include "vc5_screen.h"
|
||||||
|
|
@ -368,6 +370,7 @@ vc5_resource_destroy(struct pipe_screen *pscreen,
|
||||||
struct pipe_resource *prsc)
|
struct pipe_resource *prsc)
|
||||||
{
|
{
|
||||||
struct vc5_resource *rsc = vc5_resource(prsc);
|
struct vc5_resource *rsc = vc5_resource(prsc);
|
||||||
|
|
||||||
vc5_bo_unreference(&rsc->bo);
|
vc5_bo_unreference(&rsc->bo);
|
||||||
free(rsc);
|
free(rsc);
|
||||||
}
|
}
|
||||||
|
|
@ -607,6 +610,8 @@ vc5_resource_create_with_modifiers(struct pipe_screen *pscreen,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rsc->internal_format = prsc->format;
|
||||||
|
|
||||||
vc5_setup_slices(rsc);
|
vc5_setup_slices(rsc);
|
||||||
if (!vc5_resource_bo_alloc(rsc))
|
if (!vc5_resource_bo_alloc(rsc))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
@ -719,6 +724,10 @@ vc5_create_surface(struct pipe_context *pctx,
|
||||||
unsigned level = surf_tmpl->u.tex.level;
|
unsigned level = surf_tmpl->u.tex.level;
|
||||||
struct vc5_resource_slice *slice = &rsc->slices[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_reference_init(&psurf->reference, 1);
|
||||||
pipe_resource_reference(&psurf->texture, ptex);
|
pipe_resource_reference(&psurf->texture, ptex);
|
||||||
|
|
||||||
|
|
@ -733,6 +742,15 @@ vc5_create_surface(struct pipe_context *pctx,
|
||||||
surface->offset = (slice->offset +
|
surface->offset = (slice->offset +
|
||||||
psurf->u.tex.first_layer * rsc->cube_map_stride);
|
psurf->u.tex.first_layer * rsc->cube_map_stride);
|
||||||
surface->tiling = slice->tiling;
|
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);
|
surface->format = vc5_get_rt_format(psurf->format);
|
||||||
|
|
||||||
if (util_format_is_depth_or_stencil(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 =
|
surface->padded_height_of_output_image_in_uif_blocks =
|
||||||
((slice->size / slice->stride) /
|
((slice->size / slice->stride) /
|
||||||
(2 * vc5_utile_height(rsc->cpp)));
|
(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;
|
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
|
void
|
||||||
vc5_resource_screen_init(struct pipe_screen *pscreen)
|
vc5_resource_screen_init(struct pipe_screen *pscreen)
|
||||||
{
|
{
|
||||||
pscreen->resource_create_with_modifiers =
|
pscreen->resource_create_with_modifiers =
|
||||||
vc5_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_from_handle = vc5_resource_from_handle;
|
||||||
pscreen->resource_get_handle = vc5_resource_get_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
|
void
|
||||||
vc5_resource_context_init(struct pipe_context *pctx)
|
vc5_resource_context_init(struct pipe_context *pctx)
|
||||||
{
|
{
|
||||||
pctx->transfer_map = vc5_resource_transfer_map;
|
pctx->transfer_map = u_transfer_helper_transfer_map;
|
||||||
pctx->transfer_flush_region = u_default_transfer_flush_region;
|
pctx->transfer_flush_region = u_transfer_helper_transfer_flush_region;
|
||||||
pctx->transfer_unmap = vc5_resource_transfer_unmap;
|
pctx->transfer_unmap = u_transfer_helper_transfer_unmap;
|
||||||
pctx->buffer_subdata = u_default_buffer_subdata;
|
pctx->buffer_subdata = u_default_buffer_subdata;
|
||||||
pctx->texture_subdata = u_default_texture_subdata;
|
pctx->texture_subdata = u_default_texture_subdata;
|
||||||
pctx->create_surface = vc5_create_surface;
|
pctx->create_surface = vc5_create_surface;
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,9 @@ struct vc5_resource_slice {
|
||||||
struct vc5_surface {
|
struct vc5_surface {
|
||||||
struct pipe_surface base;
|
struct pipe_surface base;
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
|
uint32_t separate_stencil_offset;
|
||||||
enum vc5_tiling_mode tiling;
|
enum vc5_tiling_mode tiling;
|
||||||
|
enum vc5_tiling_mode separate_stencil_tiling;
|
||||||
/**
|
/**
|
||||||
* Output image format for TILE_RENDERING_MODE_CONFIGURATION
|
* Output image format for TILE_RENDERING_MODE_CONFIGURATION
|
||||||
*/
|
*/
|
||||||
|
|
@ -102,6 +104,7 @@ struct vc5_surface {
|
||||||
uint8_t internal_bpp;
|
uint8_t internal_bpp;
|
||||||
|
|
||||||
uint32_t padded_height_of_output_image_in_uif_blocks;
|
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 {
|
struct vc5_resource {
|
||||||
|
|
@ -130,6 +133,11 @@ struct vc5_resource {
|
||||||
* buffer) may get marked.
|
* buffer) may get marked.
|
||||||
*/
|
*/
|
||||||
uint32_t initialized_buffers;
|
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 *
|
static inline struct vc5_resource *
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue