From 81077a4c7db6e56b373fa79433334859d7aab651 Mon Sep 17 00:00:00 2001 From: Karmjit Mahil Date: Thu, 26 May 2022 14:22:08 +0100 Subject: [PATCH] pvr: Add csb enum helper funciton header. A new header is introduced which groups all vk, uint, rogue types to csb enum type conversions. Signed-off-by: Karmjit Mahil Reviewed-by: Frank Binns Part-of: --- src/imagination/vulkan/pvr_cmd_buffer.c | 63 ++------- src/imagination/vulkan/pvr_csb_enum_helpers.h | 122 ++++++++++++++++++ src/imagination/vulkan/pvr_job_render.c | 21 +-- src/imagination/vulkan/pvr_pipeline.c | 3 +- src/imagination/vulkan/pvr_private.h | 18 --- 5 files changed, 139 insertions(+), 88 deletions(-) create mode 100644 src/imagination/vulkan/pvr_csb_enum_helpers.h diff --git a/src/imagination/vulkan/pvr_cmd_buffer.c b/src/imagination/vulkan/pvr_cmd_buffer.c index 4940df6a659..084289e917a 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.c +++ b/src/imagination/vulkan/pvr_cmd_buffer.c @@ -33,6 +33,7 @@ #include "hwdef/rogue_hw_utils.h" #include "pvr_bo.h" #include "pvr_csb.h" +#include "pvr_csb_enum_helpers.h" #include "pvr_device_info.h" #include "pvr_end_of_tile.h" #include "pvr_formats.h" @@ -3196,46 +3197,6 @@ static void pvr_setup_output_select(struct pvr_cmd_buffer *const cmd_buffer) } } -/* clang-format off */ -static enum PVRX(TA_OBJTYPE) -pvr_ppp_state_get_ispa_objtype_from_vk(const VkPrimitiveTopology topology) -/* clang-format on */ -{ - switch (topology) { - case VK_PRIMITIVE_TOPOLOGY_POINT_LIST: - return PVRX(TA_OBJTYPE_SPRITE_01UV); - - case VK_PRIMITIVE_TOPOLOGY_LINE_LIST: - case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP: - case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY: - case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY: - return PVRX(TA_OBJTYPE_LINE); - - case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST: - case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: - case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN: - case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY: - case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY: - return PVRX(TA_OBJTYPE_TRIANGLE); - - default: - unreachable("Invalid topology."); - return 0; - } -} - -static inline enum PVRX(TA_CMPMODE) pvr_cmpmode(VkCompareOp op) -{ - /* enum values are identical, so we can just cast the input directly. */ - return (enum PVRX(TA_CMPMODE))op; -} - -static inline enum PVRX(TA_ISPB_STENCILOP) pvr_stencilop(VkStencilOp op) -{ - /* enum values are identical, so we can just cast the input directly. */ - return (enum PVRX(TA_ISPB_STENCILOP))op; -} - static void pvr_setup_isp_faces_and_control( struct pvr_cmd_buffer *const cmd_buffer, struct pvr_cmd_struct(TA_STATE_ISPA) *const ispa_out) @@ -3262,8 +3223,7 @@ static void pvr_setup_isp_faces_and_control( const bool disable_all = raster_discard_enabled || !attachment; const VkPrimitiveTopology topology = gfx_pipeline->input_asm_state.topology; - const enum PVRX(TA_OBJTYPE) - obj_type = pvr_ppp_state_get_ispa_objtype_from_vk(topology); + const enum PVRX(TA_OBJTYPE) obj_type = pvr_ta_objtype(topology); const bool disable_stencil_write = disable_all; const bool disable_stencil_test = @@ -3304,7 +3264,7 @@ static void pvr_setup_isp_faces_and_control( if (disable_depth_test) ispa.dcmpmode = PVRX(TA_CMPMODE_ALWAYS); else - ispa.dcmpmode = pvr_cmpmode(gfx_pipeline->depth_compare_op); + ispa.dcmpmode = pvr_ta_cmpmode(gfx_pipeline->depth_compare_op); /* FIXME: Can we just have this and remove the assignment above? * The user provides a depthTestEnable at vkCreateGraphicsPipelines() @@ -3360,11 +3320,12 @@ static void pvr_setup_isp_faces_and_control( (!disable_stencil_write) * dynamic_state->write_mask.front; ispb.scmpmask = dynamic_state->compare_mask.front; - ispb.sop3 = pvr_stencilop(gfx_pipeline->stencil_front.pass_op); - ispb.sop2 = pvr_stencilop(gfx_pipeline->stencil_front.depth_fail_op); - ispb.sop1 = pvr_stencilop(gfx_pipeline->stencil_front.fail_op); + ispb.sop3 = pvr_ta_stencilop(gfx_pipeline->stencil_front.pass_op); + ispb.sop2 = + pvr_ta_stencilop(gfx_pipeline->stencil_front.depth_fail_op); + ispb.sop1 = pvr_ta_stencilop(gfx_pipeline->stencil_front.fail_op); - ispb.scmpmode = pvr_cmpmode(gfx_pipeline->stencil_front.compare_op); + ispb.scmpmode = pvr_ta_cmpmode(gfx_pipeline->stencil_front.compare_op); } pvr_csb_pack (&back_b, TA_STATE_ISPB, ispb) { @@ -3372,11 +3333,11 @@ static void pvr_setup_isp_faces_and_control( (!disable_stencil_write) * dynamic_state->write_mask.back; ispb.scmpmask = dynamic_state->compare_mask.back; - ispb.sop3 = pvr_stencilop(gfx_pipeline->stencil_back.pass_op); - ispb.sop2 = pvr_stencilop(gfx_pipeline->stencil_back.depth_fail_op); - ispb.sop1 = pvr_stencilop(gfx_pipeline->stencil_back.fail_op); + ispb.sop3 = pvr_ta_stencilop(gfx_pipeline->stencil_back.pass_op); + ispb.sop2 = pvr_ta_stencilop(gfx_pipeline->stencil_back.depth_fail_op); + ispb.sop1 = pvr_ta_stencilop(gfx_pipeline->stencil_back.fail_op); - ispb.scmpmode = pvr_cmpmode(gfx_pipeline->stencil_back.compare_op); + ispb.scmpmode = pvr_ta_cmpmode(gfx_pipeline->stencil_back.compare_op); } } diff --git a/src/imagination/vulkan/pvr_csb_enum_helpers.h b/src/imagination/vulkan/pvr_csb_enum_helpers.h new file mode 100644 index 00000000000..0cd945e2e4a --- /dev/null +++ b/src/imagination/vulkan/pvr_csb_enum_helpers.h @@ -0,0 +1,122 @@ +/* + * Copyright © 2022 Imagination Technologies Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef PVR_CSB_ENUM_HELPERS_H +#define PVR_CSB_ENUM_HELPERS_H + +#include +#include + +#include "pvr_csb.h" +#include "rogue/rogue.h" +#include "util/macros.h" + +/****************************************************************************** + CR + ******************************************************************************/ + +/* clang-format off */ +static inline enum PVRX(CR_ISP_AA_MODE_TYPE) +pvr_cr_isp_aa_mode_type(uint32_t samples) +/* clang-format on */ +{ + switch (samples) { + case 1: + return PVRX(CR_ISP_AA_MODE_TYPE_AA_NONE); + case 2: + return PVRX(CR_ISP_AA_MODE_TYPE_AA_2X); + case 3: + return PVRX(CR_ISP_AA_MODE_TYPE_AA_4X); + case 8: + return PVRX(CR_ISP_AA_MODE_TYPE_AA_8X); + default: + unreachable("Unsupported number of samples"); + } +} + +/****************************************************************************** + PDS + ******************************************************************************/ + +/* clang-format off */ +static inline enum PVRX(PDSINST_DOUTU_SAMPLE_RATE) +pvr_pdsinst_doutu_sample_rate_from_rogue(enum rogue_msaa_mode msaa_mode) +/* clang-format on */ +{ + switch (msaa_mode) { + case ROGUE_MSAA_MODE_PIXEL: + return PVRX(PDSINST_DOUTU_SAMPLE_RATE_INSTANCE); + case ROGUE_MSAA_MODE_SELECTIVE: + return PVRX(PDSINST_DOUTU_SAMPLE_RATE_SELECTIVE); + case ROGUE_MSAA_MODE_FULL: + return PVRX(PDSINST_DOUTU_SAMPLE_RATE_FULL); + default: + unreachable("Undefined MSAA mode."); + } +} + +/****************************************************************************** + TA + ******************************************************************************/ + +static inline enum PVRX(TA_CMPMODE) pvr_ta_cmpmode(VkCompareOp op) +{ + /* enum values are identical, so we can just cast the input directly. */ + return (enum PVRX(TA_CMPMODE))op; +} + +static inline enum PVRX(TA_ISPB_STENCILOP) pvr_ta_stencilop(VkStencilOp op) +{ + /* enum values are identical, so we can just cast the input directly. */ + return (enum PVRX(TA_ISPB_STENCILOP))op; +} + +/* clang-format off */ +static inline enum PVRX(TA_OBJTYPE) +pvr_ta_objtype(VkPrimitiveTopology topology) +/* clang-format on */ +{ + switch (topology) { + case VK_PRIMITIVE_TOPOLOGY_POINT_LIST: + return PVRX(TA_OBJTYPE_SPRITE_01UV); + + case VK_PRIMITIVE_TOPOLOGY_LINE_LIST: + case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP: + case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY: + case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY: + return PVRX(TA_OBJTYPE_LINE); + + case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST: + case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: + case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN: + case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY: + case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY: + return PVRX(TA_OBJTYPE_TRIANGLE); + + default: + unreachable("Invalid topology."); + return 0; + } +} + +#endif /* PVR_CSB_ENUM_HELPERS_H */ diff --git a/src/imagination/vulkan/pvr_job_render.c b/src/imagination/vulkan/pvr_job_render.c index ba5f4891fb6..cdb77ffe2e4 100644 --- a/src/imagination/vulkan/pvr_job_render.c +++ b/src/imagination/vulkan/pvr_job_render.c @@ -30,6 +30,7 @@ #include "hwdef/rogue_hw_utils.h" #include "pvr_bo.h" #include "pvr_csb.h" +#include "pvr_csb_enum_helpers.h" #include "pvr_job_common.h" #include "pvr_job_context.h" #include "pvr_job_render.h" @@ -1293,29 +1294,13 @@ pvr_render_job_ws_fragment_state_init(struct pvr_render_ctx *ctx, struct pvr_render_job *job, struct pvr_winsys_fragment_state *state) { + const enum PVRX(CR_ISP_AA_MODE_TYPE) + isp_aa_mode = pvr_cr_isp_aa_mode_type(job->samples); const struct pvr_device_info *dev_info = &ctx->device->pdevice->dev_info; - enum PVRX(CR_ISP_AA_MODE_TYPE) isp_aa_mode; uint32_t isp_ctl; /* FIXME: what to do when job->run_frag is false? */ - switch (job->samples) { - case 1: - isp_aa_mode = PVRX(CR_ISP_AA_MODE_TYPE_AA_NONE); - break; - case 2: - isp_aa_mode = PVRX(CR_ISP_AA_MODE_TYPE_AA_2X); - break; - case 3: - isp_aa_mode = PVRX(CR_ISP_AA_MODE_TYPE_AA_4X); - break; - case 8: - isp_aa_mode = PVRX(CR_ISP_AA_MODE_TYPE_AA_8X); - break; - default: - unreachable("Unsupported number of samples"); - } - /* FIXME: pass in the number of samples rather than isp_aa_mode? */ pvr_setup_tiles_in_flight(dev_info, isp_aa_mode, diff --git a/src/imagination/vulkan/pvr_pipeline.c b/src/imagination/vulkan/pvr_pipeline.c index 09995357df3..97772100cf2 100644 --- a/src/imagination/vulkan/pvr_pipeline.c +++ b/src/imagination/vulkan/pvr_pipeline.c @@ -35,6 +35,7 @@ #include "nir/nir.h" #include "pvr_bo.h" #include "pvr_csb.h" +#include "pvr_csb_enum_helpers.h" #include "pvr_pds.h" #include "pvr_private.h" #include "pvr_shader.h" @@ -162,7 +163,7 @@ VkResult pvr_pds_fragment_program_create_and_upload( struct pvr_pds_upload *const pds_upload_out) { const enum PVRX(PDSINST_DOUTU_SAMPLE_RATE) - sample_rate = pvr_sample_rate_from_usc_msaa_mode(msaa_mode); + sample_rate = pvr_pdsinst_doutu_sample_rate_from_rogue(msaa_mode); struct pvr_pds_kickusc_program program = { 0 }; uint32_t staging_buffer_size; uint32_t *staging_buffer; diff --git a/src/imagination/vulkan/pvr_private.h b/src/imagination/vulkan/pvr_private.h index bfdded95ba5..f366753a8e2 100644 --- a/src/imagination/vulkan/pvr_private.h +++ b/src/imagination/vulkan/pvr_private.h @@ -1298,24 +1298,6 @@ to_pvr_graphics_pipeline(struct pvr_pipeline *pipeline) return container_of(pipeline, struct pvr_graphics_pipeline, base); } -/* FIXME: Place this in USC specific header? */ -/* clang-format off */ -static inline enum PVRX(PDSINST_DOUTU_SAMPLE_RATE) -pvr_sample_rate_from_usc_msaa_mode(enum rogue_msaa_mode msaa_mode) -/* clang-format on */ -{ - switch (msaa_mode) { - case ROGUE_MSAA_MODE_PIXEL: - return PVRX(PDSINST_DOUTU_SAMPLE_RATE_INSTANCE); - case ROGUE_MSAA_MODE_SELECTIVE: - return PVRX(PDSINST_DOUTU_SAMPLE_RATE_SELECTIVE); - case ROGUE_MSAA_MODE_FULL: - return PVRX(PDSINST_DOUTU_SAMPLE_RATE_FULL); - default: - unreachable("Undefined MSAA mode."); - } -} - VkResult pvr_pds_fragment_program_create_and_upload( struct pvr_device *device, const VkAllocationCallbacks *allocator,