From 68b3b7c8510c166a570940c1fc47b0abea6177ea Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alejandro=20Pi=C3=B1eiro?= Date: Wed, 20 Oct 2021 15:12:15 +0200 Subject: [PATCH] v3d: TILE_RENDERING_MODE_CFG_RENDER_TARGET_PART1 Reviewed-by: Iago Toral Quiroga Part-of: --- src/gallium/drivers/v3d/v3dx_rcl.c | 132 ++++++++++++++++++++++++++++++++----- 1 file changed, 117 insertions(+), 15 deletions(-) diff --git a/src/gallium/drivers/v3d/v3dx_rcl.c b/src/gallium/drivers/v3d/v3dx_rcl.c index fbec1a0..548bc9f 100644 --- a/src/gallium/drivers/v3d/v3dx_rcl.c +++ b/src/gallium/drivers/v3d/v3dx_rcl.c @@ -491,10 +491,66 @@ 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, uint32_t *rt_clamp) +v3d_setup_render_target(struct v3d_job *job, + int cbuf, + uint32_t *rt_bpp, + uint32_t *rt_type_clamp) { if (!job->cbufs[cbuf]) return; @@ -505,15 +561,31 @@ v3d_setup_render_target(struct v3d_job *job, int cbuf, struct v3d_surface *bsurf = v3d_surface(job->bbuf); *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; + *rt_type_clamp = v3dX(clamp_for_format_and_type)(surf->internal_type, + surf->base.format); +} #endif - else - *rt_clamp = V3D_RENDER_TARGET_CLAMP_NONE; + +#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) +{ + 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 = surf->internal_type; + *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); @@ -874,6 +966,20 @@ v3dX(emit_rcl)(struct v3d_job *job) }; } #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 } #if V3D_VERSION >= 40 && V3D_VERSION <= 42 @@ -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) { -- 2.7.4