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 @@
"Vulkan format:src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp":
"ba26e079062affec8cd72d48f5c91d21",
"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":
"81ec58577a603891b5778b4d393734b8",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000001.inc":
......@@ -412,7 +412,7 @@
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp":
"75538dc8198ce0c1c3f41d351fb6f5a2",
"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":
"9f1f0fc61116a657e065c40f9296e5ab",
"Vulkan internal shader programs:tools/glslang/glslang_validator.sha1":
......
......@@ -270,7 +270,10 @@ void UtilsVk::destroy(VkDevice device)
{
program.destroy(device);
}
mConvertIndexProgram.destroy(device);
for (vk::ShaderProgramHelper &program : mConvertIndexPrograms)
{
program.destroy(device);
}
for (vk::ShaderProgramHelper &program : mConvertVertexPrograms)
{
program.destroy(device);
......@@ -648,7 +651,7 @@ angle::Result UtilsVk::convertIndexBuffer(ContextVk *contextVk,
ANGLE_TRY(contextVk->getShaderLibrary().getConvertIndex_comp(contextVk, 0, &shader));
ANGLE_TRY(setupProgram(contextVk, Function::ConvertIndexBuffer, shader, nullptr,
&mConvertIndexProgram, nullptr, descriptorSet, &shaderParams,
&mConvertIndexPrograms[0], nullptr, descriptorSet, &shaderParams,
sizeof(ConvertIndexShaderParams), commandBuffer));
constexpr uint32_t kInvocationsPerGroup = 64;
......
......@@ -341,28 +341,16 @@ class UtilsVk : angle::NonCopyable
angle::PackedEnumMap<Function, vk::BindingPointer<vk::PipelineLayout>> mPipelineLayouts;
angle::PackedEnumMap<Function, vk::DynamicDescriptorPool> mDescriptorPools;
vk::ShaderProgramHelper mBufferUtilsPrograms[vk::InternalShader::BufferUtils_comp::kArrayLen];
vk::ShaderProgramHelper mConvertIndexPrograms[vk::InternalShader::ConvertIndex_comp::kArrayLen];
vk::ShaderProgramHelper
mBufferUtilsPrograms[vk::InternalShader::BufferUtils_comp::kFlagsMask |
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];
mConvertVertexPrograms[vk::InternalShader::ConvertVertex_comp::kArrayLen];
vk::ShaderProgramHelper mImageClearProgramVSOnly;
vk::ShaderProgramHelper
mImageClearProgram[vk::InternalShader::ImageClear_frag::kAttachmentIndexMask |
vk::InternalShader::ImageClear_frag::kFormatMask];
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 mImageClearProgram[vk::InternalShader::ImageClear_frag::kArrayLen];
vk::ShaderProgramHelper mImageCopyPrograms[vk::InternalShader::ImageCopy_frag::kArrayLen];
vk::ShaderProgramHelper mBlitResolvePrograms[vk::InternalShader::BlitResolve_frag::kArrayLen];
vk::ShaderProgramHelper mBlitResolveStencilNoExportPrograms
[vk::InternalShader::BlitResolveStencilNoExport_comp::kFlagsMask];
[vk::InternalShader::BlitResolveStencilNoExport_comp::kArrayLen];
vk::Sampler mPointSampler;
vk::Sampler mLinearSampler;
......
......@@ -435,6 +435,14 @@ class ShaderAndVariations:
(self.flags, self.enums) = get_shader_variations(shader_file)
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):
......@@ -443,6 +451,7 @@ def get_variation_definition(shader_and_variation):
enums = shader_and_variation.enums
flags_bits = shader_and_variation.flags_bits
enum_bits = shader_and_variation.enum_bits
array_len = shader_and_variation.array_len
namespace_name = get_namespace_name(shader_file)
......@@ -450,7 +459,6 @@ def get_variation_definition(shader_and_variation):
if len(flags) > 0:
definition += 'enum flags\n{\n'
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'
current_bit_start = flags_bits
......@@ -462,11 +470,11 @@ def get_variation_definition(shader_and_variation):
definition += ''.join([
'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'
current_bit_start += enum_bits[e]
definition += 'constexpr size_t kArrayLen = 0x%08X;\n' % array_len
definition += '} // namespace %s\n' % namespace_name
return definition
......@@ -482,21 +490,7 @@ def get_shader_table_h(shader_and_variation):
namespace_name = "InternalShader::" + get_namespace_name(shader_file)
first_or = True
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 += '%s::kArrayLen' % namespace_name
table += '];'
return table
......@@ -507,6 +501,7 @@ def get_shader_table_cpp(shader_and_variation):
enums = shader_and_variation.enums
flags_bits = shader_and_variation.flags_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
enum_maxes = []
......@@ -524,10 +519,7 @@ def get_shader_table_cpp(shader_and_variation):
table = 'constexpr ShaderBlob %s[] = {\n' % table_name
# The last possible variation is every flag enabled and every enum at max
last_variation = ((1 << flags_bits) - 1) | reduce(lambda x, y: x | y, enum_maxes, 0)
for variation in range(last_variation + 1):
for variation in range(array_len):
# if any variation is invalid, output an empty entry
if any([(variation & enum_masks[e]) > enum_maxes[e] for e in range(len(enums))]):
table += '{nullptr, 0}, // 0x%08X\n' % variation
......
......@@ -25,7 +25,6 @@ enum flags
{
kSrcIsArray = 0x00000001,
kIsResolve = 0x00000002,
kFlagsMask = 0x00000003,
};
enum Blit
{
......@@ -35,8 +34,8 @@ enum Blit
kBlitDepth = 0x0000000C,
kBlitStencil = 0x00000010,
kBlitDepthStencil = 0x00000014,
kBlitMask = 0x0000001C,
};
constexpr size_t kArrayLen = 0x00000018;
} // namespace BlitResolve_frag
namespace BlitResolveStencilNoExport_comp
......@@ -45,8 +44,8 @@ enum flags
{
kSrcIsArray = 0x00000001,
kIsResolve = 0x00000002,
kFlagsMask = 0x00000003,
};
constexpr size_t kArrayLen = 0x00000004;
} // namespace BlitResolveStencilNoExport_comp
namespace BufferUtils_comp
......@@ -54,71 +53,71 @@ namespace BufferUtils_comp
enum flags
{
kIsAligned = 0x00000001,
kFlagsMask = 0x00000001,
};
enum Function
{
kIsClear = 0x00000000,
kIsCopy = 0x00000002,
kFunctionMask = 0x00000002,
kIsClear = 0x00000000,
kIsCopy = 0x00000002,
};
enum Format
{
kIsFloat = 0x00000000,
kIsInt = 0x00000004,
kIsUint = 0x00000008,
kFormatMask = 0x0000000C,
kIsFloat = 0x00000000,
kIsInt = 0x00000004,
kIsUint = 0x00000008,
};
constexpr size_t kArrayLen = 0x0000000C;
} // namespace BufferUtils_comp
namespace ConvertIndex_comp
{} // namespace ConvertIndex_comp
{
constexpr size_t kArrayLen = 0x00000001;
} // namespace ConvertIndex_comp
namespace ConvertVertex_comp
{
enum flags
{
kIsAligned = 0x00000001,
kFlagsMask = 0x00000001,
};
enum Conversion
{
kIntToInt = 0x00000000,
kUintToUint = 0x00000002,
kIntToFloat = 0x00000004,
kUintToFloat = 0x00000006,
kSnormToFloat = 0x00000008,
kUnormToFloat = 0x0000000A,
kFixedToFloat = 0x0000000C,
kFloatToFloat = 0x0000000E,
kConversionMask = 0x0000000E,
kIntToInt = 0x00000000,
kUintToUint = 0x00000002,
kIntToFloat = 0x00000004,
kUintToFloat = 0x00000006,
kSnormToFloat = 0x00000008,
kUnormToFloat = 0x0000000A,
kFixedToFloat = 0x0000000C,
kFloatToFloat = 0x0000000E,
};
constexpr size_t kArrayLen = 0x00000010;
} // namespace ConvertVertex_comp
namespace FullScreenQuad_vert
{} // namespace FullScreenQuad_vert
{
constexpr size_t kArrayLen = 0x00000001;
} // namespace FullScreenQuad_vert
namespace ImageClear_frag
{
enum AttachmentIndex
{
kAttachment0 = 0x00000000,
kAttachment1 = 0x00000001,
kAttachment2 = 0x00000002,
kAttachment3 = 0x00000003,
kAttachment4 = 0x00000004,
kAttachment5 = 0x00000005,
kAttachment6 = 0x00000006,
kAttachment7 = 0x00000007,
kAttachmentIndexMask = 0x00000007,
kAttachment0 = 0x00000000,
kAttachment1 = 0x00000001,
kAttachment2 = 0x00000002,
kAttachment3 = 0x00000003,
kAttachment4 = 0x00000004,
kAttachment5 = 0x00000005,
kAttachment6 = 0x00000006,
kAttachment7 = 0x00000007,
};
enum Format
{
kIsFloat = 0x00000000,
kIsInt = 0x00000008,
kIsUint = 0x00000010,
kFormatMask = 0x00000018,
kIsFloat = 0x00000000,
kIsInt = 0x00000008,
kIsUint = 0x00000010,
};
constexpr size_t kArrayLen = 0x00000018;
} // namespace ImageClear_frag
namespace ImageCopy_frag
......@@ -126,22 +125,20 @@ namespace ImageCopy_frag
enum flags
{
kSrcIsArray = 0x00000001,
kFlagsMask = 0x00000001,
};
enum SrcFormat
{
kSrcIsFloat = 0x00000000,
kSrcIsInt = 0x00000002,
kSrcIsUint = 0x00000004,
kSrcFormatMask = 0x00000006,
kSrcIsFloat = 0x00000000,
kSrcIsInt = 0x00000002,
kSrcIsUint = 0x00000004,
};
enum DestFormat
{
kDestIsFloat = 0x00000000,
kDestIsInt = 0x00000008,
kDestIsUint = 0x00000010,
kDestFormatMask = 0x00000018,
kDestIsFloat = 0x00000000,
kDestIsInt = 0x00000008,
kDestIsUint = 0x00000010,
};
constexpr size_t kArrayLen = 0x00000016;
} // namespace ImageCopy_frag
} // namespace InternalShader
......@@ -181,26 +178,20 @@ class ShaderLibrary final : angle::NonCopyable
private:
RefCounted<ShaderAndSerial>
mBlitResolve_frag_shaders[InternalShader::BlitResolve_frag::kFlagsMask |
InternalShader::BlitResolve_frag::kBlitMask];
mBlitResolve_frag_shaders[InternalShader::BlitResolve_frag::kArrayLen];
RefCounted<ShaderAndSerial> mBlitResolveStencilNoExport_comp_shaders
[InternalShader::BlitResolveStencilNoExport_comp::kFlagsMask];
[InternalShader::BlitResolveStencilNoExport_comp::kArrayLen];
RefCounted<ShaderAndSerial>
mBufferUtils_comp_shaders[InternalShader::BufferUtils_comp::kArrayLen];
RefCounted<ShaderAndSerial>
mBufferUtils_comp_shaders[InternalShader::BufferUtils_comp::kFlagsMask |
InternalShader::BufferUtils_comp::kFunctionMask |
InternalShader::BufferUtils_comp::kFormatMask];
RefCounted<ShaderAndSerial> mConvertIndex_comp_shaders[1];
mConvertIndex_comp_shaders[InternalShader::ConvertIndex_comp::kArrayLen];
RefCounted<ShaderAndSerial>
mConvertVertex_comp_shaders[InternalShader::ConvertVertex_comp::kFlagsMask |
InternalShader::ConvertVertex_comp::kConversionMask];
RefCounted<ShaderAndSerial> mFullScreenQuad_vert_shaders[1];
mConvertVertex_comp_shaders[InternalShader::ConvertVertex_comp::kArrayLen];
RefCounted<ShaderAndSerial>
mImageClear_frag_shaders[InternalShader::ImageClear_frag::kAttachmentIndexMask |
InternalShader::ImageClear_frag::kFormatMask];
mFullScreenQuad_vert_shaders[InternalShader::FullScreenQuad_vert::kArrayLen];
RefCounted<ShaderAndSerial>
mImageCopy_frag_shaders[InternalShader::ImageCopy_frag::kFlagsMask |
InternalShader::ImageCopy_frag::kSrcFormatMask |
InternalShader::ImageCopy_frag::kDestFormatMask];
mImageClear_frag_shaders[InternalShader::ImageClear_frag::kArrayLen];
RefCounted<ShaderAndSerial> mImageCopy_frag_shaders[InternalShader::ImageCopy_frag::kArrayLen];
};
} // namespace vk
} // 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