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) ...@@ -31,6 +31,11 @@ void BufferVk::destroy(const gl::Context *context)
ContextVk *contextVk = GetImplAs<ContextVk>(context); ContextVk *contextVk = GetImplAs<ContextVk>(context);
RendererVk *renderer = contextVk->getRenderer(); RendererVk *renderer = contextVk->getRenderer();
release(renderer);
}
void BufferVk::release(RendererVk *renderer)
{
renderer->releaseResource(*this, &mBuffer); renderer->releaseResource(*this, &mBuffer);
renderer->releaseResource(*this, &mBufferMemory); renderer->releaseResource(*this, &mBufferMemory);
} }
...@@ -46,6 +51,9 @@ gl::Error BufferVk::setData(const gl::Context *context, ...@@ -46,6 +51,9 @@ gl::Error BufferVk::setData(const gl::Context *context,
if (size > mCurrentRequiredSize) 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 // TODO(jmadill): Proper usage bit implementation. Likely will involve multiple backing
// buffers like in D3D11. // buffers like in D3D11.
VkBufferCreateInfo createInfo; VkBufferCreateInfo createInfo;
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
namespace rx namespace rx
{ {
class RendererVk;
class BufferVk : public BufferImpl, public ResourceVk class BufferVk : public BufferImpl, public ResourceVk
{ {
...@@ -57,6 +58,7 @@ class BufferVk : public BufferImpl, public ResourceVk ...@@ -57,6 +58,7 @@ class BufferVk : public BufferImpl, public ResourceVk
private: private:
vk::Error setDataImpl(VkDevice device, const uint8_t *data, size_t size, size_t offset); vk::Error setDataImpl(VkDevice device, const uint8_t *data, size_t size, size_t offset);
void release(RendererVk *renderer);
vk::Buffer mBuffer; vk::Buffer mBuffer;
vk::DeviceMemory mBufferMemory; vk::DeviceMemory mBufferMemory;
......
...@@ -806,6 +806,32 @@ TEST_P(SimpleStateChangeTest, DeleteBufferInUse) ...@@ -806,6 +806,32 @@ TEST_P(SimpleStateChangeTest, DeleteBufferInUse)
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); 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 } // anonymous namespace
ANGLE_INSTANTIATE_TEST(StateChangeTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL()); 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