Commit 419acc8f by Frank Henigman Committed by Commit Bot

Vulkan: Convert streamed vertex data as needed.

Add two members to vk::Format: - vertex data copy function - flag indicating if the function converts or not Use the function when streaming vertex data so it gets converted if needed. Add fallbacks for integer formats. These formats will now work everywhere, as long as they are in client memory, not a buffer object. Adjust test expectations accordingly. BUG=angleproject:2405 Change-Id: I677221219d933c35740633a0ab7694293e218177 Reviewed-on: https://chromium-review.googlesource.com/1084328Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 84c662b9
{
"ANGLE format:src/libANGLE/renderer/angle_format.py":
"826420a038032840f10d2d6066a01e7d",
"b18ca0fe4835114a4a2f54977b19e798",
"ANGLE format:src/libANGLE/renderer/angle_format_data.json":
"1ab73531d2d9655e669b5560fb43c698",
"ANGLE format:src/libANGLE/renderer/angle_format_map.json":
......@@ -12,7 +12,7 @@
"ANGLE load functions table:src/libANGLE/renderer/load_functions_data.json":
"21a603f6224d3b6cd606b71dca0ae181",
"D3D11 format:src/libANGLE/renderer/angle_format.py":
"826420a038032840f10d2d6066a01e7d",
"b18ca0fe4835114a4a2f54977b19e798",
"D3D11 format:src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py":
"1ab3a192c6bb23a926d0a5d0ed84cbf3",
"D3D11 format:src/libANGLE/renderer/d3d/d3d11/texture_format_data.json":
......@@ -24,7 +24,7 @@
"DXGI format support:src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py":
"30158f76e168e014a1bee3925cd5910a",
"DXGI format:src/libANGLE/renderer/angle_format.py":
"826420a038032840f10d2d6066a01e7d",
"b18ca0fe4835114a4a2f54977b19e798",
"DXGI format:src/libANGLE/renderer/angle_format_map.json":
"82d80c3be2cdfcc17aec07cf2223907f",
"DXGI format:src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json":
......@@ -32,7 +32,7 @@
"DXGI format:src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py":
"2932a5e1c3c846be0169e29a4f9c72e8",
"ESSL static builtins:src/compiler/translator/builtin_function_declarations.txt":
"338ae4863ccaab54adccee8e3f7971cf",
"39b92f5a4d982873d3595b70049d5160",
"ESSL static builtins:src/compiler/translator/builtin_variables.json":
"2c0e86ff9f92f79ada03f04206e63fba",
"ESSL static builtins:src/compiler/translator/gen_builtin_symbols.py":
......@@ -62,13 +62,13 @@
"OpenGL dispatch table:src/libANGLE/renderer/gl/generate_gl_dispatch_table.py":
"71d2cd9c958ec5e13ce5e38bdb03dcb5",
"Vulkan format:src/libANGLE/renderer/angle_format.py":
"826420a038032840f10d2d6066a01e7d",
"b18ca0fe4835114a4a2f54977b19e798",
"Vulkan format:src/libANGLE/renderer/angle_format_map.json":
"82d80c3be2cdfcc17aec07cf2223907f",
"Vulkan format:src/libANGLE/renderer/vulkan/gen_vk_format_table.py":
"86aa4d78d3f1c82f938f1175237c86ce",
"2ecc99c12cd41bda7107a7d9ffe3786c",
"Vulkan format:src/libANGLE/renderer/vulkan/vk_format_map.json":
"ad20bf1583747eb8e70b991135803c3c",
"48d376e36fc9fbb1f2a804cc49fc6277",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py":
"c1cc895645db3fe1cd284352890c219e",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert":
......@@ -76,7 +76,7 @@
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/PushConstantColor.frag":
"d4edeca8fcb5fc02aa5236c8d8b77a4d",
"Vulkan mandatory format support table:src/libANGLE/renderer/angle_format.py":
"826420a038032840f10d2d6066a01e7d",
"b18ca0fe4835114a4a2f54977b19e798",
"Vulkan mandatory format support table:src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py":
"e11137f0fdf1ff934d698b04c6f430cd",
"Vulkan mandatory format support table:src/libANGLE/renderer/vulkan/vk_mandatory_format_support_data.json":
......
......@@ -183,3 +183,46 @@ def get_internal_format_initializer(internal_format, format_id):
return 'Initialize4ComponentData<GLuint, 0x00000000, 0x00000000, 0x00000000, 0x00000001>'
else:
raise ValueError('warning: internal format initializer could not be generated and may be needed for ' + internal_format)
def get_vertex_copy_function(src_format, dst_format):
if dst_format == "NONE":
return "nullptr";
num_channel = len(get_channel_tokens(src_format))
if num_channel < 1 or num_channel > 4:
return "nullptr";
if 'FIXED' in src_format:
assert 'FLOAT' in dst_format, ('get_vertex_copy_function: can only convert fixed to float,'
+ ' not to ' + dst_format)
return 'Copy32FixedTo32FVertexData<%d, %d>' % (num_channel, num_channel)
sign = ''
base_type = None
if 'FLOAT' in src_format:
base_type = 'float'
else:
bits = get_bits(src_format)
redbits = bits and bits.get('R')
if redbits == 8:
base_type = 'byte'
elif redbits == 16:
base_type = 'short'
elif redbits == 32:
base_type = 'int'
if 'UINT' in src_format or 'UNORM' in src_format or 'USCALED' in src_format:
sign = 'u'
if base_type is None:
return "nullptr";
gl_type = 'GL' + sign + base_type
if src_format == dst_format:
return 'CopyNativeVertexData<%s, %d, %d, 0>' % (gl_type, num_channel, num_channel)
assert 'FLOAT' in dst_format, ('get_vertex_copy_function: can only convert to float,'
+ ' not to ' + dst_format)
normalized = 'true' if 'NORM' in src_format else 'false'
return "CopyTo32FVertexData<%s, %d, %d, %s>" % (gl_type, num_channel, num_channel, normalized)
......@@ -154,7 +154,7 @@ gl::Error ContextVk::initPipeline(const gl::DrawCallParams &drawCallParams)
mPipelineDesc->updateTopology(mCurrentDrawMode);
// Copy over the latest attrib and binding descriptions.
vertexArrayVk->getPackedInputDescriptions(mRenderer, mPipelineDesc.get());
vertexArrayVk->getPackedInputDescriptions(mPipelineDesc.get());
// Ensure that the RenderPass description is updated.
mPipelineDesc->updateRenderPassDesc(framebufferVk->getRenderPassDesc());
......
......@@ -42,10 +42,13 @@ class VertexArrayVk : public VertexArrayImpl
const gl::VertexArray::DirtyAttribBitsArray &attribBits,
const gl::VertexArray::DirtyBindingBitsArray &bindingBits) override;
const gl::AttribArray<VkBuffer> &getCurrentArrayBufferHandles() const;
const gl::AttribArray<VkDeviceSize> &getCurrentArrayBufferOffsets() const;
void updateDrawDependencies(vk::CommandGraphResource *drawFramebuffer,
const gl::AttributesMask &activeAttribsMask,
vk::CommandGraphResource *elementArrayBufferOverride,
Serial serial,
bool isDrawElements);
void getPackedInputDescriptions(const RendererVk *rendererVk, vk::PipelineDesc *pipelineDesc);
void getPackedInputDescriptions(vk::PipelineDesc *pipelineDesc);
// Draw call handling.
gl::Error drawArrays(const gl::Context *context,
......@@ -63,9 +66,8 @@ class VertexArrayVk : public VertexArrayImpl
// update vertex info for attributes the program doesn't use, (very silly edge case). The
// advantage is the cached state then doesn't depend on the Program, so doesn't have to be
// updated when the active Program changes.
void updatePackedInputDescriptions(const RendererVk *rendererVk);
void updatePackedInputInfo(const RendererVk *rendererVk,
uint32_t attribIndex,
void updatePackedInputDescriptions();
void updatePackedInputInfo(uint32_t attribIndex,
const gl::VertexBinding &binding,
const gl::VertexAttribute &attrib);
......@@ -91,13 +93,16 @@ class VertexArrayVk : public VertexArrayImpl
vk::CommandBuffer *commandBuffer,
bool newCommandBuffer);
void syncDirtyAttrib(const gl::VertexAttribute &attrib,
void syncDirtyAttrib(const RendererVk *renderer,
const gl::VertexAttribute &attrib,
const gl::VertexBinding &binding,
size_t attribIndex);
gl::AttribArray<VkBuffer> mCurrentArrayBufferHandles;
gl::AttribArray<VkDeviceSize> mCurrentArrayBufferOffsets;
gl::AttribArray<vk::CommandGraphResource *> mCurrentArrayBufferResources;
gl::AttribArray<const vk::Format *> mCurrentArrayBufferFormats;
gl::AttribArray<GLuint> mCurrentArrayBufferStrides;
VkBuffer mCurrentElementArrayBufferHandle;
VkDeviceSize mCurrentElementArrayBufferOffset;
vk::CommandGraphResource *mCurrentElementArrayBufferResource;
......
......@@ -82,13 +82,18 @@ angle::Format::ID::{texture_fallback},
{texture_initializer_fallback});"""
buffer_basic_template = """bufferFormatID = angle::Format::ID::{buffer};
vkBufferFormat = {vk_buffer_format};"""
vkBufferFormat = {vk_buffer_format};
vertexLoadFunction = {vertex_load_function};
vertexLoadRequiresConversion = {vertex_load_converts};"""
buffer_fallback_template = """initBufferFallback(physicalDevice,
angle::Format::ID::{buffer},
{vk_buffer_format},
{vertex_load_function},
{vertex_load_converts},
angle::Format::ID::{buffer_fallback},
{vk_buffer_format_fallback});"""
{vk_buffer_format_fallback},
{vertex_load_function_fallback});"""
def gen_format_case(angle, internal_format, vk_json_data):
vk_map = vk_json_data["map"]
......@@ -131,8 +136,11 @@ def gen_format_case(angle, internal_format, vk_json_data):
buffer_template=buffer_template,
buffer=buffer_format,
vk_buffer_format=vk_map[buffer_format],
vertex_load_function=angle_format.get_vertex_copy_function(angle, buffer_format),
vertex_load_converts='false' if angle == buffer_format else 'true',
buffer_fallback=buffer_fallback,
vk_buffer_format_fallback=vk_map[buffer_fallback],
vertex_load_function_fallback=angle_format.get_vertex_copy_function(angle, buffer_fallback),
)
return format_entry_template.format(**args).format(**args)
......
......@@ -231,6 +231,105 @@
},
"D24_UNORM_S8_UINT": {
"texture": "D32_FLOAT_S8X24_UINT"
},
"R8_UNORM": {
"buffer": "R32_FLOAT"
},
"R8_SNORM": {
"buffer": "R32_FLOAT"
},
"R8_USCALED": {
"buffer": "R32_FLOAT"
},
"R8_SSCALED": {
"buffer": "R32_FLOAT"
},
"R8G8_UNORM": {
"buffer": "R32G32_FLOAT"
},
"R8G8_SNORM": {
"buffer": "R32G32_FLOAT"
},
"R8G8_USCALED": {
"buffer": "R32G32_FLOAT"
},
"R8G8_SSCALED": {
"buffer": "R32G32_FLOAT"
},
"R8G8B8_UNORM": {
"buffer": "R32G32B32_FLOAT"
},
"R8G8B8_SNORM": {
"buffer": "R32G32B32_FLOAT"
},
"R8G8B8_USCALED": {
"buffer": "R32G32B32_FLOAT"
},
"R8G8B8_SSCALED": {
"buffer": "R32G32B32_FLOAT"
},
"R8G8B8A8_UNORM": {
"buffer": "R32G32B32A32_FLOAT"
},
"R8G8B8A8_SNORM": {
"buffer": "R32G32B32A32_FLOAT"
},
"R8G8B8A8_USCALED": {
"buffer": "R32G32B32A32_FLOAT"
},
"R8G8B8A8_SSCALED": {
"buffer": "R32G32B32A32_FLOAT"
},
"R16_UNORM": {
"buffer": "R32_FLOAT"
},
"R16_SNORM": {
"buffer": "R32_FLOAT"
},
"R16_USCALED": {
"buffer": "R32_FLOAT"
},
"R16_SSCALED": {
"buffer": "R32_FLOAT"
},
"R16G16_UNORM": {
"buffer": "R32G32_FLOAT"
},
"R16G16_SNORM": {
"buffer": "R32G32_FLOAT"
},
"R16G16_USCALED": {
"buffer": "R32G32_FLOAT"
},
"R16G16_SSCALED": {
"buffer": "R32G32_FLOAT"
},
"R16G16B16_UNORM": {
"buffer": "R32G32B32_FLOAT"
},
"R16G16B16_SNORM": {
"buffer": "R32G32B32_FLOAT"
},
"R16G16B16_USCALED": {
"buffer": "R32G32B32_FLOAT"
},
"R16G16B16_SSCALED": {
"buffer": "R32G32B32_FLOAT"
},
"R16G16B16A16_UNORM": {
"buffer": "R32G32B32A32_FLOAT"
},
"R16G16B16A16_SNORM": {
"buffer": "R32G32B32A32_FLOAT"
},
"R16G16B16A16_USCALED": {
"buffer": "R32G32B32A32_FLOAT"
},
"R16G16B16A16_SSCALED": {
"buffer": "R32G32B32A32_FLOAT"
}
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -56,6 +56,13 @@ bool HasFullTextureFormatSupport(VkPhysicalDevice physicalDevice, VkFormat vkFor
HasFormatFeatureBits(kBitsDepth, formatProperties);
}
bool HasFullBufferFormatSupport(VkPhysicalDevice physicalDevice, VkFormat vkFormat)
{
VkFormatProperties formatProperties;
vk::GetFormatProperties(physicalDevice, vkFormat, &formatProperties);
return formatProperties.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT;
}
} // anonymous namespace
namespace vk
......@@ -126,12 +133,30 @@ void Format::initTextureFallback(VkPhysicalDevice physicalDevice,
void Format::initBufferFallback(VkPhysicalDevice physicalDevice,
angle::Format::ID format,
VkFormat vkFormat,
VertexCopyFunction function,
bool functionConverts,
angle::Format::ID fallbackFormat,
VkFormat fallbackVkFormat)
VkFormat fallbackVkFormat,
VertexCopyFunction fallbackFunction)
{
ASSERT(format != angle::Format::ID::NONE);
ASSERT(fallbackFormat != angle::Format::ID::NONE);
UNIMPLEMENTED();
if (HasFullBufferFormatSupport(physicalDevice, vkFormat))
{
bufferFormatID = format;
vkBufferFormat = vkFormat;
vertexLoadFunction = function;
vertexLoadRequiresConversion = functionConverts;
}
else
{
bufferFormatID = fallbackFormat;
vkBufferFormat = fallbackVkFormat;
vertexLoadFunction = fallbackFunction;
vertexLoadRequiresConversion = true;
ASSERT(HasFullBufferFormatSupport(physicalDevice, vkBufferFormat));
}
}
const angle::Format &Format::textureFormat() const
......
......@@ -13,6 +13,7 @@
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/Format.h"
#include "libANGLE/renderer/copyvertex.h"
#include "libANGLE/renderer/renderer_utils.h"
#include <array>
......@@ -52,8 +53,11 @@ struct Format final : private angle::NonCopyable
void initBufferFallback(VkPhysicalDevice physicalDevice,
angle::Format::ID format,
VkFormat vkFormat,
VertexCopyFunction function,
bool functionConverts,
angle::Format::ID fallbackFormat,
VkFormat fallbackVkFormat);
VkFormat fallbackVkFormat,
VertexCopyFunction fallbackFunction);
const angle::Format &textureFormat() const;
const angle::Format &bufferFormat() const;
......@@ -67,6 +71,8 @@ struct Format final : private angle::NonCopyable
VkFormat vkBufferFormat;
InitializeTextureDataFunction textureInitializerFunction;
LoadFunctionMap textureLoadFunctions;
VertexCopyFunction vertexLoadFunction;
bool vertexLoadRequiresConversion;
};
bool operator==(const Format &lhs, const Format &rhs);
......
......@@ -216,13 +216,7 @@
2606 VULKAN ANDROID : dEQP-GLES2.functional.debug_marker.random = SKIP
2606 VULKAN ANDROID : dEQP-GLES2.functional.debug_marker.supported = SKIP
2609 VULKAN ANDROID : dEQP-GLES2.functional.texture.mipmap.cube.generate.* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.input_types.3_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.input_types.3_short* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.input_types.3_unsigned_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.input_types.3_unsigned_short* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.first.byte_first* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_short3* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_unsigned_short3* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_1_17_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_1_2_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_1_32_byte* = SKIP
......@@ -235,10 +229,6 @@
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_4_17_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_4_2_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_4_32_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.output_types.user_ptr_0_0_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.output_types.user_ptr_0_0_short* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.output_types.user_ptr_0_0_unsigned_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.output_types.user_ptr_0_0_unsigned_short* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_17_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_2_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_32_byte* = SKIP
......@@ -255,6 +245,7 @@
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_short* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_4_short* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_8_short* = SKIP
2567 GLES ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.red_unsigned_byte = FAIL
2567 GLES ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.rg_unsigned_byte = FAIL
......@@ -339,12 +330,6 @@
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_32* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_4* = SKIP
// TODO(fjhenigman): Try these again once vertex format support is farther along.
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_short* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_unsigned_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_unsigned_short* = SKIP
// AMD is known to require proper alignment which is probably why 17 is a bad number for it
// TODO(fjhenigman): Implement realigning.
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_0_float2_0_float2_17 = SKIP
......@@ -369,10 +354,6 @@
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_17_17_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_17_2_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_17_32_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.output_types.user_ptr_0_0_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.output_types.user_ptr_0_0_short* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.output_types.user_ptr_0_0_unsigned_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.output_types.user_ptr_0_0_unsigned_short* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_17_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_32_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_32_short* = SKIP
......
......@@ -389,23 +389,10 @@ void AttributeLayoutTest::GetTestCases(void)
mTestCases.push_back({Float(B0, 0, 16, mCoord), Float(B1, 0, 12, mColor)});
// 6-9. byte/short
if (IsVulkan() && (IsAndroid() || (IsWindows() && IsAMD())))
{
// empty test cases preserve the numbering
mTestCases.push_back({});
mTestCases.push_back({});
mTestCases.push_back({});
mTestCases.push_back({});
}
else
{
// TODO(fjhenigman): Enable these once vertex format conversion is implemented.
// anglebug.com/2405
mTestCases.push_back({SByte(M0, 0, 20, mCoord), UByte(M0, 10, 20, mColor)});
mTestCases.push_back({SShort(M0, 0, 20, mCoord), UShort(M0, 8, 20, mColor)});
mTestCases.push_back({NormSByte(M0, 0, 8, mCoord), NormUByte(M0, 4, 8, mColor)});
mTestCases.push_back({NormSShort(M0, 0, 20, mCoord), NormUShort(M0, 8, 20, mColor)});
}
mTestCases.push_back({SByte(M0, 0, 20, mCoord), UByte(M0, 10, 20, mColor)});
mTestCases.push_back({SShort(M0, 0, 20, mCoord), UShort(M0, 8, 20, mColor)});
mTestCases.push_back({NormSByte(M0, 0, 8, mCoord), NormUByte(M0, 4, 8, mColor)});
mTestCases.push_back({NormSShort(M0, 0, 20, mCoord), NormUShort(M0, 8, 20, mColor)});
if (IsVulkan())
{
......
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