diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-22 19:33:26 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-23 11:43:15 -0500 |
| commit | b911c5b6c37ab13be6188cf039cd4246414fc7b5 (patch) | |
| tree | da4743a719e8134abb35f87f5097541e09c8f581 /src/window.cpp | |
| parent | a3937e7eef97cb0badcd65c390b9dd39d4cfd094 (diff) | |
first pass background asset loading - buggy
Diffstat (limited to 'src/window.cpp')
| -rw-r--r-- | src/window.cpp | 57 |
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; |
