v3d: TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25450>
This commit is contained in:
Alejandro Piñeiro 2021-10-20 15:12:15 +02:00 committed by Marge Bot
parent da11be4bdf
commit 68b3b7c851

View file

@ -491,10 +491,88 @@ v3d_rcl_emit_generic_per_tile_list(struct v3d_job *job, int layer)
}
}
#if V3D_VERSION > 33
/* Note that for v71, render target cfg packets has just one field that
* combined the internal type and clamp mode. For simplicity we keep just one
* helper.
*
* Note: rt_type is in fact a "enum V3DX(Internal_Type)".
*
*/
static uint32_t
v3dX(clamp_for_format_and_type)(uint32_t rt_type,
enum pipe_format format)
{
#if V3D_VERSION >= 40 && V3D_VERSION <= 42
if (util_format_is_srgb(format)) {
return V3D_RENDER_TARGET_CLAMP_NORM;
#if V3D_VERSION >= 42
} else if (util_format_is_pure_integer(format)) {
return V3D_RENDER_TARGET_CLAMP_INT;
#endif
} else {
return V3D_RENDER_TARGET_CLAMP_NONE;
}
#endif
#if V3D_VERSION >= 71
switch (rt_type) {
case V3D_INTERNAL_TYPE_8I:
return V3D_RENDER_TARGET_TYPE_CLAMP_8I_CLAMPED;
case V3D_INTERNAL_TYPE_8UI:
return V3D_RENDER_TARGET_TYPE_CLAMP_8UI_CLAMPED;
case V3D_INTERNAL_TYPE_8:
return V3D_RENDER_TARGET_TYPE_CLAMP_8;
case V3D_INTERNAL_TYPE_16I:
return V3D_RENDER_TARGET_TYPE_CLAMP_16I_CLAMPED;
case V3D_INTERNAL_TYPE_16UI:
return V3D_RENDER_TARGET_TYPE_CLAMP_16UI_CLAMPED;
case V3D_INTERNAL_TYPE_16F:
return util_format_is_srgb(format) ?
V3D_RENDER_TARGET_TYPE_CLAMP_16F_CLAMP_NORM :
V3D_RENDER_TARGET_TYPE_CLAMP_16F;
case V3D_INTERNAL_TYPE_32I:
return V3D_RENDER_TARGET_TYPE_CLAMP_32I_CLAMPED;
case V3D_INTERNAL_TYPE_32UI:
return V3D_RENDER_TARGET_TYPE_CLAMP_32UI_CLAMPED;
case V3D_INTERNAL_TYPE_32F:
return V3D_RENDER_TARGET_TYPE_CLAMP_32F;
default:
unreachable("Unknown internal render target type");
}
return V3D_RENDER_TARGET_TYPE_CLAMP_INVALID;
#endif
return 0;
}
#endif
#if V3D_VERSION >= 71
static void
v3d_setup_render_target(struct v3d_job *job,
int cbuf,
uint32_t *rt_bpp,
uint32_t *rt_type_clamp)
{
if (!job->cbufs[cbuf])
return;
struct v3d_surface *surf = v3d_surface(job->cbufs[cbuf]);
*rt_bpp = surf->internal_bpp;
if (job->bbuf) {
struct v3d_surface *bsurf = v3d_surface(job->bbuf);
*rt_bpp = MAX2(*rt_bpp, bsurf->internal_bpp);
}
*rt_type_clamp = v3dX(clamp_for_format_and_type)(surf->internal_type,
surf->base.format);
}
#endif
#if V3D_VERSION >= 40 && V3D_VERSION <= 42
static void
v3d_setup_render_target(struct v3d_job *job, int cbuf,
uint32_t *rt_bpp, uint32_t *rt_type, uint32_t *rt_clamp)
v3d_setup_render_target(struct v3d_job *job,
int cbuf,
uint32_t *rt_bpp,
uint32_t *rt_type,
uint32_t *rt_clamp)
{
if (!job->cbufs[cbuf])
return;
@ -506,14 +584,8 @@ v3d_setup_render_target(struct v3d_job *job, int cbuf,
*rt_bpp = MAX2(*rt_bpp, bsurf->internal_bpp);
}
*rt_type = surf->internal_type;
if (util_format_is_srgb(surf->base.format))
*rt_clamp = V3D_RENDER_TARGET_CLAMP_NORM;
#if V3D_VERSION >= 42
else if (util_format_is_pure_integer(surf->base.format))
*rt_clamp = V3D_RENDER_TARGET_CLAMP_INT;
#endif
else
*rt_clamp = V3D_RENDER_TARGET_CLAMP_NONE;
*rt_clamp = v3dX(clamp_for_format_and_type)(surf->internal_type,
surf->base.format);
}
#endif
@ -803,10 +875,30 @@ v3dX(emit_rcl)(struct v3d_job *job)
}
#if V3D_VERSION >= 71
uint32_t base_addr = 0;
/* If we don't have any color RTs, we sill need to emit one and flag
* it as not used using stride = 1
*/
if (job->nr_cbufs == 0) {
cl_emit(&job->rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) {
rt.stride = 1; /* Unused */
}
}
#endif
for (int i = 0; i < job->nr_cbufs; i++) {
struct pipe_surface *psurf = job->cbufs[i];
if (!psurf)
if (!psurf) {
#if V3D_VERSION >= 71
cl_emit(&job->rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) {
rt.render_target_number = i;
rt.stride = 1; /* Unused */
}
#endif
continue;
}
struct v3d_surface *surf = v3d_surface(psurf);
struct v3d_resource *rsc = v3d_resource(psurf->texture);
@ -873,6 +965,20 @@ v3dX(emit_rcl)(struct v3d_job *job)
clear.render_target_number = i;
};
}
#endif
#if V3D_VERSION >= 71
cl_emit(&job->rcl, TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1, rt) {
rt.clear_color_low_bits = job->clear_color[i][0];
v3d_setup_render_target(job, i, &rt.internal_bpp,
&rt.internal_type_and_clamping);
rt.stride =
v3d_compute_rt_row_row_stride_128_bits(job->tile_width,
v3d_internal_bpp_words(rt.internal_bpp));
rt.base_address = base_addr;
rt.render_target_number = i;
base_addr += (job->tile_height * rt.stride) / 8;
}
#endif
}
@ -897,10 +1003,6 @@ v3dX(emit_rcl)(struct v3d_job *job)
}
#endif
#if V3D_VERSION >= 71
unreachable("HW generation 71 not supported yet.");
#endif
#if V3D_VERSION < 40
/* FIXME: Don't bother emitting if we don't load/clear Z/S. */
if (job->zsbuf) {