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,
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(mBufferMemory.getHandle() != VK_NULL_HANDLE);
VkDevice device = vk::GetImpl(context)->getDevice();
mBufferMemory.unmap(device);
mBufferMemory.unmap(contextVk->getDevice());
return gl::NoError();
return angle::Result::Continue();
}
gl::Error BufferVk::getIndexRange(const gl::Context *context,
......
......@@ -59,6 +59,7 @@ class BufferVk : public BufferImpl, public vk::CommandGraphResource
const vk::Buffer &getVkBuffer() const;
angle::Result mapImpl(ContextVk *contextVk, void **mapPtr);
angle::Result unmapImpl(ContextVk *contextVk);
private:
angle::Result setDataImpl(ContextVk *contextVk,
......
......@@ -25,8 +25,18 @@ namespace
{
constexpr size_t kDynamicVertexDataSize = 1024 * 1024;
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
#define INIT \
{ \
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, 1024 * 8 \
}
VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state, RendererVk *renderer)
: VertexArrayImpl(state),
mCurrentArrayBufferHandles{},
......@@ -34,6 +44,11 @@ VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state, RendererVk *rend
mCurrentArrayBufferResources{},
mCurrentArrayBufferFormats{},
mCurrentArrayBufferStrides{},
mCurrentArrayBufferConversion{{
INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT,
INIT,
}},
mCurrentArrayBufferConversionCanRelease{},
mCurrentElementArrayBufferHandle(VK_NULL_HANDLE),
mCurrentElementArrayBufferOffset(0),
mCurrentElementArrayBufferResource(nullptr),
......@@ -53,6 +68,10 @@ VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state, RendererVk *rend
mPackedInputBindings.fill({0, 0});
mPackedInputAttributes.fill({0, 0, 0});
for (vk::DynamicBuffer &buffer : mCurrentArrayBufferConversion)
{
buffer.init(1, renderer);
}
mDynamicVertexData.init(1, renderer);
mDynamicIndexData.init(1, renderer);
mTranslatedByteIndexData.init(1, renderer);
......@@ -65,6 +84,10 @@ VertexArrayVk::~VertexArrayVk()
void VertexArrayVk::destroy(const gl::Context *context)
{
VkDevice device = vk::GetImpl(context)->getRenderer()->getDevice();
for (vk::DynamicBuffer &buffer : mCurrentArrayBufferConversion)
{
buffer.destroy(device);
}
mDynamicVertexData.destroy(device);
mDynamicIndexData.destroy(device);
mTranslatedByteIndexData.destroy(device);
......@@ -147,20 +170,83 @@ angle::Result VertexArrayVk::streamIndexData(ContextVk *contextVk,
return angle::Result::Continue();
}
#define ANGLE_VERTEX_DIRTY_ATTRIB_FUNC(INDEX) \
case gl::VertexArray::DIRTY_BIT_ATTRIB_0 + INDEX: \
syncDirtyAttrib(contextVk, attribs[INDEX], bindings[attribs[INDEX].bindingIndex], INDEX); \
invalidatePipeline = true; \
// We assume the buffer is completely full of the same kind of data and convert
// and/or align it as we copy it to a DynamicBuffer. The assumption could be wrong
// but the alternative of copying it piecemeal on each draw would have a lot more
// 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;
#define ANGLE_VERTEX_DIRTY_BINDING_FUNC(INDEX) \
case gl::VertexArray::DIRTY_BIT_BINDING_0 + INDEX: \
syncDirtyAttrib(contextVk, attribs[INDEX], bindings[attribs[INDEX].bindingIndex], INDEX); \
invalidatePipeline = true; \
#define ANGLE_VERTEX_DIRTY_BINDING_FUNC(INDEX) \
case gl::VertexArray::DIRTY_BIT_BINDING_0 + INDEX: \
ANGLE_TRY(syncDirtyAttrib(contextVk, attribs[INDEX], \
bindings[attribs[INDEX].bindingIndex], INDEX)); \
invalidatePipeline = true; \
break;
#define ANGLE_VERTEX_DIRTY_BUFFER_DATA_FUNC(INDEX) \
case gl::VertexArray::DIRTY_BIT_BUFFER_DATA_0 + INDEX: \
#define ANGLE_VERTEX_DIRTY_BUFFER_DATA_FUNC(INDEX) \
case gl::VertexArray::DIRTY_BIT_BUFFER_DATA_0 + INDEX: \
ANGLE_TRY(syncDirtyAttrib(contextVk, attribs[INDEX], \
bindings[attribs[INDEX].bindingIndex], INDEX)); \
break;
gl::Error VertexArrayVk::syncState(const gl::Context *context,
......@@ -172,7 +258,6 @@ gl::Error VertexArrayVk::syncState(const gl::Context *context,
bool invalidatePipeline = false;
// Invalidate current pipeline.
ContextVk *contextVk = vk::GetImpl(context);
// 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,
return gl::NoError();
}
void VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
const gl::VertexAttribute &attrib,
const gl::VertexBinding &binding,
size_t attribIndex)
angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
const gl::VertexAttribute &attrib,
const gl::VertexBinding &binding,
size_t attribIndex)
{
// Invalidate the input description for pipelines.
mDirtyPackedInputs.set(attribIndex);
RendererVk *renderer = contextVk->getRenderer();
bool releaseConversion = true;
if (attrib.enabled)
{
gl::Buffer *bufferGL = binding.getBuffer().get();
mCurrentArrayBufferFormats[attribIndex] = &renderer->getFormat(GetVertexFormatID(attrib));
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.
// anglebug.com/2405
UNIMPLEMENTED();
}
ANGLE_TRY(convertVertexBuffer(contextVk, bufferVk, binding, attribIndex));
BufferVk *bufferVk = vk::GetImpl(bufferGL);
mCurrentArrayBufferResources[attribIndex] = bufferVk;
mCurrentArrayBufferHandles[attribIndex] = bufferVk->getVkBuffer().getHandle();
mCurrentArrayBufferOffsets[attribIndex] = binding.getOffset();
mCurrentArrayBufferStrides[attribIndex] = binding.getStride();
mCurrentArrayBufferConversion[attribIndex].releaseRetainedBuffers(renderer);
mCurrentArrayBufferResources[attribIndex] = nullptr;
releaseConversion = false;
}
else
{
mCurrentArrayBufferResources[attribIndex] = bufferVk;
mCurrentArrayBufferHandles[attribIndex] = bufferVk->getVkBuffer().getHandle();
mCurrentArrayBufferOffsets[attribIndex] = binding.getOffset();
mCurrentArrayBufferStrides[attribIndex] = binding.getStride();
}
}
else
{
......@@ -268,8 +362,7 @@ void VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
mCurrentArrayBufferHandles[attribIndex] = VK_NULL_HANDLE;
mCurrentArrayBufferOffsets[attribIndex] = 0;
mCurrentArrayBufferStrides[attribIndex] =
angle::Format::Get(mCurrentArrayBufferFormats[attribIndex]->bufferFormatID)
.pixelBytes;
mCurrentArrayBufferFormats[attribIndex]->bufferFormat().pixelBytes;
}
}
else
......@@ -284,6 +377,11 @@ void VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
mCurrentArrayBufferFormats[attribIndex] =
&renderer->getFormat(angle::FormatID::R32G32B32A32_FLOAT);
}
if (releaseConversion)
ensureConversionReleased(renderer, attribIndex);
return angle::Result::Continue();
}
void VertexArrayVk::updateArrayBufferReadDependencies(vk::CommandGraphResource *drawFramebuffer,
......
......@@ -26,7 +26,6 @@ class BufferVk;
namespace vk
{
class CommandGraphResource;
class DynamicBuffer;
} // namespace vk
class VertexArrayVk : public VertexArrayImpl
......@@ -88,6 +87,11 @@ class VertexArrayVk : public VertexArrayImpl
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,
const gl::DrawCallParams &drawCallParams,
......@@ -98,16 +102,18 @@ class VertexArrayVk : public VertexArrayImpl
vk::CommandBuffer *commandBuffer,
bool newCommandBuffer);
void syncDirtyAttrib(ContextVk *contextVk,
const gl::VertexAttribute &attrib,
const gl::VertexBinding &binding,
size_t attribIndex);
angle::Result syncDirtyAttrib(ContextVk *contextVk,
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;
gl::AttribArray<vk::DynamicBuffer> mCurrentArrayBufferConversion;
gl::AttribArray<bool> mCurrentArrayBufferConversionCanRelease;
VkBuffer mCurrentElementArrayBufferHandle;
VkDeviceSize mCurrentElementArrayBufferOffset;
vk::CommandGraphResource *mCurrentElementArrayBufferResource;
......
......@@ -216,36 +216,6 @@
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.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.rg_unsigned_byte = FAIL
......@@ -263,9 +233,6 @@
2601 VULKAN : dEQP-GLES2.functional.clipping.* = 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
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
......@@ -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_32_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
2602 VULKAN WIN AMD : dEQP-GLES2.functional.buffer.write.* = SKIP
// TODO(fjhenigman): Try these again once vertex format support is farther along.
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.usages.buffer_0_32_float* = 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.
// TODO(fjhenigman): Figure out why these don't work.
2405 VULKAN WIN AMD : dEQP-GLES2.functional.draw.random.14 = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.draw.random.30 = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.draw.random.41 = 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_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_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.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_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_3_byte* = SKIP
2405 VULKAN WIN AMD : dEQP-GLES2.functional.vertex_arrays.single_attribute.strides.buffer_0_6_short* = SKIP
......@@ -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_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_float* = 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.
2727 VULKAN ANDROID : dEQP-GLES2.functional.shaders.builtin_variable.pointcoord = FAIL
......@@ -396,17 +396,18 @@ void AttributeLayoutTest::GetTestCases(void)
if (IsVulkan())
{
std::cout << "cases skipped on Vulkan: fixed or non-normalized byte/short data, non-zero "
"buffer offsets"
<< std::endl;
return;
std::cout << "cases skipped on Vulkan: fixed format vertex data" << std::endl;
mTestCases.push_back({});
mTestCases.push_back({});
}
else
{
// 10. one buffer, sequential
mTestCases.push_back({Fixed(B0, 0, 8, mCoord), Float(B0, 96, 12, mColor)});
// 10. one buffer, sequential
mTestCases.push_back({Fixed(B0, 0, 8, mCoord), Float(B0, 96, 12, mColor)});
// 11. one buffer, interleaved
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
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