Commit 2ad498eb by Frank Henigman Committed by Commit Bot

Vulkan: get vertex formats from format table.

Use the Vulkan format table to look up the Vulkan format for vertex data. This will let us support more vertex formats by adding them to the table. It also eliminates one usage of gl::VertexFormatType. No functional change. BUG=angleproject:2405 BUG=angleproject:2531 Change-Id: I73eb69ccac50d427de3e7d5479f92bb17c49aed3 Reviewed-on: https://chromium-review.googlesource.com/1051028Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarLuc Ferron <lucferron@chromium.org> Commit-Queue: Frank Henigman <fjhenigman@chromium.org>
parent 9c4c0926
...@@ -120,7 +120,7 @@ gl::Error ContextVk::initPipeline() ...@@ -120,7 +120,7 @@ gl::Error ContextVk::initPipeline()
mPipelineDesc->updateTopology(mCurrentDrawMode); mPipelineDesc->updateTopology(mCurrentDrawMode);
// Copy over the latest attrib and binding descriptions. // Copy over the latest attrib and binding descriptions.
vertexArrayVk->getPackedInputDescriptions(mPipelineDesc.get()); vertexArrayVk->getPackedInputDescriptions(mRenderer, mPipelineDesc.get());
// Ensure that the RenderPass description is updated. // Ensure that the RenderPass description is updated.
mPipelineDesc->updateRenderPassDesc(framebufferVk->getRenderPassDesc()); mPipelineDesc->updateRenderPassDesc(framebufferVk->getRenderPassDesc());
......
...@@ -98,6 +98,8 @@ class RendererVk : angle::NonCopyable ...@@ -98,6 +98,8 @@ class RendererVk : angle::NonCopyable
return mFormatTable[internalFormat]; return mFormatTable[internalFormat];
} }
const vk::Format &getFormat(angle::Format::ID formatID) const { return mFormatTable[formatID]; }
vk::Error getCompatibleRenderPass(const vk::RenderPassDesc &desc, vk::Error getCompatibleRenderPass(const vk::RenderPassDesc &desc,
vk::RenderPass **renderPassOut); vk::RenderPass **renderPassOut);
vk::Error getRenderPassWithOps(const vk::RenderPassDesc &desc, vk::Error getRenderPassWithOps(const vk::RenderPassDesc &desc,
......
...@@ -299,13 +299,14 @@ void VertexArrayVk::updateElementArrayBufferReadDependency( ...@@ -299,13 +299,14 @@ void VertexArrayVk::updateElementArrayBufferReadDependency(
} }
} }
void VertexArrayVk::getPackedInputDescriptions(vk::PipelineDesc *pipelineDesc) void VertexArrayVk::getPackedInputDescriptions(const RendererVk *rendererVk,
vk::PipelineDesc *pipelineDesc)
{ {
updatePackedInputDescriptions(); updatePackedInputDescriptions(rendererVk);
pipelineDesc->updateVertexInputInfo(mPackedInputBindings, mPackedInputAttributes); pipelineDesc->updateVertexInputInfo(mPackedInputBindings, mPackedInputAttributes);
} }
void VertexArrayVk::updatePackedInputDescriptions() void VertexArrayVk::updatePackedInputDescriptions(const RendererVk *rendererVk)
{ {
if (!mDirtyPackedInputs.any()) if (!mDirtyPackedInputs.any())
{ {
...@@ -321,7 +322,7 @@ void VertexArrayVk::updatePackedInputDescriptions() ...@@ -321,7 +322,7 @@ void VertexArrayVk::updatePackedInputDescriptions()
const auto &binding = bindings[attrib.bindingIndex]; const auto &binding = bindings[attrib.bindingIndex];
if (attrib.enabled) if (attrib.enabled)
{ {
updatePackedInputInfo(static_cast<uint32_t>(attribIndex), binding, attrib); updatePackedInputInfo(rendererVk, static_cast<uint32_t>(attribIndex), binding, attrib);
} }
else else
{ {
...@@ -332,7 +333,8 @@ void VertexArrayVk::updatePackedInputDescriptions() ...@@ -332,7 +333,8 @@ void VertexArrayVk::updatePackedInputDescriptions()
mDirtyPackedInputs.reset(); mDirtyPackedInputs.reset();
} }
void VertexArrayVk::updatePackedInputInfo(uint32_t attribIndex, void VertexArrayVk::updatePackedInputInfo(const RendererVk *rendererVk,
uint32_t attribIndex,
const gl::VertexBinding &binding, const gl::VertexBinding &binding,
const gl::VertexAttribute &attrib) const gl::VertexAttribute &attrib)
{ {
...@@ -345,8 +347,7 @@ void VertexArrayVk::updatePackedInputInfo(uint32_t attribIndex, ...@@ -345,8 +347,7 @@ void VertexArrayVk::updatePackedInputInfo(uint32_t attribIndex,
bindingDesc.inputRate = static_cast<uint16_t>( bindingDesc.inputRate = static_cast<uint16_t>(
binding.getDivisor() > 0 ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX); binding.getDivisor() > 0 ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX);
gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib); VkFormat vkFormat = rendererVk->getFormat(GetVertexFormatID(attrib)).vkBufferFormat;
VkFormat vkFormat = vk::GetNativeVertexFormat(vertexFormatType);
ASSERT(vkFormat <= std::numeric_limits<uint16_t>::max()); ASSERT(vkFormat <= std::numeric_limits<uint16_t>::max());
vk::PackedVertexInputAttributeDesc &attribDesc = mPackedInputAttributes[attribIndex]; vk::PackedVertexInputAttributeDesc &attribDesc = mPackedInputAttributes[attribIndex];
......
...@@ -51,7 +51,7 @@ class VertexArrayVk : public VertexArrayImpl ...@@ -51,7 +51,7 @@ class VertexArrayVk : public VertexArrayImpl
Serial serial, Serial serial,
bool isDrawElements); bool isDrawElements);
void getPackedInputDescriptions(vk::PipelineDesc *pipelineDesc); void getPackedInputDescriptions(const RendererVk *rendererVk, vk::PipelineDesc *pipelineDesc);
// Draw call handling. // Draw call handling.
gl::Error drawArrays(const gl::Context *context, gl::Error drawArrays(const gl::Context *context,
...@@ -71,8 +71,9 @@ class VertexArrayVk : public VertexArrayImpl ...@@ -71,8 +71,9 @@ class VertexArrayVk : public VertexArrayImpl
// update vertex info for attributes the program doesn't use, (very silly edge case). The // 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 // advantage is the cached state then doesn't depend on the Program, so doesn't have to be
// updated when the active Program changes. // updated when the active Program changes.
void updatePackedInputDescriptions(); void updatePackedInputDescriptions(const RendererVk *rendererVk);
void updatePackedInputInfo(uint32_t attribIndex, void updatePackedInputInfo(const RendererVk *rendererVk,
uint32_t attribIndex,
const gl::VertexBinding &binding, const gl::VertexBinding &binding,
const gl::VertexAttribute &attrib); const gl::VertexAttribute &attrib);
......
...@@ -173,268 +173,9 @@ const Format &FormatTable::operator[](GLenum internalFormat) const ...@@ -173,268 +173,9 @@ const Format &FormatTable::operator[](GLenum internalFormat) const
return mFormatData[static_cast<size_t>(formatID)]; return mFormatData[static_cast<size_t>(formatID)];
} }
// TODO(jmadill): This is temporary. Figure out how to handle format conversions. const Format &FormatTable::operator[](angle::Format::ID formatID) const
VkFormat GetNativeVertexFormat(gl::VertexFormatType vertexFormat)
{ {
switch (vertexFormat) return mFormatData[static_cast<size_t>(formatID)];
{
case gl::VERTEX_FORMAT_INVALID:
UNREACHABLE();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SBYTE1:
return VK_FORMAT_R8_SINT;
case gl::VERTEX_FORMAT_SBYTE1_NORM:
return VK_FORMAT_R8_SNORM;
case gl::VERTEX_FORMAT_SBYTE2:
return VK_FORMAT_R8G8_SINT;
case gl::VERTEX_FORMAT_SBYTE2_NORM:
return VK_FORMAT_R8G8_SNORM;
case gl::VERTEX_FORMAT_SBYTE3:
return VK_FORMAT_R8G8B8_SINT;
case gl::VERTEX_FORMAT_SBYTE3_NORM:
return VK_FORMAT_R8G8B8_SNORM;
case gl::VERTEX_FORMAT_SBYTE4:
return VK_FORMAT_R8G8B8A8_SINT;
case gl::VERTEX_FORMAT_SBYTE4_NORM:
return VK_FORMAT_R8G8B8A8_SNORM;
case gl::VERTEX_FORMAT_UBYTE1:
return VK_FORMAT_R8_UINT;
case gl::VERTEX_FORMAT_UBYTE1_NORM:
return VK_FORMAT_R8_UNORM;
case gl::VERTEX_FORMAT_UBYTE2:
return VK_FORMAT_R8G8_UINT;
case gl::VERTEX_FORMAT_UBYTE2_NORM:
return VK_FORMAT_R8G8_UNORM;
case gl::VERTEX_FORMAT_UBYTE3:
return VK_FORMAT_R8G8B8_UINT;
case gl::VERTEX_FORMAT_UBYTE3_NORM:
return VK_FORMAT_R8G8B8_UNORM;
case gl::VERTEX_FORMAT_UBYTE4:
return VK_FORMAT_R8G8B8A8_UINT;
case gl::VERTEX_FORMAT_UBYTE4_NORM:
return VK_FORMAT_R8G8B8A8_UNORM;
case gl::VERTEX_FORMAT_SSHORT1:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SSHORT1_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SSHORT2:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SSHORT2_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SSHORT3:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SSHORT3_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SSHORT4:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SSHORT4_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_USHORT1:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_USHORT1_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_USHORT2:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_USHORT2_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_USHORT3:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_USHORT3_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_USHORT4:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_USHORT4_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT1:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT1_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT2:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT2_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT3:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT3_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT4:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT4_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT1:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT1_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT2:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT2_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT3:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT3_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT4:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT4_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SBYTE1_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SBYTE2_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SBYTE3_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SBYTE4_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UBYTE1_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UBYTE2_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UBYTE3_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UBYTE4_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SSHORT1_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SSHORT2_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SSHORT3_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SSHORT4_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_USHORT1_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_USHORT2_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_USHORT3_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_USHORT4_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT1_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT2_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT3_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT4_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT1_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT2_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT3_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT4_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_FIXED1:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_FIXED2:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_FIXED3:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_FIXED4:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_HALF1:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_HALF2:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_HALF3:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_HALF4:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_FLOAT1:
return VK_FORMAT_R32_SFLOAT;
case gl::VERTEX_FORMAT_FLOAT2:
return VK_FORMAT_R32G32_SFLOAT;
case gl::VERTEX_FORMAT_FLOAT3:
return VK_FORMAT_R32G32B32_SFLOAT;
case gl::VERTEX_FORMAT_FLOAT4:
return VK_FORMAT_R32G32B32A32_SFLOAT;
case gl::VERTEX_FORMAT_SINT210:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT210:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT210_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT210_NORM:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_SINT210_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
case gl::VERTEX_FORMAT_UINT210_INT:
UNIMPLEMENTED();
return VK_FORMAT_UNDEFINED;
default:
UNREACHABLE();
return VK_FORMAT_UNDEFINED;
}
} }
} // namespace vk } // namespace vk
......
...@@ -70,15 +70,13 @@ class FormatTable final : angle::NonCopyable ...@@ -70,15 +70,13 @@ class FormatTable final : angle::NonCopyable
std::vector<GLenum> *outCompressedTextureFormats); std::vector<GLenum> *outCompressedTextureFormats);
const Format &operator[](GLenum internalFormat) const; const Format &operator[](GLenum internalFormat) const;
const Format &operator[](angle::Format::ID formatID) const;
private: private:
// The table data is indexed by angle::Format::ID. // The table data is indexed by angle::Format::ID.
std::array<Format, angle::kNumANGLEFormats> mFormatData; std::array<Format, angle::kNumANGLEFormats> mFormatData;
}; };
// TODO(jmadill): This is temporary. Figure out how to handle format conversions.
VkFormat GetNativeVertexFormat(gl::VertexFormatType vertexFormat);
// This will return a reference to a VkFormatProperties with the feature flags supported // This will return a reference to a VkFormatProperties with the feature flags supported
// if the format is a mandatory format described in section 31.3.3. Required Format Support // if the format is a mandatory format described in section 31.3.3. Required Format Support
// of the Vulkan spec. If the vkFormat isn't mandatory, it will return a VkFormatProperties // of the Vulkan spec. If the vkFormat isn't mandatory, it will return a VkFormatProperties
......
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