Binary shader memory deallocation, new and free instead of malloc (Fixes #118)

This commit is contained in:
saschawillems 2016-05-14 17:11:39 +02:00
parent 69e85e155d
commit 7203b0cebd

View file

@ -273,30 +273,6 @@ namespace vkTools
return fileContent; return fileContent;
} }
// Load a binary file into a buffer (e.g. SPIR-V)
char *readBinaryFile(const char *filename, size_t *psize)
{
long int size;
size_t retval;
void *shader_code;
FILE *fp = fopen(filename, "rb");
if (!fp) return NULL;
fseek(fp, 0L, SEEK_END);
size = ftell(fp);
fseek(fp, 0L, SEEK_SET);
shader_code = malloc(size);
retval = fread(shader_code, size, 1, fp);
assert(retval == 1);
*psize = size;
return (char*)shader_code;
}
#if defined(__ANDROID__) #if defined(__ANDROID__)
// Android shaders are stored as assets in the apk // Android shaders are stored as assets in the apk
// So they need to be loaded via the asset manager // So they need to be loaded via the asset manager
@ -314,38 +290,50 @@ namespace vkTools
VkShaderModule shaderModule; VkShaderModule shaderModule;
VkShaderModuleCreateInfo moduleCreateInfo; VkShaderModuleCreateInfo moduleCreateInfo;
VkResult err;
moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
moduleCreateInfo.pNext = NULL; moduleCreateInfo.pNext = NULL;
moduleCreateInfo.codeSize = size; moduleCreateInfo.codeSize = size;
moduleCreateInfo.pCode = (uint32_t*)shaderCode; moduleCreateInfo.pCode = (uint32_t*)shaderCode;
moduleCreateInfo.flags = 0; moduleCreateInfo.flags = 0;
err = vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule);
assert(!err); VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule));
delete[] shaderCode;
return shaderModule; return shaderModule;
} }
#else #else
VkShaderModule loadShader(const char *fileName, VkDevice device, VkShaderStageFlagBits stage) VkShaderModule loadShader(const char *fileName, VkDevice device, VkShaderStageFlagBits stage)
{ {
size_t size = 0; size_t size;
const char *shaderCode = readBinaryFile(fileName, &size);
FILE *fp = fopen(fileName, "rb");
assert(fp);
fseek(fp, 0L, SEEK_END);
size = ftell(fp);
fseek(fp, 0L, SEEK_SET);
//shaderCode = malloc(size);
char *shaderCode = new char[size];
size_t retval = fread(shaderCode, size, 1, fp);
assert(retval == 1);
assert(size > 0); assert(size > 0);
fclose(fp);
VkShaderModule shaderModule; VkShaderModule shaderModule;
VkShaderModuleCreateInfo moduleCreateInfo; VkShaderModuleCreateInfo moduleCreateInfo;
VkResult err;
moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
moduleCreateInfo.pNext = NULL; moduleCreateInfo.pNext = NULL;
moduleCreateInfo.codeSize = size; moduleCreateInfo.codeSize = size;
moduleCreateInfo.pCode = (uint32_t*)shaderCode; moduleCreateInfo.pCode = (uint32_t*)shaderCode;
moduleCreateInfo.flags = 0; moduleCreateInfo.flags = 0;
err = vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule);
assert(!err); VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule));
delete[] shaderCode;
return shaderModule; return shaderModule;
} }
@ -360,11 +348,8 @@ namespace vkTools
VkShaderModule shaderModule; VkShaderModule shaderModule;
VkShaderModuleCreateInfo moduleCreateInfo; VkShaderModuleCreateInfo moduleCreateInfo;
VkResult err;
moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
moduleCreateInfo.pNext = NULL; moduleCreateInfo.pNext = NULL;
moduleCreateInfo.codeSize = 3 * sizeof(uint32_t) + size + 1; moduleCreateInfo.codeSize = 3 * sizeof(uint32_t) + size + 1;
moduleCreateInfo.pCode = (uint32_t*)malloc(moduleCreateInfo.codeSize); moduleCreateInfo.pCode = (uint32_t*)malloc(moduleCreateInfo.codeSize);
moduleCreateInfo.flags = 0; moduleCreateInfo.flags = 0;
@ -375,8 +360,7 @@ namespace vkTools
((uint32_t *)moduleCreateInfo.pCode)[2] = stage; ((uint32_t *)moduleCreateInfo.pCode)[2] = stage;
memcpy(((uint32_t *)moduleCreateInfo.pCode + 3), shaderCode, size + 1); memcpy(((uint32_t *)moduleCreateInfo.pCode + 3), shaderCode, size + 1);
err = vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule); VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule));
assert(!err);
return shaderModule; return shaderModule;
} }