diff --git a/src/imagination/pco/meson.build b/src/imagination/pco/meson.build index 6ca4f1a5e8f..d0b64938738 100644 --- a/src/imagination/pco/meson.build +++ b/src/imagination/pco/meson.build @@ -1,12 +1,14 @@ # Copyright © 2024 Imagination Technologies Ltd. # SPDX-License-Identifier: MIT -inc_powervr_compiler = include_directories([ - '.', -]) +inc_powervr_compiler = include_directories(['.']) libpowervr_compiler_files = files( 'pco.c', + 'pco_binary.c', + 'pco_ir.c', + 'pco_nir.c', + 'pco_trans_nir.c', ) libpowervr_compiler = static_library( diff --git a/src/imagination/pco/pco.c b/src/imagination/pco/pco.c index b420b228d4b..02adc529241 100644 --- a/src/imagination/pco/pco.c +++ b/src/imagination/pco/pco.c @@ -9,3 +9,50 @@ * * \brief Main compiler interface. */ + +#include "pco.h" +#include "pco_internal.h" +#include "util/macros.h" +#include "util/ralloc.h" + +/** + * \brief Allocates and sets up a PCO compiler context. + * + * \param[in] dev_info Device info. + * \param[in] mem_ctx Ralloc memory allocation context. + * \return The PCO compiler context, or NULL on failure. + */ +pco_ctx *pco_ctx_create(const struct pvr_device_info *dev_info, void *mem_ctx) +{ + pco_ctx *ctx = rzalloc_size(mem_ctx, sizeof(*ctx)); + + ctx->dev_info = dev_info; + + return ctx; +} + +/** + * \brief Returns the device/core-specific SPIR-V to NIR options for a PCO + * compiler context. + * + * \param[in] ctx PCO compiler context. + * \return The device/core-specific SPIR-V to NIR options. + */ +const struct spirv_to_nir_options *pco_spirv_options(pco_ctx *ctx) +{ + unreachable("finishme: pco_spirv_options"); + return &ctx->spirv_options; +} + +/** + * \brief Returns the device/core-specific NIR options for a PCO compiler + * context. + * + * \param[in] ctx PCO compiler context. + * \return The device/core-specific NIR options. + */ +const nir_shader_compiler_options *pco_nir_options(pco_ctx *ctx) +{ + unreachable("finishme: pco_nir_options"); + return &ctx->nir_options; +} diff --git a/src/imagination/pco/pco.h b/src/imagination/pco/pco.h new file mode 100644 index 00000000000..ad26b545977 --- /dev/null +++ b/src/imagination/pco/pco.h @@ -0,0 +1,45 @@ +/* + * Copyright © 2024 Imagination Technologies Ltd. + * + * SPDX-License-Identifier: MIT + */ + +#ifndef PCO_H +#define PCO_H + +/** + * \file pco.h + * + * \brief Main compiler interface header. + */ + +#include "compiler/nir/nir.h" + +/* Defines. */ +#define PCO_REG_UNUSED (~0U) + +/* Driver-specific forward-declarations. */ +struct pvr_device_info; + +/* Compiler-specific forward-declarations. */ +typedef struct _pco_shader pco_shader; +typedef struct _pco_ctx pco_ctx; + +pco_ctx *pco_ctx_create(const struct pvr_device_info *dev_info, void *mem_ctx); +const struct spirv_to_nir_options *pco_spirv_options(pco_ctx *ctx); +const nir_shader_compiler_options *pco_nir_options(pco_ctx *ctx); + +void pco_preprocess_nir(pco_ctx *ctx, nir_shader *nir); +void pco_link_nir(pco_ctx *ctx, nir_shader *producer, nir_shader *consumer); +void pco_lower_nir(pco_ctx *ctx, nir_shader *nir); +void pco_postprocess_nir(pco_ctx *ctx, nir_shader *nir); + +pco_shader *pco_trans_nir(pco_ctx *ctx, nir_shader *nir, void *mem_ctx); +void pco_process_ir(pco_ctx *ctx, pco_shader *shader); + +void pco_encode_ir(pco_ctx *ctx, pco_shader *shader); +void pco_shader_finalize(pco_ctx *ctx, pco_shader *shader); + +unsigned pco_shader_binary_size(pco_shader *shader); +const void *pco_shader_binary_data(pco_shader *shader); +#endif /* PCO_H */ diff --git a/src/imagination/pco/pco_binary.c b/src/imagination/pco/pco_binary.c new file mode 100644 index 00000000000..25e142a1461 --- /dev/null +++ b/src/imagination/pco/pco_binary.c @@ -0,0 +1,62 @@ +/* + * Copyright © 2024 Imagination Technologies Ltd. + * + * SPDX-License-Identifier: MIT + */ + +/** + * \file pco_binary.c + * + * \brief PCO binary-specific functions. + */ + +#include "pco.h" +#include "pco_internal.h" + +#include + +/** + * \brief Encodes a PCO shader into binary. + * + * \param[in] ctx PCO compiler context. + * \param[in,out] shader PCO shader. + */ +void pco_encode_ir(pco_ctx *ctx, pco_shader *shader) +{ + puts("finishme: pco_encode_ir"); +} + +/** + * \brief Finalizes a PCO shader binary. + * + * \param[in] ctx PCO compiler context. + * \param[in,out] shader PCO shader. + */ +void pco_shader_finalize(pco_ctx *ctx, pco_shader *shader) +{ + puts("finishme: pco_shader_finalize"); +} + +/** + * \brief Returns the size in bytes of a PCO shader binary. + * + * \param[in] shader PCO shader. + * \return The size in bytes of the PCO shader binary. + */ +unsigned pco_shader_binary_size(pco_shader *shader) +{ + puts("finishme: pco_binary_size"); + return 0; +} + +/** + * \brief Returns the PCO shader binary data. + * + * \param[in] shader PCO shader. + * \return The PCO shader binary data. + */ +const void *pco_shader_binary_data(pco_shader *shader) +{ + puts("finishme: pco_binary_data"); + return NULL; +} diff --git a/src/imagination/pco/pco_internal.h b/src/imagination/pco/pco_internal.h new file mode 100644 index 00000000000..eb0a3ba5463 --- /dev/null +++ b/src/imagination/pco/pco_internal.h @@ -0,0 +1,31 @@ +/* + * Copyright © 2024 Imagination Technologies Ltd. + * + * SPDX-License-Identifier: MIT + */ + +#ifndef PCO_INTERNAL_H +#define PCO_INTERNAL_H + +/** + * \file pco_internal.h + * + * \brief PCO internal header. + */ + +#include "pco.h" +#include "spirv/nir_spirv.h" + +/** PCO compiler context. */ +typedef struct _pco_ctx { + /** Device information. */ + const struct pvr_device_info *dev_info; + + /** Device-specific NIR options. */ + nir_shader_compiler_options nir_options; + + /** Device-specific SPIR-V to NIR options. */ + struct spirv_to_nir_options spirv_options; +} pco_ctx; + +#endif /* PCO_INTERNAL_H */ diff --git a/src/imagination/pco/pco_ir.c b/src/imagination/pco/pco_ir.c new file mode 100644 index 00000000000..73cf24f2ab8 --- /dev/null +++ b/src/imagination/pco/pco_ir.c @@ -0,0 +1,27 @@ +/* + * Copyright © 2024 Imagination Technologies Ltd. + * + * SPDX-License-Identifier: MIT + */ + +/** + * \file pco_ir.c + * + * \brief PCO IR-specific functions. + */ + +#include "pco.h" +#include "pco_internal.h" + +#include + +/** + * \brief Runs passes on a PCO shader. + * + * \param[in] ctx PCO compiler context. + * \param[in,out] shader PCO shader. + */ +void pco_process_ir(pco_ctx *ctx, pco_shader *shader) +{ + puts("finishme: pco_process_ir"); +} diff --git a/src/imagination/pco/pco_nir.c b/src/imagination/pco/pco_nir.c new file mode 100644 index 00000000000..5c3566ba472 --- /dev/null +++ b/src/imagination/pco/pco_nir.c @@ -0,0 +1,61 @@ +/* + * Copyright © 2024 Imagination Technologies Ltd. + * + * SPDX-License-Identifier: MIT + */ + +/** + * \file pco_nir.c + * + * \brief NIR-specific functions. + */ + +#include "pco.h" +#include "pco_internal.h" + +#include + +/** + * \brief Runs pre-processing passes on a NIR shader. + * + * \param[in] ctx PCO compiler context. + * \param[in,out] nir NIR shader. + */ +void pco_preprocess_nir(pco_ctx *ctx, nir_shader *nir) +{ + puts("finishme: pco_preprocess_nir"); +} + +/** + * \brief Lowers a NIR shader. + * + * \param[in] ctx PCO compiler context. + * \param[in,out] nir NIR shader. + */ +void pco_lower_nir(pco_ctx *ctx, nir_shader *nir) +{ + puts("finishme: pco_lower_nir"); +} + +/** + * \brief Runs post-processing passes on a NIR shader. + * + * \param[in] ctx PCO compiler context. + * \param[in,out] nir NIR shader. + */ +void pco_postprocess_nir(pco_ctx *ctx, nir_shader *nir) +{ + puts("finishme: pco_postprocess_nir"); +} + +/** + * \brief Performs linking optimizations on consecutive NIR shader stages. + * + * \param[in] ctx PCO compiler context. + * \param[in,out] producer NIR producer shader. + * \param[in,out] consumer NIR consumer shader. + */ +void pco_link_nir(pco_ctx *ctx, nir_shader *producer, nir_shader *consumer) +{ + puts("finishme: pco_link_nir"); +} diff --git a/src/imagination/pco/pco_trans_nir.c b/src/imagination/pco/pco_trans_nir.c new file mode 100644 index 00000000000..b8e93dccd4f --- /dev/null +++ b/src/imagination/pco/pco_trans_nir.c @@ -0,0 +1,30 @@ +/* + * Copyright © 2024 Imagination Technologies Ltd. + * + * SPDX-License-Identifier: MIT + */ + +/** + * \file pco_trans_nir.c + * + * \brief NIR translation functions. + */ + +#include "pco.h" +#include "pco_internal.h" + +#include + +/** + * \brief Translates a NIR shader into a PCO shader. + * + * \param[in] ctx PCO compiler context. + * \param[in] nir NIR shader. + * \param[in] mem_ctx Ralloc memory allocation context. + * \return The PCO shader. + */ +pco_shader *pco_trans_nir(pco_ctx *ctx, nir_shader *nir, void *mem_ctx) +{ + puts("finishme: pco_trans_nir"); + return ralloc_context(mem_ctx); +} diff --git a/src/imagination/vulkan/meson.build b/src/imagination/vulkan/meson.build index 6725b7eb5ca..2e418a0aa2a 100644 --- a/src/imagination/vulkan/meson.build +++ b/src/imagination/vulkan/meson.build @@ -60,8 +60,6 @@ pvr_files = files( ) pvr_includes = [ - include_directories('usc/programs'), - include_directories('usc'), include_directories('winsys'), libpowervr_pds_includes, ] diff --git a/src/imagination/vulkan/pvr_blit.c b/src/imagination/vulkan/pvr_blit.c index 6a018934700..258d70ef375 100644 --- a/src/imagination/vulkan/pvr_blit.c +++ b/src/imagination/vulkan/pvr_blit.c @@ -33,8 +33,8 @@ #include "pvr_formats.h" #include "pvr_job_transfer.h" #include "pvr_private.h" -#include "pvr_shader_factory.h" -#include "pvr_static_shaders.h" +#include "usc/programs/pvr_shader_factory.h" +#include "usc/programs/pvr_static_shaders.h" #include "pvr_types.h" #include "util/bitscan.h" #include "util/list.h" diff --git a/src/imagination/vulkan/pvr_clear.c b/src/imagination/vulkan/pvr_clear.c index a54b8dc1c22..af64b5e2046 100644 --- a/src/imagination/vulkan/pvr_clear.c +++ b/src/imagination/vulkan/pvr_clear.c @@ -29,8 +29,8 @@ #include "pvr_hardcode.h" #include "pvr_pds.h" #include "pvr_private.h" -#include "pvr_shader_factory.h" -#include "pvr_static_shaders.h" +#include "usc/programs/pvr_shader_factory.h" +#include "usc/programs/pvr_static_shaders.h" #include "pvr_types.h" #include "vk_alloc.h" #include "vk_log.h" diff --git a/src/imagination/vulkan/pvr_cmd_buffer.c b/src/imagination/vulkan/pvr_cmd_buffer.c index c327b33a4dc..e22efd77ac6 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.c +++ b/src/imagination/vulkan/pvr_cmd_buffer.c @@ -48,7 +48,7 @@ #include "pvr_private.h" #include "pvr_tex_state.h" #include "pvr_types.h" -#include "pvr_uscgen.h" +#include "usc/pvr_uscgen.h" #include "pvr_winsys.h" #include "util/bitscan.h" #include "util/bitset.h" diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c index 7901a014d67..52036bd19dc 100644 --- a/src/imagination/vulkan/pvr_device.c +++ b/src/imagination/vulkan/pvr_device.c @@ -57,7 +57,7 @@ #include "pvr_robustness.h" #include "pvr_tex_state.h" #include "pvr_types.h" -#include "pvr_uscgen.h" +#include "usc/pvr_uscgen.h" #include "pvr_util.h" #include "pvr_winsys.h" #include "rogue/rogue.h" diff --git a/src/imagination/vulkan/pvr_job_context.c b/src/imagination/vulkan/pvr_job_context.c index 4d5dbe0a115..aa518924f79 100644 --- a/src/imagination/vulkan/pvr_job_context.c +++ b/src/imagination/vulkan/pvr_job_context.c @@ -30,7 +30,7 @@ #include "hwdef/rogue_hw_utils.h" #include "pvr_bo.h" -#include "pvr_cdm_load_sr.h" +#include "usc/programs/pvr_cdm_load_sr.h" #include "pvr_common.h" #include "pvr_csb.h" #include "pvr_job_context.h" @@ -38,9 +38,9 @@ #include "pvr_private.h" #include "pvr_transfer_frag_store.h" #include "pvr_types.h" -#include "pvr_uscgen.h" -#include "pvr_vdm_load_sr.h" -#include "pvr_vdm_store_sr.h" +#include "usc/pvr_uscgen.h" +#include "usc/programs/pvr_vdm_load_sr.h" +#include "usc/programs/pvr_vdm_store_sr.h" #include "pvr_winsys.h" #include "util/macros.h" #include "util/os_file.h" diff --git a/src/imagination/vulkan/pvr_job_context.h b/src/imagination/vulkan/pvr_job_context.h index 6a59ed41959..740b30a17c9 100644 --- a/src/imagination/vulkan/pvr_job_context.h +++ b/src/imagination/vulkan/pvr_job_context.h @@ -28,7 +28,7 @@ #include "pvr_private.h" #include "pvr_transfer_frag_store.h" #include "pvr_types.h" -#include "pvr_uscgen.h" +#include "usc/pvr_uscgen.h" #include "pvr_winsys.h" /* Support PDS code/data loading/storing to the 'B' shared register state diff --git a/src/imagination/vulkan/pvr_job_transfer.c b/src/imagination/vulkan/pvr_job_transfer.c index 7723a9c3f68..ba64bc5401f 100644 --- a/src/imagination/vulkan/pvr_job_transfer.c +++ b/src/imagination/vulkan/pvr_job_transfer.c @@ -38,7 +38,7 @@ #include "pvr_tex_state.h" #include "pvr_transfer_frag_store.h" #include "pvr_types.h" -#include "pvr_uscgen.h" +#include "usc/pvr_uscgen.h" #include "pvr_util.h" #include "pvr_winsys.h" #include "util/bitscan.h" diff --git a/src/imagination/vulkan/pvr_pass.c b/src/imagination/vulkan/pvr_pass.c index f0aeb24fed6..4d8c167367b 100644 --- a/src/imagination/vulkan/pvr_pass.c +++ b/src/imagination/vulkan/pvr_pass.c @@ -32,7 +32,7 @@ #include "pvr_pds.h" #include "pvr_private.h" #include "pvr_types.h" -#include "pvr_usc_fragment_shader.h" +#include "usc/programs/pvr_usc_fragment_shader.h" #include "util/macros.h" #include "rogue/rogue.h" #include "vk_alloc.h" diff --git a/src/imagination/vulkan/pvr_private.h b/src/imagination/vulkan/pvr_private.h index fa115d6738d..f948409470b 100644 --- a/src/imagination/vulkan/pvr_private.h +++ b/src/imagination/vulkan/pvr_private.h @@ -48,7 +48,7 @@ #include "pvr_job_render.h" #include "pvr_limits.h" #include "pvr_pds.h" -#include "pvr_shader_factory.h" +#include "usc/programs/pvr_shader_factory.h" #include "pvr_spm.h" #include "pvr_types.h" #include "pvr_winsys.h" diff --git a/src/imagination/vulkan/pvr_query_compute.c b/src/imagination/vulkan/pvr_query_compute.c index 8f41016a161..b1e62aa1f53 100644 --- a/src/imagination/vulkan/pvr_query_compute.c +++ b/src/imagination/vulkan/pvr_query_compute.c @@ -33,8 +33,8 @@ #include "pvr_formats.h" #include "pvr_pds.h" #include "pvr_private.h" -#include "pvr_shader_factory.h" -#include "pvr_static_shaders.h" +#include "usc/programs/pvr_shader_factory.h" +#include "usc/programs/pvr_static_shaders.h" #include "pvr_tex_state.h" #include "pvr_types.h" #include "vk_alloc.h" diff --git a/src/imagination/vulkan/pvr_spm.c b/src/imagination/vulkan/pvr_spm.c index e20750cfc0e..544ae1b7981 100644 --- a/src/imagination/vulkan/pvr_spm.c +++ b/src/imagination/vulkan/pvr_spm.c @@ -37,12 +37,12 @@ #include "pvr_job_common.h" #include "pvr_pds.h" #include "pvr_private.h" -#include "pvr_shader_factory.h" +#include "usc/programs/pvr_shader_factory.h" #include "pvr_spm.h" -#include "pvr_static_shaders.h" +#include "usc/programs/pvr_static_shaders.h" #include "pvr_tex_state.h" #include "pvr_types.h" -#include "pvr_uscgen.h" +#include "usc/pvr_uscgen.h" #include "util/bitscan.h" #include "util/macros.h" #include "util/simple_mtx.h" diff --git a/src/imagination/vulkan/pvr_transfer_frag_store.c b/src/imagination/vulkan/pvr_transfer_frag_store.c index a67bb030526..254ef4e6155 100644 --- a/src/imagination/vulkan/pvr_transfer_frag_store.c +++ b/src/imagination/vulkan/pvr_transfer_frag_store.c @@ -35,7 +35,7 @@ #include "pvr_private.h" #include "pvr_transfer_frag_store.h" #include "pvr_types.h" -#include "pvr_uscgen.h" +#include "usc/pvr_uscgen.h" #include "util/hash_table.h" #include "util/macros.h" #include "util/ralloc.h" diff --git a/src/imagination/vulkan/pvr_transfer_frag_store.h b/src/imagination/vulkan/pvr_transfer_frag_store.h index ba1a7ae5e6d..49307fac98d 100644 --- a/src/imagination/vulkan/pvr_transfer_frag_store.h +++ b/src/imagination/vulkan/pvr_transfer_frag_store.h @@ -28,7 +28,7 @@ #include #include "pvr_device_info.h" -#include "pvr_uscgen.h" +#include "usc/pvr_uscgen.h" #include "pvr_types.h" #include "util/hash_table.h" diff --git a/src/imagination/vulkan/pvr_uscgen.c b/src/imagination/vulkan/pvr_uscgen.c new file mode 100644 index 00000000000..56651408cbe --- /dev/null +++ b/src/imagination/vulkan/pvr_uscgen.c @@ -0,0 +1,80 @@ +/* + * Copyright © 2024 Imagination Technologies Ltd. + * + * SPDX-License-Identifier: MIT + */ + +/** + * \file pvr_uscgen.c + * + * \brief USC shader generation. + */ + +#include "nir/nir.h" +#include "nir/nir_builder.h" +#include "pco/pco.h" +#include "pvr_uscgen.h" +#include "util/macros.h" + +/** + * Common function to build a NIR shader and export the binary. + * + * \param ctx PCO context. + * \param nir NIR shader. + * \param binary Output shader binary. + */ +static void build_shader(pco_ctx *ctx, nir_shader *nir, pco_binary **binary) +{ + pco_preprocess_nir(ctx, nir); + pco_lower_nir(ctx, nir); + pco_postprocess_nir(ctx, nir); + + pco_shader *shader = pco_trans_nir(ctx, nir); + pco_process_ir(ctx, shader); + + pco_binary *bin = pco_encode_ir(ctx, shader); + ralloc_free(shader); + + pco_binary_finalize(ctx, bin); + *binary = bin; +} + +/** + * Generate a nop (empty) shader. + * + * \param ctx PCO context. + * \param stage Shader stage. + * \param binary Output shader binary. + */ +void pvr_uscgen_nop(pco_ctx *ctx, gl_shader_stage stage, pco_binary **binary) +{ + unreachable("finishme: pvr_uscgen_nop"); +} + +/** + * Generate an end-of-tile shader. + * + * \param ctx PCO context. + * \param props End of tile shader properties. + * \param binary Output shader binary. + */ +void pvr_uscgen_eot(pco_ctx *ctx, + struct pvr_eot_props *props, + pco_binary **binary) +{ + unreachable("finishme: pvr_uscgen_eot"); +} + +/** + * Generate a transfer queue shader. + * + * \param ctx PCO context. + * \param props Transfer queue shader properties. + * \param binary Output shader binary. + */ +void pvr_uscgen_tq(pco_ctx *ctx, + struct pvr_tq_props *props, + pco_binary **binary) +{ + unreachable("finishme: pvr_uscgen_tq"); +} diff --git a/src/imagination/vulkan/pvr_uscgen.h b/src/imagination/vulkan/pvr_uscgen.h new file mode 100644 index 00000000000..38e147853e8 --- /dev/null +++ b/src/imagination/vulkan/pvr_uscgen.h @@ -0,0 +1,38 @@ +/* + * Copyright © 2024 Imagination Technologies Ltd. + * + * SPDX-License-Identifier: MIT + */ + +#ifndef PVR_USCGEN_H +#define PVR_USCGEN_H + +/** + * \file pvr_uscgen.h + * + * \brief USC shader generation header. + */ + +#include "compiler/shader_enums.h" +#include "pco/pco.h" + +/* NOP shader generation. */ +void pvr_uscgen_nop(pco_ctx *ctx, gl_shader_stage stage, pco_binary **binary); + +/* EOT shader generation. */ +struct pvr_eot_props { +}; + +void pvr_uscgen_eot(pco_ctx *ctx, + struct pvr_eot_props *props, + pco_binary **binary); + +/* Transfer queue shader generation. */ +struct pvr_tq_props { +}; + +void pvr_uscgen_tq(pco_ctx *ctx, + struct pvr_tq_props *props, + pco_binary **binary); + +#endif /* PVR_USCGEN_H */ diff --git a/src/imagination/vulkan/usc/pvr_uscgen.c b/src/imagination/vulkan/usc/pvr_uscgen.c index fa7387936cd..ee5dd453d7d 100644 --- a/src/imagination/vulkan/usc/pvr_uscgen.c +++ b/src/imagination/vulkan/usc/pvr_uscgen.c @@ -22,7 +22,7 @@ */ #include "pvr_job_transfer.h" -#include "pvr_uscgen.h" +#include "usc/pvr_uscgen.h" #include "rogue/rogue.h" #include "rogue/rogue_builder.h" #include "util/u_dynarray.h" diff --git a/src/imagination/vulkan/usc/pvr_uscgen_tq.c b/src/imagination/vulkan/usc/pvr_uscgen_tq.c index fc6f031994f..d2a0cb69c41 100644 --- a/src/imagination/vulkan/usc/pvr_uscgen_tq.c +++ b/src/imagination/vulkan/usc/pvr_uscgen_tq.c @@ -24,7 +24,7 @@ #include #include -#include "pvr_uscgen.h" +#include "usc/pvr_uscgen.h" #include "rogue/rogue.h" #include "rogue/rogue_builder.h" #include "util/u_dynarray.h"