Commit 0d3cf708 by James Dong Committed by Commit Bot

Vulkan: fix array size for internal shaders

Previously array sizes were calculated as the OR of all flag and enum masks, equal to 2^(number of bits used for flags and enums) - 1, which could be less than the actual needed array size. This fix moves array size calculation to the autogen script and changes the size to one more than the maximum potential value. Bug: angleproject:3524 Change-Id: Ia4eb2a83fc7deea84e18958efcda8b57632035f9 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1655954 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCourtney Goeltzenleuchter <courtneygo@google.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 05ba83a0
...@@ -192,7 +192,7 @@ ...@@ -192,7 +192,7 @@
"Vulkan format:src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp": "Vulkan format:src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp":
"ba26e079062affec8cd72d48f5c91d21", "ba26e079062affec8cd72d48f5c91d21",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py":
"3089dcc7ffff60a8803595fd44278f6e", "a528a53197ea6c8eaa3bb42a7cdf0a17",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000000.inc": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000000.inc":
"81ec58577a603891b5778b4d393734b8", "81ec58577a603891b5778b4d393734b8",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000001.inc": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000001.inc":
...@@ -412,7 +412,7 @@ ...@@ -412,7 +412,7 @@
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp":
"75538dc8198ce0c1c3f41d351fb6f5a2", "75538dc8198ce0c1c3f41d351fb6f5a2",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h":
"fcece480c12c03e7107b5cfc58584638", "bb6cb68410a9e8f0143046f1e034ceaf",
"Vulkan internal shader programs:tools/glslang/glslang_validator.exe.sha1": "Vulkan internal shader programs:tools/glslang/glslang_validator.exe.sha1":
"9f1f0fc61116a657e065c40f9296e5ab", "9f1f0fc61116a657e065c40f9296e5ab",
"Vulkan internal shader programs:tools/glslang/glslang_validator.sha1": "Vulkan internal shader programs:tools/glslang/glslang_validator.sha1":
......
...@@ -270,7 +270,10 @@ void UtilsVk::destroy(VkDevice device) ...@@ -270,7 +270,10 @@ void UtilsVk::destroy(VkDevice device)
{ {
program.destroy(device); program.destroy(device);
} }
mConvertIndexProgram.destroy(device); for (vk::ShaderProgramHelper &program : mConvertIndexPrograms)
{
program.destroy(device);
}
for (vk::ShaderProgramHelper &program : mConvertVertexPrograms) for (vk::ShaderProgramHelper &program : mConvertVertexPrograms)
{ {
program.destroy(device); program.destroy(device);
...@@ -648,7 +651,7 @@ angle::Result UtilsVk::convertIndexBuffer(ContextVk *contextVk, ...@@ -648,7 +651,7 @@ angle::Result UtilsVk::convertIndexBuffer(ContextVk *contextVk,
ANGLE_TRY(contextVk->getShaderLibrary().getConvertIndex_comp(contextVk, 0, &shader)); ANGLE_TRY(contextVk->getShaderLibrary().getConvertIndex_comp(contextVk, 0, &shader));
ANGLE_TRY(setupProgram(contextVk, Function::ConvertIndexBuffer, shader, nullptr, ANGLE_TRY(setupProgram(contextVk, Function::ConvertIndexBuffer, shader, nullptr,
&mConvertIndexProgram, nullptr, descriptorSet, &shaderParams, &mConvertIndexPrograms[0], nullptr, descriptorSet, &shaderParams,
sizeof(ConvertIndexShaderParams), commandBuffer)); sizeof(ConvertIndexShaderParams), commandBuffer));
constexpr uint32_t kInvocationsPerGroup = 64; constexpr uint32_t kInvocationsPerGroup = 64;
......
...@@ -341,28 +341,16 @@ class UtilsVk : angle::NonCopyable ...@@ -341,28 +341,16 @@ class UtilsVk : angle::NonCopyable
angle::PackedEnumMap<Function, vk::BindingPointer<vk::PipelineLayout>> mPipelineLayouts; angle::PackedEnumMap<Function, vk::BindingPointer<vk::PipelineLayout>> mPipelineLayouts;
angle::PackedEnumMap<Function, vk::DynamicDescriptorPool> mDescriptorPools; angle::PackedEnumMap<Function, vk::DynamicDescriptorPool> mDescriptorPools;
vk::ShaderProgramHelper mBufferUtilsPrograms[vk::InternalShader::BufferUtils_comp::kArrayLen];
vk::ShaderProgramHelper mConvertIndexPrograms[vk::InternalShader::ConvertIndex_comp::kArrayLen];
vk::ShaderProgramHelper vk::ShaderProgramHelper
mBufferUtilsPrograms[vk::InternalShader::BufferUtils_comp::kFlagsMask | mConvertVertexPrograms[vk::InternalShader::ConvertVertex_comp::kArrayLen];
vk::InternalShader::BufferUtils_comp::kFunctionMask |
vk::InternalShader::BufferUtils_comp::kFormatMask];
// Currently does not use parameters.
vk::ShaderProgramHelper mConvertIndexProgram;
vk::ShaderProgramHelper
mConvertVertexPrograms[vk::InternalShader::ConvertVertex_comp::kFlagsMask |
vk::InternalShader::ConvertVertex_comp::kConversionMask];
vk::ShaderProgramHelper mImageClearProgramVSOnly; vk::ShaderProgramHelper mImageClearProgramVSOnly;
vk::ShaderProgramHelper vk::ShaderProgramHelper mImageClearProgram[vk::InternalShader::ImageClear_frag::kArrayLen];
mImageClearProgram[vk::InternalShader::ImageClear_frag::kAttachmentIndexMask | vk::ShaderProgramHelper mImageCopyPrograms[vk::InternalShader::ImageCopy_frag::kArrayLen];
vk::InternalShader::ImageClear_frag::kFormatMask]; vk::ShaderProgramHelper mBlitResolvePrograms[vk::InternalShader::BlitResolve_frag::kArrayLen];
vk::ShaderProgramHelper mImageCopyPrograms[vk::InternalShader::ImageCopy_frag::kFlagsMask |
vk::InternalShader::ImageCopy_frag::kSrcFormatMask |
vk::InternalShader::ImageCopy_frag::kDestFormatMask];
vk::ShaderProgramHelper mBlitResolvePrograms[vk::InternalShader::BlitResolve_frag::kFlagsMask |
vk::InternalShader::BlitResolve_frag::kBlitMask];
vk::ShaderProgramHelper mBlitResolveStencilNoExportPrograms vk::ShaderProgramHelper mBlitResolveStencilNoExportPrograms
[vk::InternalShader::BlitResolveStencilNoExport_comp::kFlagsMask]; [vk::InternalShader::BlitResolveStencilNoExport_comp::kArrayLen];
vk::Sampler mPointSampler; vk::Sampler mPointSampler;
vk::Sampler mLinearSampler; vk::Sampler mLinearSampler;
......
...@@ -435,6 +435,14 @@ class ShaderAndVariations: ...@@ -435,6 +435,14 @@ class ShaderAndVariations:
(self.flags, self.enums) = get_shader_variations(shader_file) (self.flags, self.enums) = get_shader_variations(shader_file)
get_variation_bits(self.flags, self.enums) get_variation_bits(self.flags, self.enums)
(self.flags_bits, self.enum_bits) = get_variation_bits(self.flags, self.enums) (self.flags_bits, self.enum_bits) = get_variation_bits(self.flags, self.enums)
# Maximum index value has all flags set and all enums at max value.
max_index = (1 << self.flags_bits) - 1
current_bit_start = self.flags_bits
for (name, values), bits in zip(self.enums, self.enum_bits):
max_index |= (len(values) - 1) << current_bit_start
current_bit_start += bits
# Minimum array size is one more than the maximum value.
self.array_len = max_index + 1
def get_variation_definition(shader_and_variation): def get_variation_definition(shader_and_variation):
...@@ -443,6 +451,7 @@ def get_variation_definition(shader_and_variation): ...@@ -443,6 +451,7 @@ def get_variation_definition(shader_and_variation):
enums = shader_and_variation.enums enums = shader_and_variation.enums
flags_bits = shader_and_variation.flags_bits flags_bits = shader_and_variation.flags_bits
enum_bits = shader_and_variation.enum_bits enum_bits = shader_and_variation.enum_bits
array_len = shader_and_variation.array_len
namespace_name = get_namespace_name(shader_file) namespace_name = get_namespace_name(shader_file)
...@@ -450,7 +459,6 @@ def get_variation_definition(shader_and_variation): ...@@ -450,7 +459,6 @@ def get_variation_definition(shader_and_variation):
if len(flags) > 0: if len(flags) > 0:
definition += 'enum flags\n{\n' definition += 'enum flags\n{\n'
definition += ''.join(['k%s = 0x%08X,\n' % (flags[f], 1 << f) for f in range(len(flags))]) definition += ''.join(['k%s = 0x%08X,\n' % (flags[f], 1 << f) for f in range(len(flags))])
definition += 'kFlagsMask = 0x%08X,\n' % ((1 << flags_bits) - 1)
definition += '};\n' definition += '};\n'
current_bit_start = flags_bits current_bit_start = flags_bits
...@@ -462,11 +470,11 @@ def get_variation_definition(shader_and_variation): ...@@ -462,11 +470,11 @@ def get_variation_definition(shader_and_variation):
definition += ''.join([ definition += ''.join([
'k%s = 0x%08X,\n' % (enum[1][v], v << current_bit_start) for v in range(len(enum[1])) 'k%s = 0x%08X,\n' % (enum[1][v], v << current_bit_start) for v in range(len(enum[1]))
]) ])
definition += 'k%sMask = 0x%08X,\n' % (enum_name,
((1 << enum_bits[e]) - 1) << current_bit_start)
definition += '};\n' definition += '};\n'
current_bit_start += enum_bits[e] current_bit_start += enum_bits[e]
definition += 'constexpr size_t kArrayLen = 0x%08X;\n' % array_len
definition += '} // namespace %s\n' % namespace_name definition += '} // namespace %s\n' % namespace_name
return definition return definition
...@@ -482,21 +490,7 @@ def get_shader_table_h(shader_and_variation): ...@@ -482,21 +490,7 @@ def get_shader_table_h(shader_and_variation):
namespace_name = "InternalShader::" + get_namespace_name(shader_file) namespace_name = "InternalShader::" + get_namespace_name(shader_file)
first_or = True table += '%s::kArrayLen' % namespace_name
if len(flags) > 0:
table += '%s::kFlagsMask' % namespace_name
first_or = False
for e in range(len(enums)):
enum = enums[e]
enum_name = enums[e][0]
if not first_or:
table += ' | '
table += '%s::k%sMask' % (namespace_name, enum_name)
first_or = False
if first_or:
table += '1'
table += '];' table += '];'
return table return table
...@@ -507,6 +501,7 @@ def get_shader_table_cpp(shader_and_variation): ...@@ -507,6 +501,7 @@ def get_shader_table_cpp(shader_and_variation):
enums = shader_and_variation.enums enums = shader_and_variation.enums
flags_bits = shader_and_variation.flags_bits flags_bits = shader_and_variation.flags_bits
enum_bits = shader_and_variation.enum_bits enum_bits = shader_and_variation.enum_bits
array_len = shader_and_variation.array_len
# Cache max and mask value of each enum to quickly know when a possible variation is invalid # Cache max and mask value of each enum to quickly know when a possible variation is invalid
enum_maxes = [] enum_maxes = []
...@@ -524,10 +519,7 @@ def get_shader_table_cpp(shader_and_variation): ...@@ -524,10 +519,7 @@ def get_shader_table_cpp(shader_and_variation):
table = 'constexpr ShaderBlob %s[] = {\n' % table_name table = 'constexpr ShaderBlob %s[] = {\n' % table_name
# The last possible variation is every flag enabled and every enum at max for variation in range(array_len):
last_variation = ((1 << flags_bits) - 1) | reduce(lambda x, y: x | y, enum_maxes, 0)
for variation in range(last_variation + 1):
# if any variation is invalid, output an empty entry # if any variation is invalid, output an empty entry
if any([(variation & enum_masks[e]) > enum_maxes[e] for e in range(len(enums))]): if any([(variation & enum_masks[e]) > enum_maxes[e] for e in range(len(enums))]):
table += '{nullptr, 0}, // 0x%08X\n' % variation table += '{nullptr, 0}, // 0x%08X\n' % variation
......
...@@ -25,7 +25,6 @@ enum flags ...@@ -25,7 +25,6 @@ enum flags
{ {
kSrcIsArray = 0x00000001, kSrcIsArray = 0x00000001,
kIsResolve = 0x00000002, kIsResolve = 0x00000002,
kFlagsMask = 0x00000003,
}; };
enum Blit enum Blit
{ {
...@@ -35,8 +34,8 @@ enum Blit ...@@ -35,8 +34,8 @@ enum Blit
kBlitDepth = 0x0000000C, kBlitDepth = 0x0000000C,
kBlitStencil = 0x00000010, kBlitStencil = 0x00000010,
kBlitDepthStencil = 0x00000014, kBlitDepthStencil = 0x00000014,
kBlitMask = 0x0000001C,
}; };
constexpr size_t kArrayLen = 0x00000018;
} // namespace BlitResolve_frag } // namespace BlitResolve_frag
namespace BlitResolveStencilNoExport_comp namespace BlitResolveStencilNoExport_comp
...@@ -45,8 +44,8 @@ enum flags ...@@ -45,8 +44,8 @@ enum flags
{ {
kSrcIsArray = 0x00000001, kSrcIsArray = 0x00000001,
kIsResolve = 0x00000002, kIsResolve = 0x00000002,
kFlagsMask = 0x00000003,
}; };
constexpr size_t kArrayLen = 0x00000004;
} // namespace BlitResolveStencilNoExport_comp } // namespace BlitResolveStencilNoExport_comp
namespace BufferUtils_comp namespace BufferUtils_comp
...@@ -54,71 +53,71 @@ namespace BufferUtils_comp ...@@ -54,71 +53,71 @@ namespace BufferUtils_comp
enum flags enum flags
{ {
kIsAligned = 0x00000001, kIsAligned = 0x00000001,
kFlagsMask = 0x00000001,
}; };
enum Function enum Function
{ {
kIsClear = 0x00000000, kIsClear = 0x00000000,
kIsCopy = 0x00000002, kIsCopy = 0x00000002,
kFunctionMask = 0x00000002,
}; };
enum Format enum Format
{ {
kIsFloat = 0x00000000, kIsFloat = 0x00000000,
kIsInt = 0x00000004, kIsInt = 0x00000004,
kIsUint = 0x00000008, kIsUint = 0x00000008,
kFormatMask = 0x0000000C,
}; };
constexpr size_t kArrayLen = 0x0000000C;
} // namespace BufferUtils_comp } // namespace BufferUtils_comp
namespace ConvertIndex_comp namespace ConvertIndex_comp
{} // namespace ConvertIndex_comp {
constexpr size_t kArrayLen = 0x00000001;
} // namespace ConvertIndex_comp
namespace ConvertVertex_comp namespace ConvertVertex_comp
{ {
enum flags enum flags
{ {
kIsAligned = 0x00000001, kIsAligned = 0x00000001,
kFlagsMask = 0x00000001,
}; };
enum Conversion enum Conversion
{ {
kIntToInt = 0x00000000, kIntToInt = 0x00000000,
kUintToUint = 0x00000002, kUintToUint = 0x00000002,
kIntToFloat = 0x00000004, kIntToFloat = 0x00000004,
kUintToFloat = 0x00000006, kUintToFloat = 0x00000006,
kSnormToFloat = 0x00000008, kSnormToFloat = 0x00000008,
kUnormToFloat = 0x0000000A, kUnormToFloat = 0x0000000A,
kFixedToFloat = 0x0000000C, kFixedToFloat = 0x0000000C,
kFloatToFloat = 0x0000000E, kFloatToFloat = 0x0000000E,
kConversionMask = 0x0000000E,
}; };
constexpr size_t kArrayLen = 0x00000010;
} // namespace ConvertVertex_comp } // namespace ConvertVertex_comp
namespace FullScreenQuad_vert namespace FullScreenQuad_vert
{} // namespace FullScreenQuad_vert {
constexpr size_t kArrayLen = 0x00000001;
} // namespace FullScreenQuad_vert
namespace ImageClear_frag namespace ImageClear_frag
{ {
enum AttachmentIndex enum AttachmentIndex
{ {
kAttachment0 = 0x00000000, kAttachment0 = 0x00000000,
kAttachment1 = 0x00000001, kAttachment1 = 0x00000001,
kAttachment2 = 0x00000002, kAttachment2 = 0x00000002,
kAttachment3 = 0x00000003, kAttachment3 = 0x00000003,
kAttachment4 = 0x00000004, kAttachment4 = 0x00000004,
kAttachment5 = 0x00000005, kAttachment5 = 0x00000005,
kAttachment6 = 0x00000006, kAttachment6 = 0x00000006,
kAttachment7 = 0x00000007, kAttachment7 = 0x00000007,
kAttachmentIndexMask = 0x00000007,
}; };
enum Format enum Format
{ {
kIsFloat = 0x00000000, kIsFloat = 0x00000000,
kIsInt = 0x00000008, kIsInt = 0x00000008,
kIsUint = 0x00000010, kIsUint = 0x00000010,
kFormatMask = 0x00000018,
}; };
constexpr size_t kArrayLen = 0x00000018;
} // namespace ImageClear_frag } // namespace ImageClear_frag
namespace ImageCopy_frag namespace ImageCopy_frag
...@@ -126,22 +125,20 @@ namespace ImageCopy_frag ...@@ -126,22 +125,20 @@ namespace ImageCopy_frag
enum flags enum flags
{ {
kSrcIsArray = 0x00000001, kSrcIsArray = 0x00000001,
kFlagsMask = 0x00000001,
}; };
enum SrcFormat enum SrcFormat
{ {
kSrcIsFloat = 0x00000000, kSrcIsFloat = 0x00000000,
kSrcIsInt = 0x00000002, kSrcIsInt = 0x00000002,
kSrcIsUint = 0x00000004, kSrcIsUint = 0x00000004,
kSrcFormatMask = 0x00000006,
}; };
enum DestFormat enum DestFormat
{ {
kDestIsFloat = 0x00000000, kDestIsFloat = 0x00000000,
kDestIsInt = 0x00000008, kDestIsInt = 0x00000008,
kDestIsUint = 0x00000010, kDestIsUint = 0x00000010,
kDestFormatMask = 0x00000018,
}; };
constexpr size_t kArrayLen = 0x00000016;
} // namespace ImageCopy_frag } // namespace ImageCopy_frag
} // namespace InternalShader } // namespace InternalShader
...@@ -181,26 +178,20 @@ class ShaderLibrary final : angle::NonCopyable ...@@ -181,26 +178,20 @@ class ShaderLibrary final : angle::NonCopyable
private: private:
RefCounted<ShaderAndSerial> RefCounted<ShaderAndSerial>
mBlitResolve_frag_shaders[InternalShader::BlitResolve_frag::kFlagsMask | mBlitResolve_frag_shaders[InternalShader::BlitResolve_frag::kArrayLen];
InternalShader::BlitResolve_frag::kBlitMask];
RefCounted<ShaderAndSerial> mBlitResolveStencilNoExport_comp_shaders RefCounted<ShaderAndSerial> mBlitResolveStencilNoExport_comp_shaders
[InternalShader::BlitResolveStencilNoExport_comp::kFlagsMask]; [InternalShader::BlitResolveStencilNoExport_comp::kArrayLen];
RefCounted<ShaderAndSerial>
mBufferUtils_comp_shaders[InternalShader::BufferUtils_comp::kArrayLen];
RefCounted<ShaderAndSerial> RefCounted<ShaderAndSerial>
mBufferUtils_comp_shaders[InternalShader::BufferUtils_comp::kFlagsMask | mConvertIndex_comp_shaders[InternalShader::ConvertIndex_comp::kArrayLen];
InternalShader::BufferUtils_comp::kFunctionMask |
InternalShader::BufferUtils_comp::kFormatMask];
RefCounted<ShaderAndSerial> mConvertIndex_comp_shaders[1];
RefCounted<ShaderAndSerial> RefCounted<ShaderAndSerial>
mConvertVertex_comp_shaders[InternalShader::ConvertVertex_comp::kFlagsMask | mConvertVertex_comp_shaders[InternalShader::ConvertVertex_comp::kArrayLen];
InternalShader::ConvertVertex_comp::kConversionMask];
RefCounted<ShaderAndSerial> mFullScreenQuad_vert_shaders[1];
RefCounted<ShaderAndSerial> RefCounted<ShaderAndSerial>
mImageClear_frag_shaders[InternalShader::ImageClear_frag::kAttachmentIndexMask | mFullScreenQuad_vert_shaders[InternalShader::FullScreenQuad_vert::kArrayLen];
InternalShader::ImageClear_frag::kFormatMask];
RefCounted<ShaderAndSerial> RefCounted<ShaderAndSerial>
mImageCopy_frag_shaders[InternalShader::ImageCopy_frag::kFlagsMask | mImageClear_frag_shaders[InternalShader::ImageClear_frag::kArrayLen];
InternalShader::ImageCopy_frag::kSrcFormatMask | RefCounted<ShaderAndSerial> mImageCopy_frag_shaders[InternalShader::ImageCopy_frag::kArrayLen];
InternalShader::ImageCopy_frag::kDestFormatMask];
}; };
} // namespace vk } // namespace vk
} // namespace rx } // namespace rx
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment