CSC8503_Advanced_Game_Technologies / Plugins / VulkanRendering / VulkanShaderBuilder.cpp
VulkanShaderBuilder.cpp
Raw
#include "VulkanShaderBuilder.h"

using namespace NCL;
using namespace Rendering;

VulkanShaderBuilder& VulkanShaderBuilder::WithVertexBinary(const string& name) {
	shaderFiles[(int)ShaderStages::SHADER_VERTEX] = name;
	return *this;
}

VulkanShaderBuilder& VulkanShaderBuilder::WithFragmentBinary(const string& name) {
	shaderFiles[(int)ShaderStages::SHADER_FRAGMENT] = name;
	return *this;
}

VulkanShaderBuilder& VulkanShaderBuilder::WithGeometryBinary(const string& name) {
	shaderFiles[(int)ShaderStages::SHADER_GEOMETRY] = name;
	return *this;
}

VulkanShaderBuilder& VulkanShaderBuilder::WithTessControlBinary(const string& name) {
	shaderFiles[(int)ShaderStages::SHADER_DOMAIN] = name;
	return *this;
}

VulkanShaderBuilder& VulkanShaderBuilder::WithTessEvalBinary(const string& name) {
	shaderFiles[(int)ShaderStages::SHADER_HULL] = name;
	return *this;
}

VulkanShaderBuilder& VulkanShaderBuilder::WithDebugName(const string& name) {
	debugName = name;
	return *this;
}

VulkanShader* VulkanShaderBuilder::Build(VulkanRenderer& renderer) {
	VulkanShader* newShader = new VulkanShader();

	newShader->SetSourceDevice(renderer.device);

	for (int i = 0; i < (int)ShaderStages::SHADER_MAX; ++i) {
		if (!shaderFiles[i].empty()) {
			newShader->AddBinaryShaderModule(shaderFiles[i],(ShaderStages)i);

			if (!debugName.empty()) {
				renderer.SetDebugName(vk::ObjectType::eShaderModule, (uint64_t)newShader->shaderModules[i].operator VkShaderModule() , debugName);
			}
		}
	};
	newShader->Init();
	return newShader;
}