Commit 8724e254 by Jamie Madill Committed by Commit Bot

Vulkan: Fix re-creating buffer storage.

BUG=angleproject:2200 Change-Id: Id60e857517cce9c0bfa272e4e6a399f236e395f7 Reviewed-on: https://chromium-review.googlesource.com/741548Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 096f278e
......@@ -31,6 +31,11 @@ void BufferVk::destroy(const gl::Context *context)
ContextVk *contextVk = GetImplAs<ContextVk>(context);
RendererVk *renderer = contextVk->getRenderer();
release(renderer);
}
void BufferVk::release(RendererVk *renderer)
{
renderer->releaseResource(*this, &mBuffer);
renderer->releaseResource(*this, &mBufferMemory);
}
......@@ -46,6 +51,9 @@ gl::Error BufferVk::setData(const gl::Context *context,
if (size > mCurrentRequiredSize)
{
// Release and re-create the memory and buffer.
release(contextVk->getRenderer());
// TODO(jmadill): Proper usage bit implementation. Likely will involve multiple backing
// buffers like in D3D11.
VkBufferCreateInfo createInfo;
......
......@@ -15,6 +15,7 @@
namespace rx
{
class RendererVk;
class BufferVk : public BufferImpl, public ResourceVk
{
......@@ -57,6 +58,7 @@ class BufferVk : public BufferImpl, public ResourceVk
private:
vk::Error setDataImpl(VkDevice device, const uint8_t *data, size_t size, size_t offset);
void release(RendererVk *renderer);
vk::Buffer mBuffer;
vk::DeviceMemory mBufferMemory;
......
......@@ -806,6 +806,32 @@ TEST_P(SimpleStateChangeTest, DeleteBufferInUse)
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
}
// Tests that resizing a Buffer during a draw works as expected.
TEST_P(SimpleStateChangeTest, RedefineBufferInUse)
{
std::vector<GLColor> redColorData(6, GLColor::red);
GLBuffer buffer;
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLColor) * redColorData.size(), redColorData.data(),
GL_STATIC_DRAW);
// Trigger a pull from the buffer.
simpleDrawWithBuffer(&buffer);
// Redefine the buffer that's in-flight.
std::vector<GLColor> greenColorData(1024, GLColor::green);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLColor) * greenColorData.size(), greenColorData.data(),
GL_STATIC_DRAW);
// Trigger the flush and verify the first draw worked.
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
// Draw again and verify the new data is correct.
simpleDrawWithBuffer(&buffer);
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
}
} // anonymous namespace
ANGLE_INSTANTIATE_TEST(StateChangeTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL());
......
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