About Social Code
aboutsummaryrefslogtreecommitdiff
path: root/src/frygon/vulkan/fgvk_shader.c
diff options
context:
space:
mode:
authorLucas Fryzek <lucas.fryzek@fryzekconcepts.com>2025-11-24 19:39:30 -0500
committerLucas Fryzek <lucas.fryzek@fryzekconcepts.com>2025-11-24 19:39:30 -0500
commitb5f3587df4048d2ba807721ff2faea8c8a43a93f (patch)
tree6913f730a41822b98fecd5e82b7cae46164fd9c0 /src/frygon/vulkan/fgvk_shader.c
parent41c700fdbf1d79dfb571105ee93bfa46da6c8428 (diff)
Diffstat (limited to 'src/frygon/vulkan/fgvk_shader.c')
-rw-r--r--src/frygon/vulkan/fgvk_shader.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/src/frygon/vulkan/fgvk_shader.c b/src/frygon/vulkan/fgvk_shader.c
new file mode 100644
index 00000000000..7cc871e0cbe
--- /dev/null
+++ b/src/frygon/vulkan/fgvk_shader.c
@@ -0,0 +1,204 @@
+/*
+ * Copyright © 2025 Lucas Francisco Fryzek
+ * SPDX-License-Identifier: MIT
+ */
+#include "fgvk_shader.h"
+
+#include "fgvk_physical_device.h"
+#include "fgvk_device.h"
+#include "fgvk_cmd_buffer.h"
+
+static const nir_shader_compiler_options *
+fgvk_get_nir_options(struct vk_physical_device *vk_pdev,
+ mesa_shader_stage stage,
+ UNUSED const struct vk_pipeline_robustness_state *rs)
+{
+ const struct fgvk_physical_device *pdev =
+ container_of(vk_pdev, struct fgvk_physical_device, vk);
+ return fgcc_nir_options(pdev->fgcc);
+}
+
+static struct spirv_to_nir_options
+fgvk_get_spirv_options(struct vk_physical_device *vk_pdev,
+ UNUSED mesa_shader_stage stage,
+ const struct vk_pipeline_robustness_state *rs)
+{
+ const struct fgvk_physical_device *pdev =
+ container_of(vk_pdev, struct fgvk_physical_device, vk);
+
+ return (struct spirv_to_nir_options) {};
+}
+
+static void
+fgvk_preprocess_nir(struct vk_physical_device *vk_pdev,
+ nir_shader *nir,
+ UNUSED const struct vk_pipeline_robustness_state *rs)
+{
+ const struct fgvk_physical_device *pdev =
+ container_of(vk_pdev, struct fgvk_physical_device, vk);
+
+ fgcc_preprocess_nir(nir, pdev->fgcc);
+}
+
+static void
+fgvk_hash_state(struct vk_physical_device *device,
+ const struct vk_graphics_pipeline_state *state,
+ const struct vk_features *enabled_features,
+ VkShaderStageFlags stages,
+ blake3_hash blake3_out)
+{
+ // TODO need to figure out what state should get hashed into shaders
+ struct mesa_blake3 blake3_ctx;
+ _mesa_blake3_init(&blake3_ctx);
+ _mesa_blake3_final(&blake3_ctx, blake3_out);
+}
+
+static const struct vk_shader_ops fgvk_shader_ops;
+
+static void
+fgvk_shader_destroy(struct vk_device *vk_dev,
+ struct vk_shader *vk_shader,
+ const VkAllocationCallbacks* pAllocator)
+{
+ struct fgvk_device *dev = container_of(vk_dev, struct fgvk_device, vk);
+ struct fgvk_shader *shader = container_of(vk_shader, struct fgvk_shader, vk);
+
+ vk_shader_free(&dev->vk, pAllocator, &shader->vk);
+}
+
+static VkResult
+fgvk_compile_shader(struct fgvk_device *dev,
+ struct vk_shader_compile_info *info,
+ const struct vk_graphics_pipeline_state *state,
+ const VkAllocationCallbacks* pAllocator,
+ struct vk_shader **shader_out)
+{
+ struct fgvk_shader *shader;
+ VkResult result = VK_SUCCESS;
+
+ /* We consume the NIR, regardless of success or failure */
+ nir_shader *nir = info->nir;
+
+ shader = vk_shader_zalloc(&dev->vk, &fgvk_shader_ops, info->stage,
+ pAllocator, sizeof(*shader));
+
+ if (shader == NULL) {
+ ralloc_free(nir);
+ return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY);
+ }
+
+ // TODO some shader compliation should happen here
+
+ ralloc_free(nir);
+ if (result != VK_SUCCESS) {
+ fgvk_shader_destroy(&dev->vk, &shader->vk, pAllocator);
+ return result;
+ }
+
+ *shader_out = &shader->vk;
+
+ return VK_SUCCESS;
+}
+
+static VkResult
+fgvk_compile_shaders(struct vk_device *vk_dev,
+ uint32_t shader_count,
+ struct vk_shader_compile_info *infos,
+ const struct vk_graphics_pipeline_state *state,
+ const struct vk_features *enabled_features,
+ const VkAllocationCallbacks* pAllocator,
+ struct vk_shader **shaders_out)
+{
+ struct fgvk_device *dev = container_of(vk_dev, struct fgvk_device, vk);
+
+ for (uint32_t i = 0; i < shader_count; i++) {
+ VkResult result = fgvk_compile_shader(dev, &infos[i], state,
+ pAllocator, &shaders_out[i]);
+ if (result != VK_SUCCESS) {
+ /* Clean up all the shaders before this point */
+ for (uint32_t j = 0; j < i; j++)
+ fgvk_shader_destroy(&dev->vk, shaders_out[j], pAllocator);
+
+ /* Clean up all the NIR after this point */
+ for (uint32_t j = i + 1; j < shader_count; j++)
+ ralloc_free(infos[j].nir);
+
+ /* Memset the output array */
+ memset(shaders_out, 0, shader_count * sizeof(*shaders_out));
+
+ return result;
+ }
+ }
+
+ return VK_SUCCESS;
+}
+
+static bool
+fgvk_shader_serialize(struct vk_device *vk_dev,
+ const struct vk_shader *vk_shader,
+ struct blob *blob)
+{
+ UNREACHABLE("TODO");
+}
+
+static VkResult
+fgvk_deserialize_shader(struct vk_device *vk_dev,
+ struct blob_reader *blob,
+ uint32_t binary_version,
+ const VkAllocationCallbacks* pAllocator,
+ struct vk_shader **shader_out)
+{
+ UNREACHABLE("TODO");
+}
+
+static VkResult
+fgvk_shader_get_executable_properties(
+ UNUSED struct vk_device *device,
+ const struct vk_shader *vk_shader,
+ uint32_t *executable_count,
+ VkPipelineExecutablePropertiesKHR *properties)
+{
+ UNREACHABLE("TODO");
+}
+
+static VkResult
+fgvk_shader_get_executable_statistics(
+ UNUSED struct vk_device *device,
+ const struct vk_shader *vk_shader,
+ uint32_t executable_index,
+ uint32_t *statistic_count,
+ VkPipelineExecutableStatisticKHR *statistics)
+{
+ UNREACHABLE("TODO");
+}
+
+static VkResult
+fgvk_shader_get_executable_internal_representations(
+ UNUSED struct vk_device *device,
+ const struct vk_shader *vk_shader,
+ uint32_t executable_index,
+ uint32_t *internal_representation_count,
+ VkPipelineExecutableInternalRepresentationKHR *internal_representations)
+{
+ UNREACHABLE("TODO");
+}
+
+static const struct vk_shader_ops fgvk_shader_ops = {
+ .destroy = fgvk_shader_destroy,
+ .serialize = fgvk_shader_serialize,
+ .get_executable_properties = fgvk_shader_get_executable_properties,
+ .get_executable_statistics = fgvk_shader_get_executable_statistics,
+ .get_executable_internal_representations =
+ fgvk_shader_get_executable_internal_representations,
+};
+
+const struct vk_device_shader_ops fgvk_device_shader_ops = {
+ .get_nir_options = fgvk_get_nir_options,
+ .get_spirv_options = fgvk_get_spirv_options,
+ .preprocess_nir = fgvk_preprocess_nir,
+ .hash_state = fgvk_hash_state,
+ .compile = fgvk_compile_shaders,
+ .deserialize = fgvk_deserialize_shader,
+ .cmd_set_dynamic_graphics_state = vk_cmd_set_dynamic_graphics_state,
+ .cmd_bind_shaders = fgvk_cmd_bind_shaders,
+};