Commit a9ab0f37 by Luc Ferron Committed by Commit Bot

Vulkan: Fix DynamicBuffer usages, need to use specific alignment

The alignment used to allocate VkBuffers in the VkBuffer needs to be at least the size of the nonCoherentAtomSize defined in the limits of the VkDevicePhysicalProperties. The latest roll of the vulkan-validation-layers added that check and caused a bunch of errors. This is fixing them. Bug: angleproject:2565 Change-Id: Ia2ad506dce7966adb6220c52ea891903922c47d0 Reviewed-on: https://chromium-review.googlesource.com/1064950 Commit-Queue: Luc Ferron <lucferron@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent dcda0e50
......@@ -675,7 +675,7 @@ FramebufferImpl *ContextVk::createFramebuffer(const gl::FramebufferState &state)
TextureImpl *ContextVk::createTexture(const gl::TextureState &state)
{
return new TextureVk(state);
return new TextureVk(state, mRenderer);
}
RenderbufferImpl *ContextVk::createRenderbuffer(const gl::RenderbufferState &state)
......@@ -690,7 +690,7 @@ BufferImpl *ContextVk::createBuffer(const gl::BufferState &state)
VertexArrayImpl *ContextVk::createVertexArray(const gl::VertexArrayState &state)
{
return new VertexArrayVk(state);
return new VertexArrayVk(state, mRenderer);
}
QueryImpl *ContextVk::createQuery(gl::QueryType type)
......
......@@ -348,7 +348,7 @@ gl::Error ProgramVk::initDefaultUniformBlocks(const gl::Context *glContext)
size_t minAlignment = static_cast<size_t>(
renderer->getPhysicalDeviceProperties().limits.minUniformBufferOffsetAlignment);
mDefaultUniformBlocks[shaderType].storage.init(minAlignment);
mDefaultUniformBlocks[shaderType].storage.init(minAlignment, renderer);
// Initialize uniform buffer memory to zero by default.
mDefaultUniformBlocks[shaderType].uniformData.fill(0);
......
......@@ -62,11 +62,12 @@ constexpr size_t kStagingBufferSize = 1024 * 16;
} // anonymous namespace
// StagingStorage implementation.
PixelBuffer::PixelBuffer() : mStagingBuffer(kStagingBufferFlags, kStagingBufferSize)
PixelBuffer::PixelBuffer(RendererVk *renderer)
: mStagingBuffer(kStagingBufferFlags, kStagingBufferSize)
{
// vkCmdCopyBufferToImage must have an offset that is a multiple of 4.
// https://www.khronos.org/registry/vulkan/specs/1.0/man/html/VkBufferImageCopy.html
mStagingBuffer.init(4);
mStagingBuffer.init(4, renderer);
}
PixelBuffer::~PixelBuffer()
......@@ -287,7 +288,8 @@ PixelBuffer::SubresourceUpdate::SubresourceUpdate(VkBuffer bufferHandleIn,
PixelBuffer::SubresourceUpdate::SubresourceUpdate(const SubresourceUpdate &other) = default;
// TextureVk implementation.
TextureVk::TextureVk(const gl::TextureState &state) : TextureImpl(state)
TextureVk::TextureVk(const gl::TextureState &state, RendererVk *renderer)
: TextureImpl(state), mPixelBuffer(renderer)
{
mRenderTarget.image = &mImage;
mRenderTarget.imageView = &mBaseLevelImageView;
......
......@@ -21,7 +21,7 @@ namespace rx
class PixelBuffer final : angle::NonCopyable
{
public:
PixelBuffer();
PixelBuffer(RendererVk *renderer);
~PixelBuffer();
void release(RendererVk *renderer);
......@@ -68,7 +68,7 @@ class PixelBuffer final : angle::NonCopyable
class TextureVk : public TextureImpl, public vk::CommandGraphResource
{
public:
TextureVk(const gl::TextureState &state);
TextureVk(const gl::TextureState &state, RendererVk *renderer);
~TextureVk() override;
gl::Error onDestroy(const gl::Context *context) override;
......
......@@ -26,7 +26,7 @@ constexpr size_t kDynamicVertexDataSize = 1024 * 1024;
constexpr size_t kDynamicIndexDataSize = 1024 * 8;
} // anonymous namespace
VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state)
VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state, RendererVk *renderer)
: VertexArrayImpl(state),
mCurrentArrayBufferHandles{},
mCurrentArrayBufferOffsets{},
......@@ -36,6 +36,7 @@ VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state)
mCurrentElementArrayBufferResource(nullptr),
mDynamicVertexData(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, kDynamicVertexDataSize),
mDynamicIndexData(VK_BUFFER_USAGE_INDEX_BUFFER_BIT, kDynamicIndexDataSize),
mLineLoopHelper(renderer),
mDirtyLineLoopTranslation(true),
mVertexBuffersDirty(false),
mIndexBufferDirty(false)
......@@ -47,8 +48,8 @@ VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state)
mPackedInputBindings.fill({0, 0});
mPackedInputAttributes.fill({0, 0, 0});
mDynamicVertexData.init(1);
mDynamicIndexData.init(1);
mDynamicVertexData.init(1, renderer);
mDynamicIndexData.init(1, renderer);
}
VertexArrayVk::~VertexArrayVk()
......
......@@ -32,7 +32,7 @@ class DynamicBuffer;
class VertexArrayVk : public VertexArrayImpl
{
public:
VertexArrayVk(const gl::VertexArrayState &state);
VertexArrayVk(const gl::VertexArrayState &state, RendererVk *renderer);
~VertexArrayVk() override;
void destroy(const gl::Context *context) override;
......
......@@ -105,10 +105,12 @@ DynamicBuffer::DynamicBuffer(VkBufferUsageFlags usage, size_t minSize)
{
}
void DynamicBuffer::init(size_t alignment)
void DynamicBuffer::init(size_t alignment, RendererVk *renderer)
{
ASSERT(alignment > 0);
mAlignment = alignment;
mAlignment = std::max(
alignment,
static_cast<size_t>(renderer->getPhysicalDeviceProperties().limits.nonCoherentAtomSize));
}
DynamicBuffer::~DynamicBuffer()
......@@ -351,7 +353,7 @@ void DynamicDescriptorPool::setMaxSetsPerPoolForTesting(uint32_t maxSetsPerPool)
}
// LineLoopHelper implementation.
LineLoopHelper::LineLoopHelper()
LineLoopHelper::LineLoopHelper(RendererVk *renderer)
: mDynamicIndexBuffer(kLineLoopDynamicBufferUsage, kLineLoopDynamicBufferMinSize)
{
// We need to use an alignment of the maximum size we're going to allocate, which is
......@@ -359,7 +361,7 @@ LineLoopHelper::LineLoopHelper()
// can vary in size. According to the Vulkan spec, when calling vkCmdBindIndexBuffer: 'The
// sum of offset and the address of the range of VkDeviceMemory object that is backing buffer,
// must be a multiple of the type indicated by indexType'.
mDynamicIndexBuffer.init(sizeof(uint32_t));
mDynamicIndexBuffer.init(sizeof(uint32_t), renderer);
}
LineLoopHelper::~LineLoopHelper() = default;
......
......@@ -35,7 +35,7 @@ class DynamicBuffer : angle::NonCopyable
~DynamicBuffer();
// Init is called after the buffer creation so that the alignment can be specified later.
void init(size_t alignment);
void init(size_t alignment, RendererVk *renderer);
bool valid();
......@@ -129,7 +129,7 @@ class DynamicDescriptorPool final : angle::NonCopyable
class LineLoopHelper final : public vk::CommandGraphResource
{
public:
LineLoopHelper();
LineLoopHelper(RendererVk *renderer);
~LineLoopHelper();
gl::Error getIndexBufferForDrawArrays(RendererVk *renderer,
......
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