Program Listing for File VkShader.cpp

Return to documentation for file (Source\Azura\RenderSystem\Src\Vulkan\VkShader.cpp)

#include "Vulkan/VkShader.h"
#include "Utils/FileReader.h"
#include "Vulkan/VkCore.h"
#include "Vulkan/VkMacros.h"
#include "Vulkan/VkTypeMapping.h"
#include "Memory/MemoryFactory.h"
#include "Memory/MonotonicAllocator.h"
#include "Memory/HeapMemoryBuffer.h"
#include <iostream>

namespace Azura {
namespace Vulkan {

namespace {
const String SPRIV_EXT = "spv";
} // namespace

VkShader::VkShader(VkDevice device, const String& fileName, const Log& logger) // NOLINT
  : Shader(fileName, SPRIV_EXT),
    log_VulkanRenderSystem(logger) {
  HEAP_ALLOCATOR(Temporary, Memory::MonotonicAllocator, 0x800000);

  LOG_DEBUG(log_VulkanRenderSystem, LOG_LEVEL, "VkShader: Loading Shader: %s", GetFilePath().c_str());

  const auto fileContents = FileReader::GetFileContents(GetFilePath(), allocatorTemporary);

  LOG_DEBUG(log_VulkanRenderSystem, LOG_LEVEL, "VkShader: File Loaded: %s", GetFilePath().c_str());

  m_module = VkCore::CreateShaderModule(device, fileContents, log_VulkanRenderSystem);

  LOG_DEBUG(log_VulkanRenderSystem, LOG_LEVEL, "VkShader: Successfully Created Shader: %s", GetFilePath().c_str());
}

VkPipelineShaderStageCreateInfo VkShader::GetShaderStageInfo() const {
  const auto vkShaderStage = ToVkShaderStageFlagBits(GetShaderStage());
  VERIFY_OPT(log_VulkanRenderSystem, vkShaderStage, "Unknown Shader Stage");

  VkPipelineShaderStageCreateInfo shaderStage = {};
  shaderStage.sType                           = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
  shaderStage.stage                           = vkShaderStage.value();
  shaderStage.module                          = m_module;
  shaderStage.pName                           = GetShaderEntryPoint().c_str();

  return shaderStage;
}

void VkShader::CleanUp(VkDevice device) const {
  vkDestroyShaderModule(device, m_module, nullptr);
}

} // namespace Vulkan
} // namespace Azura