Commit e452382a by Frank Henigman Committed by Commit Bot

Vulkan: convert/align vertex data from buffers

When we get a buffer with vertex data in an unsupported format or alignment, correct that as we copy it to a DynamicBuffer, then use the copy. Enable tests. BUG=angleproject:2405 Change-Id: I2132abea4d936f6b53d9209be7f99a0e2d8de219 Reviewed-on: https://chromium-review.googlesource.com/1141277 Commit-Queue: Frank Henigman <fjhenigman@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 5b3b5cc1
...@@ -151,14 +151,17 @@ gl::Error BufferVk::mapRange(const gl::Context *context, ...@@ -151,14 +151,17 @@ gl::Error BufferVk::mapRange(const gl::Context *context,
gl::Error BufferVk::unmap(const gl::Context *context, GLboolean *result) gl::Error BufferVk::unmap(const gl::Context *context, GLboolean *result)
{ {
return unmapImpl(vk::GetImpl(context));
}
angle::Result BufferVk::unmapImpl(ContextVk *contextVk)
{
ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE); ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE);
ASSERT(mBufferMemory.getHandle() != VK_NULL_HANDLE); ASSERT(mBufferMemory.getHandle() != VK_NULL_HANDLE);
VkDevice device = vk::GetImpl(context)->getDevice(); mBufferMemory.unmap(contextVk->getDevice());
mBufferMemory.unmap(device);
return gl::NoError(); return angle::Result::Continue();
} }
gl::Error BufferVk::getIndexRange(const gl::Context *context, gl::Error BufferVk::getIndexRange(const gl::Context *context,
......
...@@ -59,6 +59,7 @@ class BufferVk : public BufferImpl, public vk::CommandGraphResource ...@@ -59,6 +59,7 @@ class BufferVk : public BufferImpl, public vk::CommandGraphResource
const vk::Buffer &getVkBuffer() const; const vk::Buffer &getVkBuffer() const;
angle::Result mapImpl(ContextVk *contextVk, void **mapPtr); angle::Result mapImpl(ContextVk *contextVk, void **mapPtr);
angle::Result unmapImpl(ContextVk *contextVk);
private: private:
angle::Result setDataImpl(ContextVk *contextVk, angle::Result setDataImpl(ContextVk *contextVk,
......
...@@ -25,8 +25,18 @@ namespace ...@@ -25,8 +25,18 @@ namespace
{ {
constexpr size_t kDynamicVertexDataSize = 1024 * 1024; constexpr size_t kDynamicVertexDataSize = 1024 * 1024;
constexpr size_t kDynamicIndexDataSize = 1024 * 8; constexpr size_t kDynamicIndexDataSize = 1024 * 8;
bool BindingIsAligned(const gl::VertexBinding &binding, unsigned componentSize)
{
return (binding.getOffset() % componentSize == 0) && (binding.getStride() % componentSize == 0);
}
} // anonymous namespace } // anonymous namespace
#define INIT \
{ \
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, 1024 * 8 \
}
VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state, RendererVk *renderer) VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state, RendererVk *renderer)
: VertexArrayImpl(state), : VertexArrayImpl(state),
mCurrentArrayBufferHandles{}, mCurrentArrayBufferHandles{},
...@@ -34,6 +44,11 @@ VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state, RendererVk *rend ...@@ -34,6 +44,11 @@ VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state, RendererVk *rend
mCurrentArrayBufferResources{}, mCurrentArrayBufferResources{},
mCurrentArrayBufferFormats{}, mCurrentArrayBufferFormats{},
mCurrentArrayBufferStrides{}, mCurrentArrayBufferStrides{},
mCurrentArrayBufferConversion{{
INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT,
INIT,
}},
mCurrentArrayBufferConversionCanRelease{},
mCurrentElementArrayBufferHandle(VK_NULL_HANDLE), mCurrentElementArrayBufferHandle(VK_NULL_HANDLE),
mCurrentElementArrayBufferOffset(0), mCurrentElementArrayBufferOffset(0),
mCurrentElementArrayBufferResource(nullptr), mCurrentElementArrayBufferResource(nullptr),
...@@ -53,6 +68,10 @@ VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state, RendererVk *rend ...@@ -53,6 +68,10 @@ VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state, RendererVk *rend
mPackedInputBindings.fill({0, 0}); mPackedInputBindings.fill({0, 0});
mPackedInputAttributes.fill({0, 0, 0}); mPackedInputAttributes.fill({0, 0, 0});
for (vk::DynamicBuffer &buffer : mCurrentArrayBufferConversion)
{
buffer.init(1, renderer);
}
mDynamicVertexData.init(1, renderer); mDynamicVertexData.init(1, renderer);
mDynamicIndexData.init(1, renderer); mDynamicIndexData.init(1, renderer);
mTranslatedByteIndexData.init(1, renderer); mTranslatedByteIndexData.init(1, renderer);
...@@ -65,6 +84,10 @@ VertexArrayVk::~VertexArrayVk() ...@@ -65,6 +84,10 @@ VertexArrayVk::~VertexArrayVk()
void VertexArrayVk::destroy(const gl::Context *context) void VertexArrayVk::destroy(const gl::Context *context)
{ {
VkDevice device = vk::GetImpl(context)->getRenderer()->getDevice(); VkDevice device = vk::GetImpl(context)->getRenderer()->getDevice();
for (vk::DynamicBuffer &buffer : mCurrentArrayBufferConversion)
{
buffer.destroy(device);
}
mDynamicVertexData.destroy(device); mDynamicVertexData.destroy(device);
mDynamicIndexData.destroy(device); mDynamicIndexData.destroy(device);
mTranslatedByteIndexData.destroy(device); mTranslatedByteIndexData.destroy(device);
...@@ -147,20 +170,83 @@ angle::Result VertexArrayVk::streamIndexData(ContextVk *contextVk, ...@@ -147,20 +170,83 @@ angle::Result VertexArrayVk::streamIndexData(ContextVk *contextVk,
return angle::Result::Continue(); return angle::Result::Continue();
} }
#define ANGLE_VERTEX_DIRTY_ATTRIB_FUNC(INDEX) \ // We assume the buffer is completely full of the same kind of data and convert
case gl::VertexArray::DIRTY_BIT_ATTRIB_0 + INDEX: \ // and/or align it as we copy it to a DynamicBuffer. The assumption could be wrong
syncDirtyAttrib(contextVk, attribs[INDEX], bindings[attribs[INDEX].bindingIndex], INDEX); \ // but the alternative of copying it piecemeal on each draw would have a lot more
invalidatePipeline = true; \ // overhead.
angle::Result VertexArrayVk::convertVertexBuffer(ContextVk *context,
BufferVk *srcBuffer,
const gl::VertexBinding &binding,
size_t attribIndex)
{
// Preparation for mapping source buffer.
ANGLE_TRY(context->getRenderer()->finish(context));
unsigned srcFormatSize = mCurrentArrayBufferFormats[attribIndex]->angleFormat().pixelBytes;
unsigned dstFormatSize = mCurrentArrayBufferFormats[attribIndex]->bufferFormat().pixelBytes;
// Bytes usable for vertex data.
GLint64 bytes = srcBuffer->getSize() - binding.getOffset();
if (bytes < srcFormatSize)
return angle::Result::Continue();
// Count the last vertex. It may occupy less than a full stride.
size_t numVertices = 1;
bytes -= srcFormatSize;
// Count how many strides fit remaining space.
if (bytes > 0)
numVertices += static_cast<size_t>(bytes) / binding.getStride();
void *src = nullptr;
uint8_t *dst = nullptr;
uint32_t offset = 0;
ANGLE_TRY(mCurrentArrayBufferConversion[attribIndex].allocate(
context, numVertices * dstFormatSize, &dst, &mCurrentArrayBufferHandles[attribIndex],
&offset, nullptr));
ANGLE_TRY(srcBuffer->mapImpl(context, &src));
mCurrentArrayBufferFormats[attribIndex]->vertexLoadFunction(
static_cast<const uint8_t *>(src) + binding.getOffset(), binding.getStride(), numVertices,
dst);
ANGLE_TRY(srcBuffer->unmapImpl(context));
ANGLE_TRY(mCurrentArrayBufferConversion[attribIndex].flush(context));
mCurrentArrayBufferConversionCanRelease[attribIndex] = true;
mCurrentArrayBufferOffsets[attribIndex] = offset;
mCurrentArrayBufferStrides[attribIndex] = dstFormatSize;
return angle::Result::Continue();
}
void VertexArrayVk::ensureConversionReleased(RendererVk *renderer, size_t attribIndex)
{
if (mCurrentArrayBufferConversionCanRelease[attribIndex])
{
mCurrentArrayBufferConversion[attribIndex].release(renderer);
mCurrentArrayBufferConversionCanRelease[attribIndex] = false;
}
}
#define ANGLE_VERTEX_DIRTY_ATTRIB_FUNC(INDEX) \
case gl::VertexArray::DIRTY_BIT_ATTRIB_0 + INDEX: \
ANGLE_TRY(syncDirtyAttrib(contextVk, attribs[INDEX], \
bindings[attribs[INDEX].bindingIndex], INDEX)); \
invalidatePipeline = true; \
break; break;
#define ANGLE_VERTEX_DIRTY_BINDING_FUNC(INDEX) \ #define ANGLE_VERTEX_DIRTY_BINDING_FUNC(INDEX) \
case gl::VertexArray::DIRTY_BIT_BINDING_0 + INDEX: \ case gl::VertexArray::DIRTY_BIT_BINDING_0 + INDEX: \
syncDirtyAttrib(contextVk, attribs[INDEX], bindings[attribs[INDEX].bindingIndex], INDEX); \ ANGLE_TRY(syncDirtyAttrib(contextVk, attribs[INDEX], \
invalidatePipeline = true; \ bindings[attribs[INDEX].bindingIndex], INDEX)); \
invalidatePipeline = true; \
break; break;
#define ANGLE_VERTEX_DIRTY_BUFFER_DATA_FUNC(INDEX) \ #define ANGLE_VERTEX_DIRTY_BUFFER_DATA_FUNC(INDEX) \
case gl::VertexArray::DIRTY_BIT_BUFFER_DATA_0 + INDEX: \ case gl::VertexArray::DIRTY_BIT_BUFFER_DATA_0 + INDEX: \
ANGLE_TRY(syncDirtyAttrib(contextVk, attribs[INDEX], \
bindings[attribs[INDEX].bindingIndex], INDEX)); \
break; break;
gl::Error VertexArrayVk::syncState(const gl::Context *context, gl::Error VertexArrayVk::syncState(const gl::Context *context,
...@@ -172,7 +258,6 @@ gl::Error VertexArrayVk::syncState(const gl::Context *context, ...@@ -172,7 +258,6 @@ gl::Error VertexArrayVk::syncState(const gl::Context *context,
bool invalidatePipeline = false; bool invalidatePipeline = false;
// Invalidate current pipeline.
ContextVk *contextVk = vk::GetImpl(context); ContextVk *contextVk = vk::GetImpl(context);
// Rebuild current attribute buffers cache. This will fail horribly if the buffer changes. // Rebuild current attribute buffers cache. This will fail horribly if the buffer changes.
...@@ -232,35 +317,44 @@ gl::Error VertexArrayVk::syncState(const gl::Context *context, ...@@ -232,35 +317,44 @@ gl::Error VertexArrayVk::syncState(const gl::Context *context,
return gl::NoError(); return gl::NoError();
} }
void VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk, angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
const gl::VertexAttribute &attrib, const gl::VertexAttribute &attrib,
const gl::VertexBinding &binding, const gl::VertexBinding &binding,
size_t attribIndex) size_t attribIndex)
{ {
// Invalidate the input description for pipelines. // Invalidate the input description for pipelines.
mDirtyPackedInputs.set(attribIndex); mDirtyPackedInputs.set(attribIndex);
RendererVk *renderer = contextVk->getRenderer(); RendererVk *renderer = contextVk->getRenderer();
bool releaseConversion = true;
if (attrib.enabled) if (attrib.enabled)
{ {
gl::Buffer *bufferGL = binding.getBuffer().get(); gl::Buffer *bufferGL = binding.getBuffer().get();
mCurrentArrayBufferFormats[attribIndex] = &renderer->getFormat(GetVertexFormatID(attrib)); mCurrentArrayBufferFormats[attribIndex] = &renderer->getFormat(GetVertexFormatID(attrib));
if (bufferGL) if (bufferGL)
{ {
if (mCurrentArrayBufferFormats[attribIndex]->vertexLoadRequiresConversion) BufferVk *bufferVk = vk::GetImpl(bufferGL);
unsigned componentSize =
mCurrentArrayBufferFormats[attribIndex]->angleFormat().pixelBytes / attrib.size;
if (mCurrentArrayBufferFormats[attribIndex]->vertexLoadRequiresConversion ||
!BindingIsAligned(binding, componentSize))
{ {
// TODO(fjhenigman): Make another buffer and put converted data into it. ANGLE_TRY(convertVertexBuffer(contextVk, bufferVk, binding, attribIndex));
// anglebug.com/2405
UNIMPLEMENTED();
}
BufferVk *bufferVk = vk::GetImpl(bufferGL); mCurrentArrayBufferConversion[attribIndex].releaseRetainedBuffers(renderer);
mCurrentArrayBufferResources[attribIndex] = bufferVk; mCurrentArrayBufferResources[attribIndex] = nullptr;
mCurrentArrayBufferHandles[attribIndex] = bufferVk->getVkBuffer().getHandle(); releaseConversion = false;
mCurrentArrayBufferOffsets[attribIndex] = binding.getOffset(); }
mCurrentArrayBufferStrides[attribIndex] = binding.getStride(); else
{
mCurrentArrayBufferResources[attribIndex] = bufferVk;
mCurrentArrayBufferHandles[attribIndex] = bufferVk->getVkBuffer().getHandle();
mCurrentArrayBufferOffsets[attribIndex] = binding.getOffset();
mCurrentArrayBufferStrides[attribIndex] = binding.getStride();
}
} }
else else
{ {
...@@ -268,8 +362,7 @@ void VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk, ...@@ -268,8 +362,7 @@ void VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
mCurrentArrayBufferHandles[attribIndex] = VK_NULL_HANDLE; mCurrentArrayBufferHandles[attribIndex] = VK_NULL_HANDLE;
mCurrentArrayBufferOffsets[attribIndex] = 0; mCurrentArrayBufferOffsets[attribIndex] = 0;
mCurrentArrayBufferStrides[attribIndex] = mCurrentArrayBufferStrides[attribIndex] =
angle::Format::Get(mCurrentArrayBufferFormats[attribIndex]->bufferFormatID) mCurrentArrayBufferFormats[attribIndex]->bufferFormat().pixelBytes;
.pixelBytes;
} }
} }
else else
...@@ -284,6 +377,11 @@ void VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk, ...@@ -284,6 +377,11 @@ void VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
mCurrentArrayBufferFormats[attribIndex] = mCurrentArrayBufferFormats[attribIndex] =
&renderer->getFormat(angle::FormatID::R32G32B32A32_FLOAT); &renderer->getFormat(angle::FormatID::R32G32B32A32_FLOAT);
} }
if (releaseConversion)
ensureConversionReleased(renderer, attribIndex);
return angle::Result::Continue();
} }
void VertexArrayVk::updateArrayBufferReadDependencies(vk::CommandGraphResource *drawFramebuffer, void VertexArrayVk::updateArrayBufferReadDependencies(vk::CommandGraphResource *drawFramebuffer,
......
...@@ -26,7 +26,6 @@ class BufferVk; ...@@ -26,7 +26,6 @@ class BufferVk;
namespace vk namespace vk
{ {
class CommandGraphResource; class CommandGraphResource;
class DynamicBuffer;
} // namespace vk } // namespace vk
class VertexArrayVk : public VertexArrayImpl class VertexArrayVk : public VertexArrayImpl
...@@ -88,6 +87,11 @@ class VertexArrayVk : public VertexArrayImpl ...@@ -88,6 +87,11 @@ class VertexArrayVk : public VertexArrayImpl
const gl::DrawCallParams &drawCallParams); const gl::DrawCallParams &drawCallParams);
angle::Result streamIndexData(ContextVk *contextVk, const gl::DrawCallParams &drawCallParams); angle::Result streamIndexData(ContextVk *contextVk, const gl::DrawCallParams &drawCallParams);
angle::Result convertVertexBuffer(ContextVk *contextVk,
BufferVk *srcBuffer,
const gl::VertexBinding &binding,
size_t attribIndex);
void ensureConversionReleased(RendererVk *renderer, size_t attribIndex);
gl::Error onDraw(const gl::Context *context, gl::Error onDraw(const gl::Context *context,
const gl::DrawCallParams &drawCallParams, const gl::DrawCallParams &drawCallParams,
...@@ -98,16 +102,18 @@ class VertexArrayVk : public VertexArrayImpl ...@@ -98,16 +102,18 @@ class VertexArrayVk : public VertexArrayImpl
vk::CommandBuffer *commandBuffer, vk::CommandBuffer *commandBuffer,
bool newCommandBuffer); bool newCommandBuffer);
void syncDirtyAttrib(ContextVk *contextVk, angle::Result syncDirtyAttrib(ContextVk *contextVk,
const gl::VertexAttribute &attrib, const gl::VertexAttribute &attrib,
const gl::VertexBinding &binding, const gl::VertexBinding &binding,
size_t attribIndex); size_t attribIndex);
gl::AttribArray<VkBuffer> mCurrentArrayBufferHandles; gl::AttribArray<VkBuffer> mCurrentArrayBufferHandles;
gl::AttribArray<VkDeviceSize> mCurrentArrayBufferOffsets; gl::AttribArray<VkDeviceSize> mCurrentArrayBufferOffsets;
gl::AttribArray<vk::CommandGraphResource *> mCurrentArrayBufferResources; gl::AttribArray<vk::CommandGraphResource *> mCurrentArrayBufferResources;
gl::AttribArray<const vk::Format *> mCurrentArrayBufferFormats; gl::AttribArray<const vk::Format *> mCurrentArrayBufferFormats;
gl::AttribArray<GLuint> mCurrentArrayBufferStrides; gl::AttribArray<GLuint> mCurrentArrayBufferStrides;
gl::AttribArray<vk::DynamicBuffer> mCurrentArrayBufferConversion;
gl::AttribArray<bool> mCurrentArrayBufferConversionCanRelease;
VkBuffer mCurrentElementArrayBufferHandle; VkBuffer mCurrentElementArrayBufferHandle;
VkDeviceSize mCurrentElementArrayBufferOffset; VkDeviceSize mCurrentElementArrayBufferOffset;
vk::CommandGraphResource *mCurrentElementArrayBufferResource; vk::CommandGraphResource *mCurrentElementArrayBufferResource;
......
...@@ -216,36 +216,6 @@ ...@@ -216,36 +216,6 @@
2606 VULKAN ANDROID : dEQP-GLES2.functional.debug_marker.random = SKIP 2606 VULKAN ANDROID : dEQP-GLES2.functional.debug_marker.random = SKIP
2606 VULKAN ANDROID : dEQP-GLES2.functional.debug_marker.supported = SKIP 2606 VULKAN ANDROID : dEQP-GLES2.functional.debug_marker.supported = SKIP
2609 VULKAN ANDROID : dEQP-GLES2.functional.texture.mipmap.cube.generate.* = SKIP 2609 VULKAN ANDROID : dEQP-GLES2.functional.texture.mipmap.cube.generate.* = 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.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
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_17_17_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_17_2_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_17_32_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_32_17_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_32_2_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_32_32_byte* = SKIP
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.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
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_32_short* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_3_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_4_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_4_short* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_6_short* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_8_short* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_0_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_0_short* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_17_byte* = SKIP
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_2_byte* = SKIP
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.red_unsigned_byte = FAIL
2567 GLES ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.rg_unsigned_byte = FAIL 2567 GLES ANDROID : dEQP-GLES2.functional.fbo.completeness.renderable.texture.depth.rg_unsigned_byte = FAIL
...@@ -263,9 +233,6 @@ ...@@ -263,9 +233,6 @@
2601 VULKAN : dEQP-GLES2.functional.clipping.* = SKIP 2601 VULKAN : dEQP-GLES2.functional.clipping.* = SKIP
2353 VULKAN : dEQP-GLES2.functional.polygon_offset.* = SKIP 2353 VULKAN : dEQP-GLES2.functional.polygon_offset.* = SKIP
// Random draw tests often require non-float vertex data.
2405 VULKAN : dEQP-GLES2.functional.draw.random.* = SKIP
// fixed format vertex data // fixed format vertex data
2405 VULKAN : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.input_types.3_byte2_vec2_byte2_vec2_fixed* = SKIP 2405 VULKAN : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.input_types.3_byte2_vec2_byte2_vec2_fixed* = SKIP
2405 VULKAN : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.input_types.3_byte2_vec2_fixed* = SKIP 2405 VULKAN : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.input_types.3_byte2_vec2_fixed* = SKIP
...@@ -302,46 +269,39 @@ ...@@ -302,46 +269,39 @@
2405 VULKAN : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_0_fixed* = SKIP 2405 VULKAN : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_0_fixed* = SKIP
2405 VULKAN : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_fixed* = SKIP 2405 VULKAN : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_fixed* = SKIP
2405 VULKAN : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_8_fixed* = SKIP 2405 VULKAN : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_8_fixed* = SKIP
2405 VULKAN : dEQP-GLES2.functional.draw.random.9 = SKIP
2405 VULKAN : dEQP-GLES2.functional.draw.random.28 = SKIP
2405 VULKAN : dEQP-GLES2.functional.draw.random.38 = SKIP
2405 VULKAN : dEQP-GLES2.functional.draw.random.39 = SKIP
2405 VULKAN : dEQP-GLES2.functional.draw.random.42 = SKIP
2405 VULKAN : dEQP-GLES2.functional.draw.random.56 = SKIP
2405 VULKAN : dEQP-GLES2.functional.draw.random.59 = SKIP
2405 VULKAN : dEQP-GLES2.functional.draw.random.61 = SKIP
// Vulkan AMD Windows specific failures // Vulkan AMD Windows specific failures
2602 VULKAN WIN AMD : dEQP-GLES2.functional.buffer.write.* = SKIP 2602 VULKAN WIN AMD : dEQP-GLES2.functional.buffer.write.* = SKIP
// TODO(fjhenigman): Try these again once vertex format support is farther along. // TODO(fjhenigman): Figure out why these don't work.
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_32_float* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.draw.random.14 = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_float* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.draw.random.30 = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.draw.random.41 = SKIP
// TODO(fjhenigman): Try these again once vertex format support is farther along.
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.first.float_first24* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.first.float_first6* = SKIP
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
// 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
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_0_float2_17* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_0_float2_32_float2_17 = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_0_float2_8_float2_17 = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_17* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_32_float2_0_float2_17 = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_32_float2_17* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_32_float2_32_float2_17 = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_32_float2_8_float2_17 = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_8_float2_0_float2_17 = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_8_float2_17* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_8_float2_32_float2_17 = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.multiple_attributes.stride.3_float2_8_float2_8_float2_17 = SKIP
// TODO(fjhenigman): Try these again once vertex format support is farther along.
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.first.byte_first* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.first.byte_first* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.first.float_first* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_1_17_byte* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_1_17_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_1_2_byte* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_1_2_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_1_32_byte* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_1_32_byte* = SKIP
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_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_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.offset.buffer_17_32_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_32_17_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_32_32_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_32_32_float* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_4_17_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_4_32_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_4_32_float* = 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_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_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_32_float* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_32_short* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_32_short* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_3_byte* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_3_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_6_short* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_6_short* = SKIP
...@@ -349,14 +309,8 @@ ...@@ -349,14 +309,8 @@
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_0_short* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_0_short* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_17_byte* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_17_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_byte* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_float* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_short* = SKIP 2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.usages.buffer_0_32_short* = SKIP
// Failures because of unsupported vertex formats on Android.
2405 VULKAN ANDROID : dEQP-GLES2.functional.buffer.write.* = FAIL
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_byte3_normalized_vec4_dynamic_draw_quads_1 = FAIL
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_byte3_normalized_vec4_dynamic_draw_quads_256 = FAIL
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_unsigned_byte3_normalized_vec4_dynamic_draw_quads_1 = FAIL
2405 VULKAN ANDROID : dEQP-GLES2.functional.vertex_arrays.single_attribute.normalize.user_ptr_0_0_unsigned_byte3_normalized_vec4_dynamic_draw_quads_256 = FAIL
// Failing on the Pixel 2. // Failing on the Pixel 2.
2727 VULKAN ANDROID : dEQP-GLES2.functional.shaders.builtin_variable.pointcoord = FAIL 2727 VULKAN ANDROID : dEQP-GLES2.functional.shaders.builtin_variable.pointcoord = FAIL
...@@ -396,17 +396,18 @@ void AttributeLayoutTest::GetTestCases(void) ...@@ -396,17 +396,18 @@ void AttributeLayoutTest::GetTestCases(void)
if (IsVulkan()) if (IsVulkan())
{ {
std::cout << "cases skipped on Vulkan: fixed or non-normalized byte/short data, non-zero " std::cout << "cases skipped on Vulkan: fixed format vertex data" << std::endl;
"buffer offsets" mTestCases.push_back({});
<< std::endl; mTestCases.push_back({});
return;
} }
else
{
// 10. one buffer, sequential
mTestCases.push_back({Fixed(B0, 0, 8, mCoord), Float(B0, 96, 12, mColor)});
// 10. one buffer, sequential // 11. one buffer, interleaved
mTestCases.push_back({Fixed(B0, 0, 8, mCoord), Float(B0, 96, 12, mColor)}); mTestCases.push_back({Fixed(B0, 0, 20, mCoord), Float(B0, 8, 20, mColor)});
}
// 11. one buffer, interleaved
mTestCases.push_back({Fixed(B0, 0, 20, mCoord), Float(B0, 8, 20, mColor)});
// 12. memory and buffer, float and integer // 12. memory and buffer, float and integer
mTestCases.push_back({Float(M0, 0, 8, mCoord), SByte(B0, 0, 12, mColor)}); mTestCases.push_back({Float(M0, 0, 8, mCoord), SByte(B0, 0, 12, mColor)});
......
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