Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ccfc74a0a3 | |||
| be3d1d21e7 | |||
| 283c937b10 | |||
| f9332d9047 | |||
| 446ce9ced1 |
Vendored
+2
-2
@@ -8,7 +8,7 @@
|
|||||||
"preLaunchTask": "Build",
|
"preLaunchTask": "Build",
|
||||||
"expressions": "native",
|
"expressions": "native",
|
||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${workspaceFolder}",
|
||||||
"program": "${workspaceFolder}/build/evk"
|
"program": "${workspaceFolder}/build/samples/descriptor_heap/descriptor_heap"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
Vendored
+2
-2
@@ -23,7 +23,7 @@
|
|||||||
{
|
{
|
||||||
"label": "Run",
|
"label": "Run",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"command": "./build/evk",
|
"command": "./build/samples/descriptor_heap/descriptor_heap",
|
||||||
"windows": {
|
"windows": {
|
||||||
"command": "build/evk.exe"
|
"command": "build/evk.exe"
|
||||||
},
|
},
|
||||||
@@ -37,4 +37,4 @@
|
|||||||
"dependsOrder": "sequence"
|
"dependsOrder": "sequence"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
+4
-4
@@ -18,11 +18,11 @@ evkBuffer evkCreateBuffer(evkDevice* device, evkBufferCreateInfo createInfo)
|
|||||||
|
|
||||||
if(buffer.vk != VK_NULL_HANDLE)
|
if(buffer.vk != VK_NULL_HANDLE)
|
||||||
{
|
{
|
||||||
buffer.sizeInBytes = createInfo.sizeInBytes;
|
buffer.addressRange.address = vkGetBufferDeviceAddressKHR(device->vk, &(VkBufferDeviceAddressInfo){
|
||||||
buffer.address = vkGetBufferDeviceAddressKHR(device->vk, &(VkBufferDeviceAddressInfo){
|
.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
|
||||||
.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
|
|
||||||
.buffer = buffer.vk
|
.buffer = buffer.vk
|
||||||
});
|
});
|
||||||
|
buffer.addressRange.size = createInfo.sizeInBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
return buffer;
|
return buffer;
|
||||||
@@ -31,4 +31,4 @@ evkBuffer evkCreateBuffer(evkDevice* device, evkBufferCreateInfo createInfo)
|
|||||||
void evkDestroyBuffer(evkBuffer buf)
|
void evkDestroyBuffer(evkBuffer buf)
|
||||||
{
|
{
|
||||||
evkGPUDestroyBuffer(buf);
|
evkGPUDestroyBuffer(buf);
|
||||||
}
|
}
|
||||||
+9
-9
@@ -137,8 +137,8 @@ void evkSetDescriptor(evkDescriptorSet* set, evstring name, evkBuffer* buf)
|
|||||||
|
|
||||||
VkDescriptorAddressInfoEXT addressInfo = {
|
VkDescriptorAddressInfoEXT addressInfo = {
|
||||||
VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
|
VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
|
||||||
.address = buf->address,
|
.address = buf->addressRange.address,
|
||||||
.range = buf->sizeInBytes,
|
.range = buf->addressRange.size,
|
||||||
.format = VK_FORMAT_UNDEFINED,
|
.format = VK_FORMAT_UNDEFINED,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -168,7 +168,7 @@ void evkCmdBindDescriptorSets(evkCommandBuffer* cmdbuf, evkPipeline* pipeline, v
|
|||||||
{
|
{
|
||||||
bindingInfos[i] = (VkDescriptorBufferBindingInfoEXT) {
|
bindingInfos[i] = (VkDescriptorBufferBindingInfoEXT) {
|
||||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT,
|
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT,
|
||||||
.address = sets[setIndices[i]].buffer.address,
|
.address = sets[setIndices[i]].buffer.addressRange.address,
|
||||||
.usage = sets[setIndices[i]].buffer.usage,
|
.usage = sets[setIndices[i]].buffer.usage,
|
||||||
};
|
};
|
||||||
setOffsets[i] = offset;
|
setOffsets[i] = offset;
|
||||||
@@ -177,10 +177,10 @@ void evkCmdBindDescriptorSets(evkCommandBuffer* cmdbuf, evkPipeline* pipeline, v
|
|||||||
|
|
||||||
vkCmdBindDescriptorBuffersEXT(cmdbuf->vk, bindingCount, bindingInfos);
|
vkCmdBindDescriptorBuffersEXT(cmdbuf->vk, bindingCount, bindingInfos);
|
||||||
|
|
||||||
vkCmdSetDescriptorBufferOffsetsEXT(cmdbuf->vk,
|
vkCmdSetDescriptorBufferOffsetsEXT(cmdbuf->vk,
|
||||||
(VkPipelineBindPoint)pipeline->type,
|
(VkPipelineBindPoint)pipeline->type,
|
||||||
pipeline->layout.vk,
|
pipeline->layout.vk,
|
||||||
0, bindingCount,
|
0, bindingCount,
|
||||||
actualSetIndices,
|
actualSetIndices,
|
||||||
setOffsets);
|
setOffsets);
|
||||||
}
|
}
|
||||||
+23
-1
@@ -27,6 +27,25 @@ VkPhysicalDeviceDescriptorBufferFeaturesEXT descriptorBufFeature = {
|
|||||||
// )
|
// )
|
||||||
};
|
};
|
||||||
|
|
||||||
|
VkPhysicalDeviceDescriptorHeapFeaturesEXT descriptorHeapFeature = {
|
||||||
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_HEAP_FEATURES_EXT,
|
||||||
|
.descriptorHeap = VK_TRUE,
|
||||||
|
|
||||||
|
EV_DEBUG(
|
||||||
|
.descriptorHeapCaptureReplay = VK_TRUE,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
VkPhysicalDeviceShaderUntypedPointersFeaturesKHR shaderUntypedPointersFeature = {
|
||||||
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_UNTYPED_POINTERS_FEATURES_KHR,
|
||||||
|
.shaderUntypedPointers = VK_TRUE,
|
||||||
|
};
|
||||||
|
|
||||||
|
VkPhysicalDeviceShaderObjectFeaturesEXT shaderObjectFeature = {
|
||||||
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT,
|
||||||
|
.shaderObject = VK_TRUE,
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
evstring name;
|
evstring name;
|
||||||
void* data;
|
void* data;
|
||||||
@@ -34,7 +53,10 @@ typedef struct {
|
|||||||
} evkDeviceExtension;
|
} evkDeviceExtension;
|
||||||
|
|
||||||
const evkDeviceExtension evkSupportedExtensions[] = {
|
const evkDeviceExtension evkSupportedExtensions[] = {
|
||||||
{ evstr(VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME) , &descriptorBufFeature , &descriptorBufFeature.pNext },
|
{ evstr(VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME) , &descriptorBufFeature , &descriptorBufFeature.pNext },
|
||||||
|
{ evstr(VK_EXT_DESCRIPTOR_HEAP_EXTENSION_NAME) , &descriptorHeapFeature , &descriptorHeapFeature.pNext },
|
||||||
|
{ evstr(VK_KHR_SHADER_UNTYPED_POINTERS_EXTENSION_NAME), &shaderUntypedPointersFeature, &shaderUntypedPointersFeature.pNext },
|
||||||
|
{ evstr(VK_EXT_SHADER_OBJECT_EXTENSION_NAME) , &shaderObjectFeature , &shaderObjectFeature.pNext },
|
||||||
};
|
};
|
||||||
const u32 evkSupportedExtensionsCount = EV_ARRSIZE(evkSupportedExtensions);
|
const u32 evkSupportedExtensionsCount = EV_ARRSIZE(evkSupportedExtensions);
|
||||||
|
|
||||||
|
|||||||
+10
-2
@@ -59,8 +59,14 @@ evkPipeline evkCreateGraphicsPipeline(evkDevice device, evkPipelineCreateInfo cr
|
|||||||
for(int i = 0; i < colorAttachmentCount; i++)
|
for(int i = 0; i < colorAttachmentCount; i++)
|
||||||
colorAttachmentFormats[i] = createInfo.colorAttachments[i].format;
|
colorAttachmentFormats[i] = createInfo.colorAttachments[i].format;
|
||||||
|
|
||||||
|
VkPipelineCreateFlags2CreateInfo pipelineCreateFlags2CreateInfo = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO,
|
||||||
|
.flags = VK_PIPELINE_CREATE_2_DESCRIPTOR_HEAP_BIT_EXT,
|
||||||
|
};
|
||||||
|
|
||||||
VkPipelineRenderingCreateInfoKHR pipelineRenderingCreateInfo = {
|
VkPipelineRenderingCreateInfoKHR pipelineRenderingCreateInfo = {
|
||||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR,
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR,
|
||||||
|
.pNext = &pipelineCreateFlags2CreateInfo,
|
||||||
.colorAttachmentCount = colorAttachmentCount,
|
.colorAttachmentCount = colorAttachmentCount,
|
||||||
.pColorAttachmentFormats = colorAttachmentFormats,
|
.pColorAttachmentFormats = colorAttachmentFormats,
|
||||||
.depthAttachmentFormat = createInfo.depthAttachmentFormat,
|
.depthAttachmentFormat = createInfo.depthAttachmentFormat,
|
||||||
@@ -191,13 +197,13 @@ evkPipeline evkCreateGraphicsPipeline(evkDevice device, evkPipelineCreateInfo cr
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
assert(!"Set Layout construction through shader reflection not implemented yet.");
|
// assert(!"Set Layout construction through shader reflection not implemented yet.");
|
||||||
}
|
}
|
||||||
|
|
||||||
VkGraphicsPipelineCreateInfo graphicsPipelineCreateInfo = {
|
VkGraphicsPipelineCreateInfo graphicsPipelineCreateInfo = {
|
||||||
.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
|
||||||
.pNext = &pipelineRenderingCreateInfo,
|
.pNext = &pipelineRenderingCreateInfo,
|
||||||
.flags = VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT,
|
.flags = 0,
|
||||||
.stageCount = shaderStageCount,
|
.stageCount = shaderStageCount,
|
||||||
.pStages = shaderStageCreateInfos,
|
.pStages = shaderStageCreateInfos,
|
||||||
.pVertexInputState = &vertexInputStateCreateInfo,
|
.pVertexInputState = &vertexInputStateCreateInfo,
|
||||||
@@ -210,6 +216,8 @@ evkPipeline evkCreateGraphicsPipeline(evkDevice device, evkPipelineCreateInfo cr
|
|||||||
.layout = res.layout.vk,
|
.layout = res.layout.vk,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EVK_CHECK(vkCreateGraphicsPipelines(device.vk, VK_NULL_HANDLE, 1, &graphicsPipelineCreateInfo, NULL, &res.vk));
|
EVK_CHECK(vkCreateGraphicsPipelines(device.vk, VK_NULL_HANDLE, 1, &graphicsPipelineCreateInfo, NULL, &res.vk));
|
||||||
|
|
||||||
res._device = device;
|
res._device = device;
|
||||||
|
|||||||
+7
-4
@@ -13,7 +13,7 @@ evkShader evkInitShaderFromBytes(evkDevice device, const u8* shaderBytes, u32 sh
|
|||||||
};
|
};
|
||||||
vkCreateShaderModule(device.vk, &createInfo, NULL, &shader.vk);
|
vkCreateShaderModule(device.vk, &createInfo, NULL, &shader.vk);
|
||||||
|
|
||||||
shader.reflect = evkGenerateShaderReflectionData(shaderBytes, shaderLen);
|
// shader.reflect = evkGenerateShaderReflectionData(shaderBytes, shaderLen);
|
||||||
|
|
||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
@@ -96,6 +96,7 @@ evkShaderCompiler evkCreateShaderCompiler()
|
|||||||
evkShaderCompiler compiler;
|
evkShaderCompiler compiler;
|
||||||
compiler.sc = shaderc_compiler_initialize();
|
compiler.sc = shaderc_compiler_initialize();
|
||||||
compiler.scopt = shaderc_compile_options_initialize();
|
compiler.scopt = shaderc_compile_options_initialize();
|
||||||
|
shaderc_compile_options_set_target_spirv(compiler.scopt, shaderc_spirv_version_1_3);
|
||||||
shaderc_compile_options_set_include_callbacks(compiler.scopt, _shader_include_resolve, _shader_include_release, NULL);
|
shaderc_compile_options_set_include_callbacks(compiler.scopt, _shader_include_resolve, _shader_include_release, NULL);
|
||||||
shaderc_compile_options_set_generate_debug_info(compiler.scopt);
|
shaderc_compile_options_set_generate_debug_info(compiler.scopt);
|
||||||
return compiler;
|
return compiler;
|
||||||
@@ -107,7 +108,7 @@ void evkDestroyShaderCompiler(evkShaderCompiler compiler)
|
|||||||
shaderc_compiler_release(compiler.sc);
|
shaderc_compiler_release(compiler.sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
evkShader evkInitShaderFromString(evkDevice device, evkShaderCompiler compiler,evstring shaderName, evstring shaderText)
|
evkShader evkInitShaderFromString(evkDevice device, evkShaderCompiler compiler,evstring shaderName, evstring shaderText, VkShaderStageFlags stage)
|
||||||
{
|
{
|
||||||
shaderc_compilation_result_t compilation_result = shaderc_compile_into_spv(compiler.sc, shaderText, evstring_getLength(shaderText), shaderc_glsl_infer_from_source, shaderName, "main", compiler.scopt);
|
shaderc_compilation_result_t compilation_result = shaderc_compile_into_spv(compiler.sc, shaderText, evstring_getLength(shaderText), shaderc_glsl_infer_from_source, shaderName, "main", compiler.scopt);
|
||||||
|
|
||||||
@@ -121,12 +122,14 @@ evkShader evkInitShaderFromString(evkDevice device, evkShaderCompiler compiler,e
|
|||||||
ev_log_error("Errors:\n%s", shaderc_result_get_error_message(compilation_result));
|
ev_log_error("Errors:\n%s", shaderc_result_get_error_message(compilation_result));
|
||||||
}
|
}
|
||||||
|
|
||||||
return evkInitShaderFromBytes(device, (u8*)shaderc_result_get_bytes(compilation_result), shaderc_result_get_length(compilation_result));
|
evkShader res = evkInitShaderFromBytes(device, (u8*)shaderc_result_get_bytes(compilation_result), shaderc_result_get_length(compilation_result));
|
||||||
|
res.reflect.stage = stage;
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
evkShader evkInitShaderFromFile(evkDevice device, evkShaderCompiler compiler, evstring shaderPath)
|
evkShader evkInitShaderFromFile(evkDevice device, evkShaderCompiler compiler, evstring shaderPath)
|
||||||
{
|
{
|
||||||
evstring shaderText = evstring_readFile(shaderPath);
|
evstring shaderText = evstring_readFile(shaderPath);
|
||||||
return evkInitShaderFromString(device, compiler, shaderPath, shaderText);
|
return evkInitShaderFromString(device, compiler, shaderPath, shaderText, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
VkPipelineShaderStageCreateInfo evkGetShaderStageCreateInfo(evkShader shader)
|
VkPipelineShaderStageCreateInfo evkGetShaderStageCreateInfo(evkShader shader)
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
[[nodiscard("Leaking VkShaderModule")]]
|
[[nodiscard("Leaking VkShaderModule")]]
|
||||||
evkShader evkInitShaderFromBytes(evkDevice device, const u8* shaderBytes, u32 shaderLen);
|
evkShader evkInitShaderFromBytes(evkDevice device, const u8* shaderBytes, u32 shaderLen);
|
||||||
[[nodiscard("Leaking VkShaderModule")]]
|
[[nodiscard("Leaking VkShaderModule")]]
|
||||||
evkShader evkInitShaderFromString(evkDevice device, evkShaderCompiler compiler, evstring shaderName, evstring shaderText);
|
evkShader evkInitShaderFromString(evkDevice device, evkShaderCompiler compiler, evstring shaderName, evstring shaderText, VkShaderStageFlags stage);
|
||||||
[[nodiscard("Leaking VkShaderModule")]]
|
[[nodiscard("Leaking VkShaderModule")]]
|
||||||
evkShader evkInitShaderFromFile(evkDevice device, evkShaderCompiler compiler, evstring shaderPath);
|
evkShader evkInitShaderFromFile(evkDevice device, evkShaderCompiler compiler, evstring shaderPath);
|
||||||
void evkDestroyShader(evkDevice device, evkShader shader);
|
void evkDestroyShader(evkDevice device, evkShader shader);
|
||||||
|
|||||||
+8
-9
@@ -26,7 +26,7 @@ TYPEDATA_GEN(VkRenderingAttachmentInfoKHR,
|
|||||||
.clearValue = (VkClearValue){{{0.f, 0.f, 0.f, 1.f}}},
|
.clearValue = (VkClearValue){{{0.f, 0.f, 0.f, 1.f}}},
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
TYPEDATA_GEN(VkViewport,
|
TYPEDATA_GEN(VkViewport,
|
||||||
DEFAULT(
|
DEFAULT(
|
||||||
.x = 0,
|
.x = 0,
|
||||||
.y = 0,
|
.y = 0,
|
||||||
@@ -65,11 +65,11 @@ TYPEDATA_GEN(VkImageMemoryBarrier,
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
TYPEDATA_GEN(VkRect2D,
|
TYPEDATA_GEN(VkRect2D,
|
||||||
DEFAULT(0)
|
DEFAULT(0)
|
||||||
)
|
)
|
||||||
|
|
||||||
TYPEDATA_GEN(VkRenderingInfo,
|
TYPEDATA_GEN(VkRenderingInfo,
|
||||||
DEFAULT(
|
DEFAULT(
|
||||||
.sType = VK_STRUCTURE_TYPE_RENDERING_INFO,
|
.sType = VK_STRUCTURE_TYPE_RENDERING_INFO,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
@@ -365,9 +365,8 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
VkBuffer vk;
|
VkBuffer vk;
|
||||||
evkGPUAllocationData allocData;
|
evkGPUAllocationData allocData;
|
||||||
u32 sizeInBytes;
|
|
||||||
VkBufferUsageFlags usage;
|
VkBufferUsageFlags usage;
|
||||||
VkDeviceAddress address;
|
VkDeviceAddressRangeEXT addressRange;
|
||||||
} evkBuffer;
|
} evkBuffer;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -522,7 +521,7 @@ typedef struct {
|
|||||||
evkPipeline* boundPipeline;
|
evkPipeline* boundPipeline;
|
||||||
} evkCommandBuffer;
|
} evkCommandBuffer;
|
||||||
|
|
||||||
TYPEDATA_GEN(evkInstance,
|
TYPEDATA_GEN(evkInstance,
|
||||||
INVALID(
|
INVALID(
|
||||||
.vk = VK_NULL_HANDLE,
|
.vk = VK_NULL_HANDLE,
|
||||||
)
|
)
|
||||||
@@ -561,7 +560,7 @@ TYPEDATA_GEN(evkImageViewCreateInfo,
|
|||||||
TYPEDATA_GEN(evkAllocationUserData, INVALID(__EV_VEC_EMPTY_ARRAY));
|
TYPEDATA_GEN(evkAllocationUserData, INVALID(__EV_VEC_EMPTY_ARRAY));
|
||||||
TYPEDATA_GEN(evkDeviceQueueRequirement);
|
TYPEDATA_GEN(evkDeviceQueueRequirement);
|
||||||
|
|
||||||
TYPEDATA_GEN(evkViewport,
|
TYPEDATA_GEN(evkViewport,
|
||||||
DEFAULT(
|
DEFAULT(
|
||||||
.x = 0,
|
.x = 0,
|
||||||
.y = 0,
|
.y = 0,
|
||||||
@@ -578,7 +577,7 @@ TYPEDATA_GEN(evkViewport,
|
|||||||
|
|
||||||
TYPEDATA_GEN(evkColorAttachment);
|
TYPEDATA_GEN(evkColorAttachment);
|
||||||
|
|
||||||
TYPEDATA_GEN(evkPipelineCreateInfo,
|
TYPEDATA_GEN(evkPipelineCreateInfo,
|
||||||
DEFAULT(
|
DEFAULT(
|
||||||
.type = EVK_PIPELINE_TYPE_GRAPHICS,
|
.type = EVK_PIPELINE_TYPE_GRAPHICS,
|
||||||
.dynamicStates = EV_VEC_EMPTY,
|
.dynamicStates = EV_VEC_EMPTY,
|
||||||
@@ -598,4 +597,4 @@ TYPEDATA_GEN(evkDescriptorBinding);
|
|||||||
TYPEDATA_GEN(evkDescriptorSetLayout);
|
TYPEDATA_GEN(evkDescriptorSetLayout);
|
||||||
TYPEDATA_GEN(evkDescriptorSet);
|
TYPEDATA_GEN(evkDescriptorSet);
|
||||||
|
|
||||||
TYPEDATA_GEN(evkCommandBuffer);
|
TYPEDATA_GEN(evkCommandBuffer);
|
||||||
+2
-2
@@ -31,8 +31,8 @@ disabled_warnings = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
subproject('evol-headers', default_options: {'build_tests': false})
|
subproject('evol-headers', default_options: {'build_tests': false})
|
||||||
subproject('volk')
|
# subproject('volk')
|
||||||
subproject('shaderc')
|
# subproject('shaderc')
|
||||||
|
|
||||||
evk_c_args = []
|
evk_c_args = []
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,372 @@
|
|||||||
|
#include <evk/evk.h>
|
||||||
|
#include <ev_numeric.h>
|
||||||
|
#include <ev_helpers.h>
|
||||||
|
#include <ev_log.h>
|
||||||
|
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
evstring PROJECT_NAME = evstr("heap_triangle");
|
||||||
|
|
||||||
|
char vertexShaderBytes[] = {
|
||||||
|
#embed "shaders/heap_triangle.vert"
|
||||||
|
,'\0'
|
||||||
|
};
|
||||||
|
char fragmentShaderBytes[] = {
|
||||||
|
#embed "shaders/heap_triangle.frag"
|
||||||
|
,'\0'
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
u32 width = 1280;
|
||||||
|
u32 height = 800;
|
||||||
|
|
||||||
|
evkInstance instance = evkCreateInstance((evkInstanceCreateInfo){
|
||||||
|
.applicationInfo = EV_DEFAULT(evkApplicationInfo),
|
||||||
|
.layers = svec_init(evstring, {
|
||||||
|
evstr("VK_LAYER_KHRONOS_validation"),
|
||||||
|
}),
|
||||||
|
.extensions = svec_init(evstring, {
|
||||||
|
evstr("VK_KHR_surface"),
|
||||||
|
// TODO Get these from GLFW
|
||||||
|
#if EV_OS_WINDOWS
|
||||||
|
evstr("VK_KHR_win32_surface"),
|
||||||
|
#elif EV_OS_LINUX
|
||||||
|
evstr("VK_KHR_xcb_surface"),
|
||||||
|
#endif
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
if(instance.vk == EV_INVALID(VkInstance))
|
||||||
|
{
|
||||||
|
ev_log_error("Instance creation failed.");
|
||||||
|
goto InstanceCreationFailed;
|
||||||
|
}
|
||||||
|
ev_log_info("Instance was created successfully.");
|
||||||
|
|
||||||
|
evkDevice device = evkCreateDevice((evkDeviceCreateInfo) {
|
||||||
|
.instance = instance,
|
||||||
|
// TODO Add a fallback physical device option.
|
||||||
|
// .physicalDeviceType = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
|
||||||
|
.physicalDeviceType = VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU,
|
||||||
|
.queueRequirements = svec_init(evkDeviceQueueRequirement, {
|
||||||
|
{ VK_QUEUE_GRAPHICS_BIT, 1 },
|
||||||
|
{ VK_QUEUE_COMPUTE_BIT , 1 },
|
||||||
|
}),
|
||||||
|
.deviceExtensions = svec_init(evstring, {
|
||||||
|
evstr("VK_KHR_swapchain"),
|
||||||
|
evstr("VK_KHR_dynamic_rendering"),
|
||||||
|
evstr("VK_KHR_depth_stencil_resolve"),
|
||||||
|
evstr("VK_KHR_create_renderpass2"),
|
||||||
|
evstr("VK_KHR_synchronization2"),
|
||||||
|
evstr("VK_KHR_buffer_device_address"),
|
||||||
|
evstr("VK_EXT_descriptor_indexing"),
|
||||||
|
evstr("VK_KHR_maintenance5"),
|
||||||
|
evstr("VK_EXT_descriptor_heap"),
|
||||||
|
evstr(VK_EXT_SHADER_OBJECT_EXTENSION_NAME),
|
||||||
|
evstr(VK_KHR_SHADER_UNTYPED_POINTERS_EXTENSION_NAME),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
if(device.vk == EV_INVALID(VkDevice))
|
||||||
|
{
|
||||||
|
ev_log_error("Couldn't create a VkDevice");
|
||||||
|
goto DeviceCreationFailed;
|
||||||
|
}
|
||||||
|
ev_log_info("Logical Device created successfully.");
|
||||||
|
|
||||||
|
VkQueue graphicsQueue;
|
||||||
|
vkGetDeviceQueue(device.vk, device.queueFamilies[VK_QUEUE_GRAPHICS_BIT].familyIndex, 0, &graphicsQueue);
|
||||||
|
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
ev_log_error("GLFW Initialization failed.");
|
||||||
|
goto GLFWInitFailed;
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
||||||
|
GLFWwindow* window = glfwCreateWindow(width, height, "evk", NULL, NULL);
|
||||||
|
if(!window)
|
||||||
|
{
|
||||||
|
ev_log_error("Window Creation Failed.");
|
||||||
|
goto WindowCreationFailed;
|
||||||
|
}
|
||||||
|
|
||||||
|
VkSurfaceKHR surface;
|
||||||
|
VkResult err = EVK_CHECK(glfwCreateWindowSurface(instance.vk, window, NULL, &surface));
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
ev_log_error("Surface creation failed.");
|
||||||
|
goto VKSurfaceCreationFailed;
|
||||||
|
}
|
||||||
|
|
||||||
|
evkGPUAllocator allocator = evkGPUCreateAllocator(device);
|
||||||
|
|
||||||
|
evkSwapChain swapChain = evkCreateSwapChain((evkSwapChainCreateInfo){
|
||||||
|
.device = device,
|
||||||
|
.surface = surface,
|
||||||
|
.width = width,
|
||||||
|
.height = height,
|
||||||
|
.imageCount = 3,
|
||||||
|
});
|
||||||
|
|
||||||
|
evkCommandPool commandPool = evkCreateCommandPool((evkCommandPoolCreateInfo) {
|
||||||
|
.device = device,
|
||||||
|
.queueFlags = VK_QUEUE_GRAPHICS_BIT,
|
||||||
|
.poolFlags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
|
||||||
|
});
|
||||||
|
|
||||||
|
vec(evkCommandBuffer) commandBuffers = evkAllocateCommandBuffers(device, commandPool, vec_len(&swapChain.images), true);
|
||||||
|
|
||||||
|
evkShaderCompiler compiler = evkCreateShaderCompiler();
|
||||||
|
|
||||||
|
evstring vertexShaderText = evstring_new(vertexShaderBytes);
|
||||||
|
evstring fragmentShaderText = evstring_new(fragmentShaderBytes);
|
||||||
|
|
||||||
|
evkShader vertShader = evkInitShaderFromString(device, compiler, evstr("heap_triangle.vert"),vertexShaderText, VK_SHADER_STAGE_VERTEX_BIT);
|
||||||
|
evkShader fragShader = evkInitShaderFromString(device, compiler, evstr("heap_triangle.frag"), fragmentShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
|
|
||||||
|
evstring_free(vertexShaderText);
|
||||||
|
evstring_free(fragmentShaderText);
|
||||||
|
|
||||||
|
evkDestroyShaderCompiler(compiler);
|
||||||
|
|
||||||
|
evkColorAttachment colorAttachment0 = {
|
||||||
|
swapChain.surfaceFormat.format,
|
||||||
|
EV_DEFAULT(VkPipelineColorBlendAttachmentState)
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO Get this from shader reflection data
|
||||||
|
// evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayout(
|
||||||
|
// &device, svec_init(evkDescriptorBinding, {
|
||||||
|
// {
|
||||||
|
// .name = evstr("positions"),
|
||||||
|
// .binding = 0,
|
||||||
|
// .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||||
|
// .descriptorCount = 1,
|
||||||
|
// .stageFlags = VK_SHADER_STAGE_ALL_GRAPHICS,
|
||||||
|
// },
|
||||||
|
// })
|
||||||
|
// );
|
||||||
|
// evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayoutFromBindings(&device, vertShader.reflect.bindings);
|
||||||
|
|
||||||
|
// evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayoutFromShaders(&device, svec_init(evkShader, {vertShader, fragShader}));
|
||||||
|
|
||||||
|
evkPipelineCreateInfo pipelineCreateInfo = EV_DEFAULT(evkPipelineCreateInfo,
|
||||||
|
dynamicStates = svec_init(VkDynamicState, {
|
||||||
|
VK_DYNAMIC_STATE_VIEWPORT,
|
||||||
|
VK_DYNAMIC_STATE_SCISSOR,
|
||||||
|
}),
|
||||||
|
shaderStages = svec_init(evkShader, {
|
||||||
|
vertShader,
|
||||||
|
fragShader,
|
||||||
|
}),
|
||||||
|
colorAttachments = svec_init(evkColorAttachment, {
|
||||||
|
colorAttachment0,
|
||||||
|
}),
|
||||||
|
viewportCountOverride = 1,
|
||||||
|
|
||||||
|
vertexBufferLayouts = svec_init(evkVertexBufferLayout, {
|
||||||
|
{{ // VB #0
|
||||||
|
{ EVK_VERTEX_ATTRIBUTE_POSITION, EVK_FMT_FLOAT32, 2 },
|
||||||
|
}},
|
||||||
|
}),
|
||||||
|
|
||||||
|
// setLayouts = svec_init(evkDescriptorSetLayout, {setLayout_0}),
|
||||||
|
);
|
||||||
|
|
||||||
|
evkBuffer resourceDescriptorHeap = evkCreateBuffer(&device, (evkBufferCreateInfo) {
|
||||||
|
.sizeInBytes = 16 * 4, // bufferDescriptorSize is 16 on my current device
|
||||||
|
.usage = VK_BUFFER_USAGE_DESCRIPTOR_HEAP_BIT_EXT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
|
||||||
|
.exclusive = true,
|
||||||
|
.allocationCreateInfo = {
|
||||||
|
.allocationFlags = EVK_GPU_ALLOCATION_CREATE_MAPPED_BIT | EVK_GPU_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT,
|
||||||
|
.allocator = allocator,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
evkBuffer uniBuf = evkCreateBuffer(&device, (evkBufferCreateInfo) {
|
||||||
|
.sizeInBytes = 12 * 4,
|
||||||
|
.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
|
||||||
|
.allocationCreateInfo = {
|
||||||
|
.allocationFlags = EVK_GPU_ALLOCATION_CREATE_MAPPED_BIT | EVK_GPU_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT,
|
||||||
|
.allocator = allocator,
|
||||||
|
},
|
||||||
|
.exclusive = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
float* uni_arr = (float*)uniBuf.allocData.allocationInfo.vma.pMappedData;
|
||||||
|
uni_arr[0] = 0.0f; uni_arr[1] = -0.5f; uni_arr[2] = 0.0f; uni_arr[3] = 1.0f;
|
||||||
|
uni_arr[4] = 0.5f; uni_arr[5] = 0.5f; uni_arr[6] = 0.0f; uni_arr[7] = 1.0f;
|
||||||
|
uni_arr[8] = -0.5f; uni_arr[9] = 0.5f; uni_arr[10] = 0.0f; uni_arr[11] = 1.0f;
|
||||||
|
|
||||||
|
// evkSetDescriptor(&set_0, evstr("vertexData"), &uniBuf);
|
||||||
|
|
||||||
|
VkResourceDescriptorInfoEXT resource = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_RESOURCE_DESCRIPTOR_INFO_EXT,
|
||||||
|
.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||||
|
.data.pAddressRange = &uniBuf.addressRange
|
||||||
|
};
|
||||||
|
|
||||||
|
VkHostAddressRangeEXT descriptor = {
|
||||||
|
.address = resourceDescriptorHeap.allocData.allocationInfo.vma.pMappedData,
|
||||||
|
.size = 16
|
||||||
|
};
|
||||||
|
|
||||||
|
vkWriteResourceDescriptorsEXT(device.vk, 1, &resource, &descriptor);
|
||||||
|
|
||||||
|
VkViewport viewport = EV_DEFAULT(VkViewport, width=width, height=height);
|
||||||
|
VkRect2D scissor = EV_DEFAULT(VkRect2D,extent.width=width, extent.height=height);
|
||||||
|
|
||||||
|
evkPipeline graphicsPipeline = evkCreatePipeline(device, pipelineCreateInfo);
|
||||||
|
|
||||||
|
u32 imageCount = vec_len(&swapChain.images);
|
||||||
|
|
||||||
|
VkFence drawFence = evkCreateFence(device, false);
|
||||||
|
vec(VkSemaphore) imageAcquiredSemaphores = vec_init(VkSemaphore);
|
||||||
|
vec(VkSemaphore) drawFinishedSemaphores = vec_init(VkSemaphore);
|
||||||
|
for(u32 i = 0; i < imageCount; i++)
|
||||||
|
{
|
||||||
|
imageAcquiredSemaphores[i] = evkCreateSemaphore(device);
|
||||||
|
drawFinishedSemaphores[i] = evkCreateSemaphore(device);
|
||||||
|
}
|
||||||
|
// VkSemaphore imageAcquiredSemaphore = evkCreateSemaphore(device);
|
||||||
|
// VkSemaphore drawFinishedSemaphore = evkCreateSemaphore(device);
|
||||||
|
|
||||||
|
i32 imageIdx = -1;
|
||||||
|
while(!glfwWindowShouldClose(window))
|
||||||
|
{
|
||||||
|
imageIdx = (imageIdx + 1) % imageCount;
|
||||||
|
u32 swapChainImageIdx;
|
||||||
|
EVK_CHECK(vkAcquireNextImageKHR(device.vk, swapChain.vk, UInt64.MAX, imageAcquiredSemaphores[imageIdx], VK_NULL_HANDLE, &swapChainImageIdx));
|
||||||
|
|
||||||
|
evkCommandBuffer cmdbuf = commandBuffers[imageIdx];
|
||||||
|
|
||||||
|
VkRenderingAttachmentInfoKHR colorAttachment = EV_DEFAULT(VkRenderingAttachmentInfoKHR,
|
||||||
|
imageView = swapChain.imageViews[swapChainImageIdx].vk,
|
||||||
|
loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
|
||||||
|
storeOp= VK_ATTACHMENT_STORE_OP_STORE,
|
||||||
|
);
|
||||||
|
|
||||||
|
VkRenderingInfo renderingInfo = EV_DEFAULT(VkRenderingInfo,
|
||||||
|
renderArea.extent = ((VkExtent2D){width, height}),
|
||||||
|
pColorAttachments = &colorAttachment,
|
||||||
|
colorAttachmentCount = 1,
|
||||||
|
);
|
||||||
|
|
||||||
|
evkBeginPrimaryCommandBuffer(&cmdbuf);
|
||||||
|
{
|
||||||
|
evkCmdImageBarrier(&cmdbuf, EV_DEFAULT(VkImageMemoryBarrier,
|
||||||
|
image = swapChain.images[swapChainImageIdx].vk,
|
||||||
|
newLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR,
|
||||||
|
subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT
|
||||||
|
));
|
||||||
|
|
||||||
|
// VkDeviceSize offset = 0;
|
||||||
|
// vkCmdBindVertexBuffers(cmdbuf.vk, 0, 1, &vertBuf.vk, &offset);
|
||||||
|
|
||||||
|
// evkCmdBindDescriptorSets(&cmdbuf, &graphicsPipeline, svec_init(evkDescriptorSet, { set_0 }), svec_init(u32, { 0 }));
|
||||||
|
|
||||||
|
vkCmdSetScissor(cmdbuf.vk, 0, 1, &scissor);
|
||||||
|
vkCmdSetViewport(cmdbuf.vk, 0, 1, &viewport);
|
||||||
|
|
||||||
|
vkCmdBindResourceHeapEXT(cmdbuf.vk, &(VkBindHeapInfoEXT) {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_BIND_HEAP_INFO_EXT,
|
||||||
|
.heapRange = resourceDescriptorHeap.addressRange,
|
||||||
|
});
|
||||||
|
|
||||||
|
vkCmdBeginRenderingKHR(cmdbuf.vk, &renderingInfo);
|
||||||
|
|
||||||
|
evkCmdBindPipeline(&cmdbuf, &graphicsPipeline);
|
||||||
|
vkCmdDraw(cmdbuf.vk, 3, 1, 0, 0);
|
||||||
|
|
||||||
|
vkCmdEndRenderingKHR(cmdbuf.vk);
|
||||||
|
|
||||||
|
evkCmdImageBarrier(&cmdbuf, EV_DEFAULT(VkImageMemoryBarrier,
|
||||||
|
image = swapChain.images[swapChainImageIdx].vk,
|
||||||
|
oldLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR,
|
||||||
|
newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
||||||
|
subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT
|
||||||
|
));
|
||||||
|
}
|
||||||
|
evkEndCommandBuffer(&cmdbuf);
|
||||||
|
|
||||||
|
VkPipelineStageFlags waitStages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT};
|
||||||
|
|
||||||
|
VkSubmitInfo submitInfo = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
|
||||||
|
.pCommandBuffers = &cmdbuf.vk, // TODO This won't work with more than a single cmdbuf
|
||||||
|
.commandBufferCount = 1,
|
||||||
|
.waitSemaphoreCount = 1,
|
||||||
|
.pWaitSemaphores = &imageAcquiredSemaphores[imageIdx],
|
||||||
|
.pWaitDstStageMask = waitStages,
|
||||||
|
.signalSemaphoreCount = 1,
|
||||||
|
.pSignalSemaphores = &drawFinishedSemaphores[swapChainImageIdx],
|
||||||
|
};
|
||||||
|
|
||||||
|
vkQueueSubmit(graphicsQueue, 1, &submitInfo, drawFence);
|
||||||
|
vkWaitForFences(device.vk, 1, &drawFence, VK_TRUE, UInt64.MAX);
|
||||||
|
vkResetFences(device.vk, 1, &drawFence);
|
||||||
|
|
||||||
|
VkPresentInfoKHR presentInfo = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
|
||||||
|
.waitSemaphoreCount = 1,
|
||||||
|
.pWaitSemaphores = &drawFinishedSemaphores[swapChainImageIdx],
|
||||||
|
.swapchainCount = 1,
|
||||||
|
.pSwapchains = &swapChain.vk,
|
||||||
|
.pImageIndices = &swapChainImageIdx,
|
||||||
|
};
|
||||||
|
vkQueuePresentKHR(graphicsQueue, &presentInfo);
|
||||||
|
|
||||||
|
vkResetCommandBuffer(cmdbuf.vk,VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
|
||||||
|
|
||||||
|
// Main Loop
|
||||||
|
glfwPollEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
vkQueueWaitIdle(graphicsQueue);
|
||||||
|
|
||||||
|
vkDestroyFence(device.vk, drawFence, NULL);
|
||||||
|
for(u32 i = 0; i < imageCount; i++)
|
||||||
|
{
|
||||||
|
vkDestroySemaphore(device.vk, imageAcquiredSemaphores[i], NULL);
|
||||||
|
vkDestroySemaphore(device.vk, drawFinishedSemaphores[i], NULL);
|
||||||
|
}
|
||||||
|
// vkDestroySemaphore(device.vk, imageAcquiredSemaphore, NULL);
|
||||||
|
// vkDestroySemaphore(device.vk, drawFinishedSemaphore, NULL);
|
||||||
|
|
||||||
|
evkDestroyPipeline(graphicsPipeline);
|
||||||
|
|
||||||
|
// evkDestroyBuffer(vertBuf);
|
||||||
|
evkDestroyBuffer(uniBuf);
|
||||||
|
|
||||||
|
// evkDestroyDescriptorSet(&device, &set_0);
|
||||||
|
// evkDestroyDescriptorSetLayout(&device, &setLayout_0);
|
||||||
|
|
||||||
|
evkDestroyShader(device, vertShader);
|
||||||
|
evkDestroyShader(device, fragShader);
|
||||||
|
|
||||||
|
evkFreeCommandBuffers(device, commandPool, commandBuffers);
|
||||||
|
evkDestroyCommandPool(device, commandPool);
|
||||||
|
|
||||||
|
evkGPUDestroyAllocator(allocator);
|
||||||
|
|
||||||
|
evkDestroySwapChain(device, swapChain);
|
||||||
|
|
||||||
|
// SwapchainCreationFailed:
|
||||||
|
vkDestroySurfaceKHR(instance.vk, swapChain.surface, NULL);
|
||||||
|
|
||||||
|
VKSurfaceCreationFailed:
|
||||||
|
WindowCreationFailed:
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
GLFWInitFailed:
|
||||||
|
evkDestroyDevice(device);
|
||||||
|
|
||||||
|
DeviceCreationFailed:
|
||||||
|
evkDestroyInstance(instance);
|
||||||
|
InstanceCreationFailed:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
executable(
|
||||||
|
'descriptor_heap',
|
||||||
|
'descriptor_heap.c',
|
||||||
|
dependencies: [
|
||||||
|
dependency('evk'),
|
||||||
|
dependency('glfw3'),
|
||||||
|
],
|
||||||
|
c_args: evk_c_args,
|
||||||
|
)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#version 450
|
||||||
|
#pragma shader_stage(fragment)
|
||||||
|
|
||||||
|
#extension GL_EXT_descriptor_heap: require
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 outColor;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
outColor = vec4(0.f, 1.f, 0.f, 1.f);
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
#version 450
|
||||||
|
#pragma shader_stage(vertex)
|
||||||
|
|
||||||
|
#extension GL_EXT_descriptor_heap: require
|
||||||
|
|
||||||
|
layout(descriptor_heap) uniform data {
|
||||||
|
vec4 positions[3];
|
||||||
|
} vertexData[];
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
gl_Position = vertexData[0].positions[gl_VertexIndex];
|
||||||
|
}
|
||||||
@@ -0,0 +1,372 @@
|
|||||||
|
#include <evk/evk.h>
|
||||||
|
#include <ev_numeric.h>
|
||||||
|
#include <ev_helpers.h>
|
||||||
|
#include <ev_log.h>
|
||||||
|
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
evstring PROJECT_NAME = evstr("mesh_triangle");
|
||||||
|
|
||||||
|
char vertexShaderBytes[] = {
|
||||||
|
#embed "shaders/mesh_triangle.vert"
|
||||||
|
,'\0'
|
||||||
|
};
|
||||||
|
char fragmentShaderBytes[] = {
|
||||||
|
#embed "shaders/mesh_triangle.frag"
|
||||||
|
,'\0'
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
u32 width = 1280;
|
||||||
|
u32 height = 800;
|
||||||
|
|
||||||
|
evkInstance instance = evkCreateInstance((evkInstanceCreateInfo){
|
||||||
|
.applicationInfo = EV_DEFAULT(evkApplicationInfo),
|
||||||
|
.layers = svec_init(evstring, {
|
||||||
|
evstr("VK_LAYER_KHRONOS_validation"),
|
||||||
|
}),
|
||||||
|
.extensions = svec_init(evstring, {
|
||||||
|
evstr("VK_KHR_surface"),
|
||||||
|
// TODO Get these from GLFW
|
||||||
|
#if EV_OS_WINDOWS
|
||||||
|
evstr("VK_KHR_win32_surface"),
|
||||||
|
#elif EV_OS_LINUX
|
||||||
|
evstr("VK_KHR_xcb_surface"),
|
||||||
|
#endif
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
if(instance.vk == EV_INVALID(VkInstance))
|
||||||
|
{
|
||||||
|
ev_log_error("Instance creation failed.");
|
||||||
|
goto InstanceCreationFailed;
|
||||||
|
}
|
||||||
|
ev_log_info("Instance was created successfully.");
|
||||||
|
|
||||||
|
evkDevice device = evkCreateDevice((evkDeviceCreateInfo) {
|
||||||
|
.instance = instance,
|
||||||
|
// TODO Add a fallback physical device option.
|
||||||
|
// .physicalDeviceType = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
|
||||||
|
.physicalDeviceType = VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU,
|
||||||
|
.queueRequirements = svec_init(evkDeviceQueueRequirement, {
|
||||||
|
{ VK_QUEUE_GRAPHICS_BIT, 1 },
|
||||||
|
{ VK_QUEUE_COMPUTE_BIT , 1 },
|
||||||
|
}),
|
||||||
|
.deviceExtensions = svec_init(evstring, {
|
||||||
|
evstr("VK_KHR_swapchain"),
|
||||||
|
evstr("VK_KHR_dynamic_rendering"),
|
||||||
|
evstr("VK_KHR_depth_stencil_resolve"),
|
||||||
|
evstr("VK_KHR_create_renderpass2"),
|
||||||
|
evstr("VK_KHR_synchronization2"),
|
||||||
|
evstr("VK_KHR_buffer_device_address"),
|
||||||
|
evstr("VK_EXT_descriptor_indexing"),
|
||||||
|
evstr("VK_KHR_maintenance5"),
|
||||||
|
evstr("VK_EXT_descriptor_heap"),
|
||||||
|
evstr(VK_EXT_SHADER_OBJECT_EXTENSION_NAME),
|
||||||
|
evstr(VK_KHR_SHADER_UNTYPED_POINTERS_EXTENSION_NAME),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
if(device.vk == EV_INVALID(VkDevice))
|
||||||
|
{
|
||||||
|
ev_log_error("Couldn't create a VkDevice");
|
||||||
|
goto DeviceCreationFailed;
|
||||||
|
}
|
||||||
|
ev_log_info("Logical Device created successfully.");
|
||||||
|
|
||||||
|
VkQueue graphicsQueue;
|
||||||
|
vkGetDeviceQueue(device.vk, device.queueFamilies[VK_QUEUE_GRAPHICS_BIT].familyIndex, 0, &graphicsQueue);
|
||||||
|
|
||||||
|
if (!glfwInit())
|
||||||
|
{
|
||||||
|
ev_log_error("GLFW Initialization failed.");
|
||||||
|
goto GLFWInitFailed;
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
||||||
|
GLFWwindow* window = glfwCreateWindow(width, height, "evk", NULL, NULL);
|
||||||
|
if(!window)
|
||||||
|
{
|
||||||
|
ev_log_error("Window Creation Failed.");
|
||||||
|
goto WindowCreationFailed;
|
||||||
|
}
|
||||||
|
|
||||||
|
VkSurfaceKHR surface;
|
||||||
|
VkResult err = EVK_CHECK(glfwCreateWindowSurface(instance.vk, window, NULL, &surface));
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
ev_log_error("Surface creation failed.");
|
||||||
|
goto VKSurfaceCreationFailed;
|
||||||
|
}
|
||||||
|
|
||||||
|
evkGPUAllocator allocator = evkGPUCreateAllocator(device);
|
||||||
|
|
||||||
|
evkSwapChain swapChain = evkCreateSwapChain((evkSwapChainCreateInfo){
|
||||||
|
.device = device,
|
||||||
|
.surface = surface,
|
||||||
|
.width = width,
|
||||||
|
.height = height,
|
||||||
|
.imageCount = 3,
|
||||||
|
});
|
||||||
|
|
||||||
|
evkCommandPool commandPool = evkCreateCommandPool((evkCommandPoolCreateInfo) {
|
||||||
|
.device = device,
|
||||||
|
.queueFlags = VK_QUEUE_GRAPHICS_BIT,
|
||||||
|
.poolFlags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
|
||||||
|
});
|
||||||
|
|
||||||
|
vec(evkCommandBuffer) commandBuffers = evkAllocateCommandBuffers(device, commandPool, vec_len(&swapChain.images), true);
|
||||||
|
|
||||||
|
evkShaderCompiler compiler = evkCreateShaderCompiler();
|
||||||
|
|
||||||
|
evstring vertexShaderText = evstring_new(vertexShaderBytes);
|
||||||
|
evstring fragmentShaderText = evstring_new(fragmentShaderBytes);
|
||||||
|
|
||||||
|
evkShader vertShader = evkInitShaderFromString(device, compiler, evstr("mesh_triangle.vert"),vertexShaderText, VK_SHADER_STAGE_VERTEX_BIT);
|
||||||
|
evkShader fragShader = evkInitShaderFromString(device, compiler, evstr("mesh_triangle.frag"), fragmentShaderText, VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
|
|
||||||
|
evstring_free(vertexShaderText);
|
||||||
|
evstring_free(fragmentShaderText);
|
||||||
|
|
||||||
|
evkDestroyShaderCompiler(compiler);
|
||||||
|
|
||||||
|
evkColorAttachment colorAttachment0 = {
|
||||||
|
swapChain.surfaceFormat.format,
|
||||||
|
EV_DEFAULT(VkPipelineColorBlendAttachmentState)
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO Get this from shader reflection data
|
||||||
|
// evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayout(
|
||||||
|
// &device, svec_init(evkDescriptorBinding, {
|
||||||
|
// {
|
||||||
|
// .name = evstr("positions"),
|
||||||
|
// .binding = 0,
|
||||||
|
// .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||||
|
// .descriptorCount = 1,
|
||||||
|
// .stageFlags = VK_SHADER_STAGE_ALL_GRAPHICS,
|
||||||
|
// },
|
||||||
|
// })
|
||||||
|
// );
|
||||||
|
// evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayoutFromBindings(&device, vertShader.reflect.bindings);
|
||||||
|
|
||||||
|
// evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayoutFromShaders(&device, svec_init(evkShader, {vertShader, fragShader}));
|
||||||
|
|
||||||
|
evkPipelineCreateInfo pipelineCreateInfo = EV_DEFAULT(evkPipelineCreateInfo,
|
||||||
|
dynamicStates = svec_init(VkDynamicState, {
|
||||||
|
VK_DYNAMIC_STATE_VIEWPORT,
|
||||||
|
VK_DYNAMIC_STATE_SCISSOR,
|
||||||
|
}),
|
||||||
|
shaderStages = svec_init(evkShader, {
|
||||||
|
vertShader,
|
||||||
|
fragShader,
|
||||||
|
}),
|
||||||
|
colorAttachments = svec_init(evkColorAttachment, {
|
||||||
|
colorAttachment0,
|
||||||
|
}),
|
||||||
|
viewportCountOverride = 1,
|
||||||
|
|
||||||
|
vertexBufferLayouts = svec_init(evkVertexBufferLayout, {
|
||||||
|
{{ // VB #0
|
||||||
|
{ EVK_VERTEX_ATTRIBUTE_POSITION, EVK_FMT_FLOAT32, 2 },
|
||||||
|
}},
|
||||||
|
}),
|
||||||
|
|
||||||
|
// setLayouts = svec_init(evkDescriptorSetLayout, {setLayout_0}),
|
||||||
|
);
|
||||||
|
|
||||||
|
evkBuffer resourceDescriptorHeap = evkCreateBuffer(&device, (evkBufferCreateInfo) {
|
||||||
|
.sizeInBytes = 16 * 4, // bufferDescriptorSize is 16 on my current device
|
||||||
|
.usage = VK_BUFFER_USAGE_DESCRIPTOR_HEAP_BIT_EXT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
|
||||||
|
.exclusive = true,
|
||||||
|
.allocationCreateInfo = {
|
||||||
|
.allocationFlags = EVK_GPU_ALLOCATION_CREATE_MAPPED_BIT | EVK_GPU_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT,
|
||||||
|
.allocator = allocator,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
evkBuffer uniBuf = evkCreateBuffer(&device, (evkBufferCreateInfo) {
|
||||||
|
.sizeInBytes = 12 * 4,
|
||||||
|
.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
|
||||||
|
.allocationCreateInfo = {
|
||||||
|
.allocationFlags = EVK_GPU_ALLOCATION_CREATE_MAPPED_BIT | EVK_GPU_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT,
|
||||||
|
.allocator = allocator,
|
||||||
|
},
|
||||||
|
.exclusive = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
float* uni_arr = (float*)uniBuf.allocData.allocationInfo.vma.pMappedData;
|
||||||
|
uni_arr[0] = 0.0f; uni_arr[1] = -0.5f; uni_arr[2] = 0.0f; uni_arr[3] = 1.0f;
|
||||||
|
uni_arr[4] = 0.5f; uni_arr[5] = 0.5f; uni_arr[6] = 0.0f; uni_arr[7] = 1.0f;
|
||||||
|
uni_arr[8] = -0.5f; uni_arr[9] = 0.5f; uni_arr[10] = 0.0f; uni_arr[11] = 1.0f;
|
||||||
|
|
||||||
|
// evkSetDescriptor(&set_0, evstr("vertexData"), &uniBuf);
|
||||||
|
|
||||||
|
VkResourceDescriptorInfoEXT resource = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_RESOURCE_DESCRIPTOR_INFO_EXT,
|
||||||
|
.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||||
|
.data.pAddressRange = &uniBuf.addressRange
|
||||||
|
};
|
||||||
|
|
||||||
|
VkHostAddressRangeEXT descriptor = {
|
||||||
|
.address = resourceDescriptorHeap.allocData.allocationInfo.vma.pMappedData,
|
||||||
|
.size = 16
|
||||||
|
};
|
||||||
|
|
||||||
|
vkWriteResourceDescriptorsEXT(device.vk, 1, &resource, &descriptor);
|
||||||
|
|
||||||
|
VkViewport viewport = EV_DEFAULT(VkViewport, width=width, height=height);
|
||||||
|
VkRect2D scissor = EV_DEFAULT(VkRect2D,extent.width=width, extent.height=height);
|
||||||
|
|
||||||
|
evkPipeline graphicsPipeline = evkCreatePipeline(device, pipelineCreateInfo);
|
||||||
|
|
||||||
|
u32 imageCount = vec_len(&swapChain.images);
|
||||||
|
|
||||||
|
VkFence drawFence = evkCreateFence(device, false);
|
||||||
|
vec(VkSemaphore) imageAcquiredSemaphores = vec_init(VkSemaphore);
|
||||||
|
vec(VkSemaphore) drawFinishedSemaphores = vec_init(VkSemaphore);
|
||||||
|
for(u32 i = 0; i < imageCount; i++)
|
||||||
|
{
|
||||||
|
imageAcquiredSemaphores[i] = evkCreateSemaphore(device);
|
||||||
|
drawFinishedSemaphores[i] = evkCreateSemaphore(device);
|
||||||
|
}
|
||||||
|
// VkSemaphore imageAcquiredSemaphore = evkCreateSemaphore(device);
|
||||||
|
// VkSemaphore drawFinishedSemaphore = evkCreateSemaphore(device);
|
||||||
|
|
||||||
|
i32 imageIdx = -1;
|
||||||
|
while(!glfwWindowShouldClose(window))
|
||||||
|
{
|
||||||
|
imageIdx = (imageIdx + 1) % imageCount;
|
||||||
|
u32 swapChainImageIdx;
|
||||||
|
EVK_CHECK(vkAcquireNextImageKHR(device.vk, swapChain.vk, UInt64.MAX, imageAcquiredSemaphores[imageIdx], VK_NULL_HANDLE, &swapChainImageIdx));
|
||||||
|
|
||||||
|
evkCommandBuffer cmdbuf = commandBuffers[imageIdx];
|
||||||
|
|
||||||
|
VkRenderingAttachmentInfoKHR colorAttachment = EV_DEFAULT(VkRenderingAttachmentInfoKHR,
|
||||||
|
imageView = swapChain.imageViews[swapChainImageIdx].vk,
|
||||||
|
loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
|
||||||
|
storeOp= VK_ATTACHMENT_STORE_OP_STORE,
|
||||||
|
);
|
||||||
|
|
||||||
|
VkRenderingInfo renderingInfo = EV_DEFAULT(VkRenderingInfo,
|
||||||
|
renderArea.extent = ((VkExtent2D){width, height}),
|
||||||
|
pColorAttachments = &colorAttachment,
|
||||||
|
colorAttachmentCount = 1,
|
||||||
|
);
|
||||||
|
|
||||||
|
evkBeginPrimaryCommandBuffer(&cmdbuf);
|
||||||
|
{
|
||||||
|
evkCmdImageBarrier(&cmdbuf, EV_DEFAULT(VkImageMemoryBarrier,
|
||||||
|
image = swapChain.images[swapChainImageIdx].vk,
|
||||||
|
newLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR,
|
||||||
|
subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT
|
||||||
|
));
|
||||||
|
|
||||||
|
// VkDeviceSize offset = 0;
|
||||||
|
// vkCmdBindVertexBuffers(cmdbuf.vk, 0, 1, &vertBuf.vk, &offset);
|
||||||
|
|
||||||
|
// evkCmdBindDescriptorSets(&cmdbuf, &graphicsPipeline, svec_init(evkDescriptorSet, { set_0 }), svec_init(u32, { 0 }));
|
||||||
|
|
||||||
|
vkCmdSetScissor(cmdbuf.vk, 0, 1, &scissor);
|
||||||
|
vkCmdSetViewport(cmdbuf.vk, 0, 1, &viewport);
|
||||||
|
|
||||||
|
vkCmdBindResourceHeapEXT(cmdbuf.vk, &(VkBindHeapInfoEXT) {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_BIND_HEAP_INFO_EXT,
|
||||||
|
.heapRange = resourceDescriptorHeap.addressRange,
|
||||||
|
});
|
||||||
|
|
||||||
|
vkCmdBeginRenderingKHR(cmdbuf.vk, &renderingInfo);
|
||||||
|
|
||||||
|
evkCmdBindPipeline(&cmdbuf, &graphicsPipeline);
|
||||||
|
vkCmdDraw(cmdbuf.vk, 3, 1, 0, 0);
|
||||||
|
|
||||||
|
vkCmdEndRenderingKHR(cmdbuf.vk);
|
||||||
|
|
||||||
|
evkCmdImageBarrier(&cmdbuf, EV_DEFAULT(VkImageMemoryBarrier,
|
||||||
|
image = swapChain.images[swapChainImageIdx].vk,
|
||||||
|
oldLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR,
|
||||||
|
newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
||||||
|
subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT
|
||||||
|
));
|
||||||
|
}
|
||||||
|
evkEndCommandBuffer(&cmdbuf);
|
||||||
|
|
||||||
|
VkPipelineStageFlags waitStages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT};
|
||||||
|
|
||||||
|
VkSubmitInfo submitInfo = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
|
||||||
|
.pCommandBuffers = &cmdbuf.vk, // TODO This won't work with more than a single cmdbuf
|
||||||
|
.commandBufferCount = 1,
|
||||||
|
.waitSemaphoreCount = 1,
|
||||||
|
.pWaitSemaphores = &imageAcquiredSemaphores[imageIdx],
|
||||||
|
.pWaitDstStageMask = waitStages,
|
||||||
|
.signalSemaphoreCount = 1,
|
||||||
|
.pSignalSemaphores = &drawFinishedSemaphores[swapChainImageIdx],
|
||||||
|
};
|
||||||
|
|
||||||
|
vkQueueSubmit(graphicsQueue, 1, &submitInfo, drawFence);
|
||||||
|
vkWaitForFences(device.vk, 1, &drawFence, VK_TRUE, UInt64.MAX);
|
||||||
|
vkResetFences(device.vk, 1, &drawFence);
|
||||||
|
|
||||||
|
VkPresentInfoKHR presentInfo = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
|
||||||
|
.waitSemaphoreCount = 1,
|
||||||
|
.pWaitSemaphores = &drawFinishedSemaphores[swapChainImageIdx],
|
||||||
|
.swapchainCount = 1,
|
||||||
|
.pSwapchains = &swapChain.vk,
|
||||||
|
.pImageIndices = &swapChainImageIdx,
|
||||||
|
};
|
||||||
|
vkQueuePresentKHR(graphicsQueue, &presentInfo);
|
||||||
|
|
||||||
|
vkResetCommandBuffer(cmdbuf.vk,VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
|
||||||
|
|
||||||
|
// Main Loop
|
||||||
|
glfwPollEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
vkQueueWaitIdle(graphicsQueue);
|
||||||
|
|
||||||
|
vkDestroyFence(device.vk, drawFence, NULL);
|
||||||
|
for(u32 i = 0; i < imageCount; i++)
|
||||||
|
{
|
||||||
|
vkDestroySemaphore(device.vk, imageAcquiredSemaphores[i], NULL);
|
||||||
|
vkDestroySemaphore(device.vk, drawFinishedSemaphores[i], NULL);
|
||||||
|
}
|
||||||
|
// vkDestroySemaphore(device.vk, imageAcquiredSemaphore, NULL);
|
||||||
|
// vkDestroySemaphore(device.vk, drawFinishedSemaphore, NULL);
|
||||||
|
|
||||||
|
evkDestroyPipeline(graphicsPipeline);
|
||||||
|
|
||||||
|
// evkDestroyBuffer(vertBuf);
|
||||||
|
evkDestroyBuffer(uniBuf);
|
||||||
|
|
||||||
|
// evkDestroyDescriptorSet(&device, &set_0);
|
||||||
|
// evkDestroyDescriptorSetLayout(&device, &setLayout_0);
|
||||||
|
|
||||||
|
evkDestroyShader(device, vertShader);
|
||||||
|
evkDestroyShader(device, fragShader);
|
||||||
|
|
||||||
|
evkFreeCommandBuffers(device, commandPool, commandBuffers);
|
||||||
|
evkDestroyCommandPool(device, commandPool);
|
||||||
|
|
||||||
|
evkGPUDestroyAllocator(allocator);
|
||||||
|
|
||||||
|
evkDestroySwapChain(device, swapChain);
|
||||||
|
|
||||||
|
// SwapchainCreationFailed:
|
||||||
|
vkDestroySurfaceKHR(instance.vk, swapChain.surface, NULL);
|
||||||
|
|
||||||
|
VKSurfaceCreationFailed:
|
||||||
|
WindowCreationFailed:
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
GLFWInitFailed:
|
||||||
|
evkDestroyDevice(device);
|
||||||
|
|
||||||
|
DeviceCreationFailed:
|
||||||
|
evkDestroyInstance(instance);
|
||||||
|
InstanceCreationFailed:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
executable(
|
||||||
|
'mesh_shaders',
|
||||||
|
'mesh_shaders.c',
|
||||||
|
dependencies: [
|
||||||
|
dependency('evk'),
|
||||||
|
dependency('glfw3'),
|
||||||
|
],
|
||||||
|
c_args: evk_c_args,
|
||||||
|
)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#version 450
|
||||||
|
#pragma shader_stage(fragment)
|
||||||
|
|
||||||
|
#extension GL_EXT_descriptor_heap: require
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 outColor;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
outColor = vec4(0.f, 1.f, 0.f, 1.f);
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
#version 450
|
||||||
|
#pragma shader_stage(vertex)
|
||||||
|
|
||||||
|
#extension GL_EXT_descriptor_heap: require
|
||||||
|
|
||||||
|
layout(descriptor_heap) uniform data {
|
||||||
|
vec4 positions[3];
|
||||||
|
} vertexData[];
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
gl_Position = vertexData[0].positions[gl_VertexIndex];
|
||||||
|
}
|
||||||
+3
-1
@@ -1 +1,3 @@
|
|||||||
subdir('basic_triangle')
|
# subdir('basic_triangle')
|
||||||
|
# subdir('descriptor_heap')
|
||||||
|
subdir('mesh_shaders')
|
||||||
@@ -14,14 +14,4 @@ index d44f62a..16bad95 100644
|
|||||||
+ endif()
|
+ endif()
|
||||||
add_subdirectory(${SHADERC_GLSLANG_DIR} glslang)
|
add_subdirectory(${SHADERC_GLSLANG_DIR} glslang)
|
||||||
endif()
|
endif()
|
||||||
if (NOT TARGET glslang)
|
if (NOT TARGET glslang)
|
||||||
diff --git a/utils/git-sync-deps b/utils/git-sync-deps
|
|
||||||
index eecfbe9..73df6e5 100755
|
|
||||||
--- a/utils/git-sync-deps
|
|
||||||
+++ b/utils/git-sync-deps
|
|
||||||
@@ -279,4 +279,4 @@ def main(argv):
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
- exit(main(sys.argv[1:]))
|
|
||||||
+ sys.exit(main(sys.argv[1:]))
|
|
||||||
@@ -2,6 +2,7 @@ project('libshaderc', 'cpp')
|
|||||||
|
|
||||||
python = find_program('python3')
|
python = find_program('python3')
|
||||||
run_command(python, './utils/git-sync-deps', check: true)
|
run_command(python, './utils/git-sync-deps', check: true)
|
||||||
|
run_command(python, './utils/update_build_version.py', check: true)
|
||||||
|
|
||||||
cmake = import('cmake')
|
cmake = import('cmake')
|
||||||
opts = cmake.subproject_options()
|
opts = cmake.subproject_options()
|
||||||
@@ -24,4 +25,4 @@ shaderc_dep = declare_dependency(dependencies: [
|
|||||||
shaderc_proj.dependency('GenericCodeGen'),
|
shaderc_proj.dependency('GenericCodeGen'),
|
||||||
shaderc_proj.dependency('MachineIndependent'),
|
shaderc_proj.dependency('MachineIndependent'),
|
||||||
])
|
])
|
||||||
meson.override_dependency('shaderc', shaderc_dep)
|
meson.override_dependency('shaderc', shaderc_dep)
|
||||||
@@ -2,11 +2,11 @@
|
|||||||
directory = shaderc
|
directory = shaderc
|
||||||
|
|
||||||
url = https://github.com/google/shaderc
|
url = https://github.com/google/shaderc
|
||||||
revision = v2024.4
|
revision = v2026.2
|
||||||
depth=1
|
depth=1
|
||||||
patch_directory = shaderc
|
patch_directory = shaderc
|
||||||
|
|
||||||
diff_files = shaderc/fixes.diff
|
diff_files = shaderc/fixes.diff
|
||||||
|
|
||||||
[provide]
|
[provide]
|
||||||
dependency_names = shaderc
|
dependency_names = shaderc
|
||||||
Reference in New Issue
Block a user