summaryrefslogtreecommitdiff
path: root/src/window.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-12-22 19:33:26 -0500
committerJonathan Bradley <jcb@pikum.xyz>2023-12-23 11:43:15 -0500
commitb911c5b6c37ab13be6188cf039cd4246414fc7b5 (patch)
treeda4743a719e8134abb35f87f5097541e09c8f581 /src/window.cpp
parenta3937e7eef97cb0badcd65c390b9dd39d4cfd094 (diff)
first pass background asset loading - buggy
Diffstat (limited to 'src/window.cpp')
-rw-r--r--src/window.cpp57
1 files changed, 33 insertions, 24 deletions
diff --git a/src/window.cpp b/src/window.cpp
index e7d4506..0c881de 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -1047,10 +1047,9 @@ void CreateRenderPass() {
}
void CreatePresentPipeline() {
+ // enqueue asset loading
AssetHandle vertShaderAsset = AM_Register("assets/shaders/present.vert.spv");
AssetHandle fragShaderAsset = AM_Register("assets/shaders/present.frag.spv");
- auto vertShader = UploadShader(vertShaderAsset);
- auto fragShader = UploadShader(fragShaderAsset);
VkPipelineShaderStageCreateInfo shaderStages[2];
for (long i = 0; i < 2; ++i) {
@@ -1062,8 +1061,8 @@ void CreatePresentPipeline() {
}
shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
shaderStages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
- shaderStages[0].module = vertShader;
- shaderStages[1].module = fragShader;
+ // shaderStages[0].module = // see below
+ // shaderStages[1].module = // see below
VkDynamicState dynamicStates[2] = {
VK_DYNAMIC_STATE_VIEWPORT,
@@ -1269,6 +1268,15 @@ void CreatePresentPipeline() {
pipelineInfo.basePipelineHandle = VK_NULL_HANDLE;
pipelineInfo.basePipelineIndex = {};
+ /* 2023-12-22 JCB
+ * This happens just before needed because we want to let this
+ * thread run while background threads load the assets.
+ */
+ auto vertShader = UploadShader(vertShaderAsset);
+ auto fragShader = UploadShader(fragShaderAsset);
+ shaderStages[0].module = vertShader;
+ shaderStages[1].module = fragShader;
+
vkResult = vkCreateGraphicsPipelines(vkDevice, VK_NULL_HANDLE, 1, &pipelineInfo, vkAllocator, &graphicsPipeline);
if (vkResult != VK_SUCCESS) {
throw "failed to create graphics pipeline.";
@@ -1276,8 +1284,8 @@ void CreatePresentPipeline() {
vkDestroyShaderModule(vkDevice, fragShader, vkAllocator);
vkDestroyShaderModule(vkDevice, vertShader, vkAllocator);
- AM_Destroy(fragShaderAsset);
- AM_Destroy(vertShaderAsset);
+ AM_Release(fragShaderAsset);
+ AM_Release(vertShaderAsset);
}
void CreateFramebuffers() {
@@ -1492,6 +1500,10 @@ void CreateGraphicsPipelines() {
// pipelines
{
+ // enqueue asset loading
+ AssetHandle vertShaderAssetHandle = AM_Register("assets/shaders/vert.vert.spv");
+ AssetHandle textureFragShaderAssetHandle = AM_Register("assets/shaders/texture.frag.spv");
+
const long vertexBindingCount = 4;
long index = 0;
VkVertexInputBindingDescription vertInputBD[vertexBindingCount];
@@ -1668,35 +1680,24 @@ void CreateGraphicsPipelines() {
vkPipelineDepthStencilStateCreateInfo.minDepthBounds = {};
vkPipelineDepthStencilStateCreateInfo.maxDepthBounds = {};
- AssetHandle vertShaderAssetHandle = AM_Register("assets/shaders/vert.vert.spv");
- AssetHandle textureFragShaderAssetHandle = AM_Register("assets/shaders/texture.frag.spv");
const Asset *textureVertShaderAsset = AM_Get(vertShaderAssetHandle);
const Asset *textureFragShaderAsset = AM_Get(textureFragShaderAssetHandle);
- VkShaderModuleCreateInfo vkShaderModuleCreateInfo[2];
- vkShaderModuleCreateInfo[0].codeSize = textureVertShaderAsset->size;
- vkShaderModuleCreateInfo[0].pCode = reinterpret_cast<const uint32_t *>(textureVertShaderAsset->ptr);
- vkShaderModuleCreateInfo[1].codeSize = textureFragShaderAsset->size;
- vkShaderModuleCreateInfo[1].pCode = reinterpret_cast<const uint32_t *>(textureFragShaderAsset->ptr);
- VkShaderModule shaderModules[2];
+ assert(textureVertShaderAsset != nullptr && textureVertShaderAsset->state == PKE_ASSET_LOADING_STATE_LOADED);
+ assert(textureFragShaderAsset != nullptr && textureFragShaderAsset->state == PKE_ASSET_LOADING_STATE_LOADED);
VkPipelineShaderStageCreateInfo vkPipelineShaderStageCreateInfo[2];
for (long i = 0; i < 2; ++i) {
- vkShaderModuleCreateInfo[i].sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
- vkShaderModuleCreateInfo[i].pNext = nullptr;
- vkShaderModuleCreateInfo[i].flags = {};
vkPipelineShaderStageCreateInfo[i].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
vkPipelineShaderStageCreateInfo[i].pNext = nullptr;
vkPipelineShaderStageCreateInfo[i].flags = {};
vkPipelineShaderStageCreateInfo[i].pName = "main";
vkPipelineShaderStageCreateInfo[i].pSpecializationInfo = nullptr;
-
- vkCreateShaderModule(vkDevice, &vkShaderModuleCreateInfo[i], vkAllocator, &shaderModules[i]);
}
- vkPipelineShaderStageCreateInfo[0].module = shaderModules[0];
- vkPipelineShaderStageCreateInfo[1].module = shaderModules[1];
vkPipelineShaderStageCreateInfo[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
vkPipelineShaderStageCreateInfo[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
+ // vkPipelineShaderStageCreateInfo[0].module = // deferred
+ // vkPipelineShaderStageCreateInfo[1].module = // deferred
VkGraphicsPipelineCreateInfo vkGraphicsPipelineCreateInfo[2];
for (long i = 0; i < 2; ++i) {
@@ -1723,14 +1724,18 @@ void CreateGraphicsPipelines() {
vkGraphicsPipelineCreateInfo[0].pRasterizationState = &vkPipelineRasterizationStateCreateInfoFill;
vkGraphicsPipelineCreateInfo[1].pRasterizationState = &vkPipelineRasterizationStateCreateInfoLine;
+ // deffered shader creation
+ vkPipelineShaderStageCreateInfo[0].module = UploadShader(vertShaderAssetHandle);
+ vkPipelineShaderStageCreateInfo[1].module = UploadShader(textureFragShaderAssetHandle);
+
vkCreateGraphicsPipelines(vkDevice, VK_NULL_HANDLE, 2, vkGraphicsPipelineCreateInfo, vkAllocator, pkePipelines.pipelines.arr);
for (long i = 0; i < 2; ++i) {
- vkDestroyShaderModule(vkDevice, shaderModules[i], vkAllocator);
+ vkDestroyShaderModule(vkDevice, vkPipelineShaderStageCreateInfo[i].module, vkAllocator);
}
- AM_Destroy(textureFragShaderAssetHandle);
- AM_Destroy(vertShaderAssetHandle);
+ AM_Release(textureFragShaderAssetHandle);
+ AM_Release(vertShaderAssetHandle);
}
// debug texture
@@ -2651,6 +2656,10 @@ void DestroyWindow() {
VkShaderModule UploadShader(AssetHandle handle) {
const Asset *asset = AM_Get(handle);
+ assert(asset != nullptr && asset->state == PKE_ASSET_LOADING_STATE_LOADED);
+#ifndef NDEBUG
+ fprintf(stdout, "Uploading Shader: '%s'\n", asset->basePath);
+#endif
VkShaderModuleCreateInfo createInfo;
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;