bug 14014: Fill out support for VkShaderModule
Updated tests and demos to properly use VkShaderModule.
Add support to shader_checker for shader module.
Doesn't do anything with the pName parameter.
diff --git a/tests/init.cpp b/tests/init.cpp
index c1386fc..a501938 100644
--- a/tests/init.cpp
+++ b/tests/init.cpp
@@ -582,26 +582,30 @@
pSPV->magic = ICD_SPV_MAGIC;
pSPV->version = ICD_SPV_VERSION;
-// typedef struct VkShaderCreateInfo_
-// {
-// VkStructureType sType; // Must be VK_STRUCTURE_TYPE_SHADER_CREATE_INFO
-// const void* pNext; // Pointer to next structure
-// size_t codeSize; // Specified in bytes
-// const void* pCode;
-// VkFlags flags; // Reserved
-// } VkShaderCreateInfo;
-
+ VkShaderModuleCreateInfo moduleCreateInfo;
+ VkShaderModule module;
VkShaderCreateInfo createInfo;
VkShader shader;
+ moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
+ moduleCreateInfo.pNext = NULL;
+ moduleCreateInfo.pCode = code;
+ moduleCreateInfo.codeSize = codeSize;
+ moduleCreateInfo.flags = 0;
+ err = vkCreateShaderModule(device(), &moduleCreateInfo, &module);
+ ASSERT_VK_SUCCESS(err);
+
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO;
createInfo.pNext = NULL;
- createInfo.pCode = code;
- createInfo.codeSize = codeSize;
+ createInfo.module = module;
+ createInfo.pName = "main";
createInfo.flags = 0;
err = vkCreateShader(device(), &createInfo, &shader);
ASSERT_VK_SUCCESS(err);
+ err = vkDestroyObject(device(), VK_OBJECT_TYPE_SHADER_MODULE, module);
+ ASSERT_VK_SUCCESS(err);
+
*pshader = shader;
}
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 4aa594b..16b0fa9 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -1015,34 +1015,13 @@
err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
ASSERT_VK_SUCCESS(err);
- size_t shader_len = strlen(bindStateVertShaderText);
- size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
- void* pCode = malloc(codeSize);
-
- /* try version 0 first: VkShaderStage followed by GLSL */
- ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
- ((uint32_t *) pCode)[1] = 0;
- ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
- memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
-
- const VkShaderCreateInfo vs_ci = {
- .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
- .pNext = NULL,
- .module = VK_NULL_HANDLE,
- .name = "main",
- .codeSize = codeSize,
- .pCode = pCode,
- .flags = 0,
- };
- VkShader vs;
- err = vkCreateShader(m_device->device(), &vs_ci, &vs);
- ASSERT_VK_SUCCESS(err);
+ VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
.pNext = NULL,
.stage = VK_SHADER_STAGE_VERTEX,
- .shader = vs,
+ .shader = vs.obj(),
.linkConstBufferCount = 0,
.pLinkConstBufferInfo = NULL,
.pSpecializationInfo = NULL,
@@ -1298,33 +1277,13 @@
err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
ASSERT_VK_SUCCESS(err);
- size_t shader_len = strlen(bindStateVertShaderText);
- size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
- void* pCode = malloc(codeSize);
-
- /* try version 0 first: VkShaderStage followed by GLSL */
- ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
- ((uint32_t *) pCode)[1] = 0;
- ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
- memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
-
- const VkShaderCreateInfo vs_ci = {
- .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
- .pNext = NULL,
- .module = VK_NULL_HANDLE,
- .name = "main",
- .codeSize = codeSize,
- .pCode = pCode,
- .flags = 0,
- };
- VkShader vs;
- err = vkCreateShader(m_device->device(), &vs_ci, &vs);
+ VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
.pNext = NULL,
.stage = VK_SHADER_STAGE_VERTEX,
- .shader = vs,
+ .shader = vs.obj(),
.linkConstBufferCount = 0,
.pLinkConstBufferInfo = NULL,
.pSpecializationInfo = NULL,
@@ -1782,34 +1741,13 @@
err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
ASSERT_VK_SUCCESS(err);
- size_t shader_len = strlen(bindStateVertShaderText);
- size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
- void* pCode = malloc(codeSize);
-
- /* try version 0 first: VkShaderStage followed by GLSL */
- ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
- ((uint32_t *) pCode)[1] = 0;
- ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
- memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
-
- const VkShaderCreateInfo vs_ci = {
- .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
- .pNext = NULL,
- .module = VK_NULL_HANDLE,
- .name = "main",
- .codeSize = codeSize,
- .pCode = pCode,
- .flags = 0,
- };
- VkShader vs;
- err = vkCreateShader(m_device->device(), &vs_ci, &vs);
- ASSERT_VK_SUCCESS(err);
+ VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
.pNext = NULL,
.stage = VK_SHADER_STAGE_VERTEX,
- .shader = vs,
+ .shader = vs.obj(),
.linkConstBufferCount = 0,
.pLinkConstBufferInfo = NULL,
.pSpecializationInfo = NULL,
@@ -1902,29 +1840,6 @@
err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
ASSERT_VK_SUCCESS(err);
- size_t shader_len = strlen(bindStateVertShaderText);
- size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
- void* pCode = malloc(codeSize);
-
- /* try version 0 first: VkShaderStage followed by GLSL */
- ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
- ((uint32_t *) pCode)[1] = 0;
- ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
- memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
-
- const VkShaderCreateInfo vs_ci = {
- .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
- .pNext = NULL,
- .module = VK_NULL_HANDLE,
- .name = "main",
- .codeSize = codeSize,
- .pCode = pCode,
- .flags = 0,
- };
- VkShader vs;
- err = vkCreateShader(m_device->device(), &vs_ci, &vs);
- ASSERT_VK_SUCCESS(err);
-
VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
//err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
ASSERT_VK_SUCCESS(err);
@@ -2007,34 +1922,13 @@
err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, &pipeline_layout);
ASSERT_VK_SUCCESS(err);
- size_t shader_len = strlen(bindStateVertShaderText);
- size_t codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
- void* pCode = malloc(codeSize);
-
- /* try version 0 first: VkShaderStage followed by GLSL */
- ((uint32_t *) pCode)[0] = ICD_SPV_MAGIC;
- ((uint32_t *) pCode)[1] = 0;
- ((uint32_t *) pCode)[2] = VK_SHADER_STAGE_VERTEX;
- memcpy(((uint32_t *) pCode + 3), bindStateVertShaderText, shader_len + 1);
-
- const VkShaderCreateInfo vs_ci = {
- .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
- .pNext = NULL,
- .module = VK_NULL_HANDLE,
- .name = "main",
- .codeSize = codeSize,
- .pCode = pCode,
- .flags = 0,
- };
- VkShader vs;
- err = vkCreateShader(m_device->device(), &vs_ci, &vs);
- ASSERT_VK_SUCCESS(err);
+ VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX, this);
const VkPipelineShaderStageCreateInfo pipe_vs_ci = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
.pNext = NULL,
.stage = VK_SHADER_STAGE_VERTEX,
- .shader = vs,
+ .shader = vs.obj(),
.linkConstBufferCount = 0,
.pLinkConstBufferInfo = NULL,
.pSpecializationInfo = NULL,
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index 4ee9d1f..b0c6657 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -1028,38 +1028,51 @@
VkResult err = VK_SUCCESS;
std::vector<unsigned int> spv;
VkShaderCreateInfo createInfo;
+ VkShaderModuleCreateInfo moduleCreateInfo;
+ vk_testing::ShaderModule module;
size_t shader_len;
m_stage = stage;
m_device = device;
+ moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
+ moduleCreateInfo.pNext = NULL;
+
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO;
createInfo.pNext = NULL;
if (framework->m_use_glsl) {
shader_len = strlen(shader_code);
- createInfo.codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
- createInfo.pCode = malloc(createInfo.codeSize);
- createInfo.flags = 0;
+ moduleCreateInfo.codeSize = 3 * sizeof(uint32_t) + shader_len + 1;
+ moduleCreateInfo.pCode = malloc(moduleCreateInfo.codeSize);
+ moduleCreateInfo.flags = 0;
/* try version 0 first: VkShaderStage followed by GLSL */
- ((uint32_t *) createInfo.pCode)[0] = ICD_SPV_MAGIC;
- ((uint32_t *) createInfo.pCode)[1] = 0;
- ((uint32_t *) createInfo.pCode)[2] = stage;
- memcpy(((uint32_t *) createInfo.pCode + 3), shader_code, shader_len + 1);
+ ((uint32_t *) moduleCreateInfo.pCode)[0] = ICD_SPV_MAGIC;
+ ((uint32_t *) moduleCreateInfo.pCode)[1] = 0;
+ ((uint32_t *) moduleCreateInfo.pCode)[2] = stage;
+ memcpy(((uint32_t *) moduleCreateInfo.pCode + 3), shader_code, shader_len + 1);
} else {
// Use Reference GLSL to SPV compiler
framework->GLSLtoSPV(stage, shader_code, spv);
- createInfo.pCode = spv.data();
- createInfo.codeSize = spv.size() * sizeof(unsigned int);
- createInfo.flags = 0;
+ moduleCreateInfo.pCode = spv.data();
+ moduleCreateInfo.codeSize = spv.size() * sizeof(unsigned int);
+ moduleCreateInfo.flags = 0;
}
- err = init_try(*m_device, createInfo);
+ err = module.init_try(*m_device, moduleCreateInfo);
+ assert(VK_SUCCESS == err);
+ createInfo.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO;
+ createInfo.pNext = NULL;
+ createInfo.module = module.obj();
+ createInfo.pName = "main";
+ createInfo.flags = 0;
+
+ err = init_try(*m_device, createInfo);
assert(VK_SUCCESS == err);
}
diff --git a/tests/vktestbinding.cpp b/tests/vktestbinding.cpp
index da1c0d8..3e4c827 100644
--- a/tests/vktestbinding.cpp
+++ b/tests/vktestbinding.cpp
@@ -661,6 +661,26 @@
alloc_memory();
}
+void ShaderModule::init(const Device &dev, const VkShaderModuleCreateInfo &info)
+{
+ DERIVED_OBJECT_TYPE_INIT(vkCreateShaderModule, dev, VK_OBJECT_TYPE_SHADER_MODULE, &info);
+}
+
+VkResult ShaderModule::init_try(const Device &dev, const VkShaderModuleCreateInfo &info)
+{
+ /*
+ * Note: Cannot use DERIVED_OBJECT_TYPE_INIT as we need the
+ * return code.
+ */
+ VkShaderModule sh;
+ dev_ = &dev;
+ VkResult err = vkCreateShaderModule(dev.obj(), &info, &sh);
+ if (err == VK_SUCCESS)
+ Object::init(sh, VK_OBJECT_TYPE_SHADER_MODULE);
+
+ return err;
+}
+
void Shader::init(const Device &dev, const VkShaderCreateInfo &info)
{
DERIVED_OBJECT_TYPE_INIT(vkCreateShader, dev, VK_OBJECT_TYPE_SHADER, &info);
diff --git a/tests/vktestbinding.h b/tests/vktestbinding.h
index 7475359..e55586b 100644
--- a/tests/vktestbinding.h
+++ b/tests/vktestbinding.h
@@ -481,13 +481,22 @@
void init(const Device &dev, const VkDepthStencilViewCreateInfo &info);
};
+class ShaderModule : public DerivedObject<VkShaderModule, Object, VK_OBJECT_TYPE_SHADER_MODULE> {
+public:
+ // vkCreateShaderModule()
+ void init(const Device &dev, const VkShaderModuleCreateInfo &info);
+ VkResult init_try(const Device &dev, const VkShaderModuleCreateInfo &info);
+
+ static VkShaderModuleCreateInfo create_info(size_t code_size, const void *code, VkFlags flags);
+};
+
class Shader : public DerivedObject<VkShader, Object, VK_OBJECT_TYPE_SHADER> {
public:
// vkCreateShader()
void init(const Device &dev, const VkShaderCreateInfo &info);
VkResult init_try(const Device &dev, const VkShaderCreateInfo &info);
- static VkShaderCreateInfo create_info(size_t code_size, const void *code, VkFlags flags);
+ static VkShaderCreateInfo create_info(VkShaderModule module, const char *pName, VkFlags flags);
};
class Pipeline : public DerivedObject<VkPipeline, Object, VK_OBJECT_TYPE_PIPELINE> {
@@ -758,12 +767,22 @@
return Image::extent(width, height, depth);
}
-inline VkShaderCreateInfo Shader::create_info(size_t code_size, const void *code, VkFlags flags)
+inline VkShaderModuleCreateInfo ShaderModule::create_info(size_t code_size, const void *code, VkFlags flags)
+{
+ VkShaderModuleCreateInfo info = {};
+ info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
+ info.codeSize = code_size;
+ info.pCode = code;
+ info.flags = flags;
+ return info;
+}
+
+inline VkShaderCreateInfo Shader::create_info(VkShaderModule module, const char *pName, VkFlags flags)
{
VkShaderCreateInfo info = {};
info.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO;
- info.codeSize = code_size;
- info.pCode = code;
+ info.module = module;
+ info.pName = pName;
info.flags = flags;
return info;
}