Explicit shader loading in triangle example with comments
This commit is contained in:
parent
c2907f9394
commit
9981799b02
1 changed files with 82 additions and 9 deletions
|
|
@ -15,6 +15,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <fstream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
|
||||||
|
|
@ -819,6 +820,60 @@ public:
|
||||||
VK_CHECK_RESULT(vkCreateRenderPass(device, &renderPassInfo, nullptr, &renderPass));
|
VK_CHECK_RESULT(vkCreateRenderPass(device, &renderPassInfo, nullptr, &renderPass));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Vulkan loads it's shaders from an immediate binary representation called SPIR-V
|
||||||
|
// Shaders are compiled offline from e.g. GLSL using the reference glslang compiler
|
||||||
|
// This function loads such a shader from a binary file and returns a shader module structure
|
||||||
|
VkShaderModule loadSPIRVShader(std::string filename)
|
||||||
|
{
|
||||||
|
size_t shaderSize;
|
||||||
|
char* shaderCode;
|
||||||
|
|
||||||
|
#if defined(__ANDROID__)
|
||||||
|
// Load shader from compressed asset
|
||||||
|
AAsset* asset = AAssetManager_open(assetManager, fileName, AASSET_MODE_STREAMING);
|
||||||
|
assert(asset);
|
||||||
|
size_t size = AAsset_getLength(asset);
|
||||||
|
assert(size > 0);
|
||||||
|
|
||||||
|
shaderCode = new char[size];
|
||||||
|
AAsset_read(asset, shaderCode, size);
|
||||||
|
AAsset_close(asset);
|
||||||
|
#else
|
||||||
|
std::ifstream is(filename, std::ios::binary | std::ios::in | std::ios::ate);
|
||||||
|
|
||||||
|
if (is.is_open())
|
||||||
|
{
|
||||||
|
shaderSize = is.tellg();
|
||||||
|
is.seekg(0, std::ios::beg);
|
||||||
|
// Copy file contents into a buffer
|
||||||
|
shaderCode = new char[shaderSize];
|
||||||
|
is.read(shaderCode, shaderSize);
|
||||||
|
is.close();
|
||||||
|
assert(shaderSize > 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (shaderCode)
|
||||||
|
{
|
||||||
|
// Create a new shader module that will be used for pipeline creation
|
||||||
|
VkShaderModuleCreateInfo moduleCreateInfo{};
|
||||||
|
moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||||
|
moduleCreateInfo.codeSize = shaderSize;
|
||||||
|
moduleCreateInfo.pCode = (uint32_t*)shaderCode;
|
||||||
|
|
||||||
|
VkShaderModule shaderModule;
|
||||||
|
VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule));
|
||||||
|
|
||||||
|
delete[] shaderCode;
|
||||||
|
|
||||||
|
return shaderModule;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cerr << "Error: Could not open shader file \"" << filename << "\"" << std::endl;
|
||||||
|
return VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void preparePipelines()
|
void preparePipelines()
|
||||||
{
|
{
|
||||||
// Create the graphics pipeline used in this example
|
// Create the graphics pipeline used in this example
|
||||||
|
|
@ -903,15 +958,33 @@ public:
|
||||||
multisampleState.pSampleMask = nullptr;
|
multisampleState.pSampleMask = nullptr;
|
||||||
|
|
||||||
// Load shaders
|
// Load shaders
|
||||||
// Vulkan loads it's shaders from an immediate binary representation called SPIR-V
|
std::array<VkPipelineShaderStageCreateInfo, 2> shaderStages{};
|
||||||
// Shaders are compiled offline from e.g. GLSL using the reference glslang compiler
|
|
||||||
std::array<VkPipelineShaderStageCreateInfo,2> shaderStages;
|
|
||||||
shaderStages[0] = loadShader(getAssetPath() + "shaders/triangle.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
|
||||||
shaderStages[1] = loadShader(getAssetPath() + "shaders/triangle.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
|
||||||
|
|
||||||
// Assign the pipeline states to the pipeline creation info structure
|
// Vertex shader
|
||||||
|
shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
|
// Set pipeline stage for this shader
|
||||||
|
shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
|
||||||
|
// Load binary SPIR-V shader
|
||||||
|
shaderStages[0].module = loadSPIRVShader(getAssetPath() + "shaders/triangle.vert.spv");
|
||||||
|
// Main entry point for the shader
|
||||||
|
shaderStages[0].pName = "main";
|
||||||
|
assert(shaderStages[0].module != VK_NULL_HANDLE);
|
||||||
|
|
||||||
|
// Fragment shader
|
||||||
|
shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
|
// Set pipeline stage for this shader
|
||||||
|
shaderStages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||||
|
// Load binary SPIR-V shader
|
||||||
|
shaderStages[1].module = loadSPIRVShader(getAssetPath() + "shaders/triangle.frag.spv");
|
||||||
|
// Main entry point for the shader
|
||||||
|
shaderStages[1].pName = "main";
|
||||||
|
assert(shaderStages[1].module != VK_NULL_HANDLE);
|
||||||
|
|
||||||
|
// Set pipeline shader stage info
|
||||||
pipelineCreateInfo.stageCount = static_cast<uint32_t>(shaderStages.size());
|
pipelineCreateInfo.stageCount = static_cast<uint32_t>(shaderStages.size());
|
||||||
pipelineCreateInfo.pStages = shaderStages.data();
|
pipelineCreateInfo.pStages = shaderStages.data();
|
||||||
|
|
||||||
|
// Assign the pipeline states to the pipeline creation info structure
|
||||||
pipelineCreateInfo.pVertexInputState = &vertices.inputState;
|
pipelineCreateInfo.pVertexInputState = &vertices.inputState;
|
||||||
pipelineCreateInfo.pInputAssemblyState = &inputAssemblyState;
|
pipelineCreateInfo.pInputAssemblyState = &inputAssemblyState;
|
||||||
pipelineCreateInfo.pRasterizationState = &rasterizationState;
|
pipelineCreateInfo.pRasterizationState = &rasterizationState;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue