[Bf-blender-cvs] [1273af7a014] temp-vulkan-shader: Vulkan: create shader module.

Jeroen Bakker noreply at git.blender.org
Tue Nov 22 17:01:40 CET 2022


Commit: 1273af7a014231ba99ca7ffed03dba31f570d4ab
Author: Jeroen Bakker
Date:   Tue Nov 22 17:01:33 2022 +0100
Branches: temp-vulkan-shader
https://developer.blender.org/rB1273af7a014231ba99ca7ffed03dba31f570d4ab

Vulkan: create shader module.

===================================================================

M	source/blender/gpu/vulkan/vk_context.hh
M	source/blender/gpu/vulkan/vk_shader.cc
M	source/blender/gpu/vulkan/vk_shader.hh

===================================================================

diff --git a/source/blender/gpu/vulkan/vk_context.hh b/source/blender/gpu/vulkan/vk_context.hh
index 7c83548536d..56d39169538 100644
--- a/source/blender/gpu/vulkan/vk_context.hh
+++ b/source/blender/gpu/vulkan/vk_context.hh
@@ -47,6 +47,16 @@ class VKContext : public Context {
   void debug_group_begin(const char *, int) override;
   void debug_group_end() override;
 
+  static VKContext *get(void)
+  {
+    return static_cast<VKContext *>(Context::get());
+  }
+
+  VkDevice device_get() const
+  {
+    return device_;
+  }
+
   VmaAllocator mem_allocator_get() const
   {
     return mem_allocator_;
diff --git a/source/blender/gpu/vulkan/vk_shader.cc b/source/blender/gpu/vulkan/vk_shader.cc
index 37d26767c7a..2ad19dd25b8 100644
--- a/source/blender/gpu/vulkan/vk_shader.cc
+++ b/source/blender/gpu/vulkan/vk_shader.cc
@@ -37,13 +37,31 @@ Vector<uint32_t> VKShader::compile_glsl_to_spirv(StringRef source, shaderc_shade
 
 void VKShader::build_shader_module(Span<uint32_t> spirv_module, VkShaderModule *r_shader_module)
 {
-  VkShaderModuleCreateInfo createInfo = {};
-  createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
-  createInfo.codeSize = spirv_module.size() * sizeof(uint32_t);
-  createInfo.pCode = spirv_module.data();
+  VkShaderModuleCreateInfo create_info = {};
+  create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
+  create_info.codeSize = spirv_module.size() * sizeof(uint32_t);
+  create_info.pCode = spirv_module.data();
 
-  // TODO(jbakker): retrieve allocator and device
-  // VkResult result = vkCreateShaderModule(*device, &create_info, nullptr, r_shader_module);
+  VKContext &context = *static_cast<VKContext *>(VKContext::get());
+
+  VkResult result = vkCreateShaderModule(
+      context.device_get(), &create_info, nullptr, r_shader_module);
+  if (result != VK_SUCCESS) {
+    *r_shader_module = VK_NULL_HANDLE;
+  }
+}
+
+VKShader::VKShader(const char *name) : Shader(name)
+{
+  context_ = VKContext::get();
+}
+VKShader::~VKShader()
+{
+  VkDevice device = context_->device_get();
+  if (compute_module_ != VK_NULL_HANDLE) {
+    vkDestroyShaderModule(device, compute_module_, nullptr);
+    compute_module_ = VK_NULL_HANDLE;
+  }
 }
 
 void VKShader::vertex_shader_from_glsl(MutableSpan<const char *> /*sources*/)
diff --git a/source/blender/gpu/vulkan/vk_shader.hh b/source/blender/gpu/vulkan/vk_shader.hh
index e6cdf246f3e..35513bf0e1c 100644
--- a/source/blender/gpu/vulkan/vk_shader.hh
+++ b/source/blender/gpu/vulkan/vk_shader.hh
@@ -10,6 +10,7 @@
 #include "gpu_shader_private.hh"
 
 #include "vk_backend.hh"
+#include "vk_context.hh"
 
 #include "BLI_string_ref.hh"
 
@@ -17,12 +18,12 @@ namespace blender::gpu {
 
 class VKShader : public Shader {
  private:
+  VKContext *context_ = nullptr;
   VkShaderModule compute_module_ = nullptr;
 
  public:
-  VKShader(const char *name) : Shader(name)
-  {
-  }
+  VKShader(const char *name);
+  virtual ~VKShader();
 
   void vertex_shader_from_glsl(MutableSpan<const char *> sources) override;
   void geometry_shader_from_glsl(MutableSpan<const char *> sources) override;



More information about the Bf-blender-cvs mailing list