Commit 3f01e6c2 by Jamie Madill Committed by Commit Bot

Return pointers from check*Allocation.

This avoids the need to consult the resource maps twice per bind. It improves performance in applications which call Bind* often. BUG=angleproject:1333 Change-Id: I7b733cc89e50e24a2e38a2eb2dc7fd658d612e27 Reviewed-on: https://chromium-review.googlesource.com/331386Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarZhenyao Mo <zmo@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 7d8585b8
......@@ -692,23 +692,21 @@ bool Context::isSampler(GLuint samplerName) const
return mResourceManager->isSampler(samplerName);
}
void Context::bindArrayBuffer(unsigned int buffer)
void Context::bindArrayBuffer(GLuint bufferHandle)
{
mResourceManager->checkBufferAllocation(buffer);
mState.setArrayBufferBinding(getBuffer(buffer));
Buffer *buffer = mResourceManager->checkBufferAllocation(bufferHandle);
mState.setArrayBufferBinding(buffer);
}
void Context::bindElementArrayBuffer(unsigned int buffer)
void Context::bindElementArrayBuffer(GLuint bufferHandle)
{
mResourceManager->checkBufferAllocation(buffer);
mState.getVertexArray()->setElementArrayBuffer(getBuffer(buffer));
Buffer *buffer = mResourceManager->checkBufferAllocation(bufferHandle);
mState.getVertexArray()->setElementArrayBuffer(buffer);
}
void Context::bindTexture(GLenum target, GLuint handle)
{
Texture *texture = NULL;
Texture *texture = nullptr;
if (handle == 0)
{
......@@ -716,12 +714,10 @@ void Context::bindTexture(GLenum target, GLuint handle)
}
else
{
mResourceManager->checkTextureAllocation(handle, target);
texture = getTexture(handle);
texture = mResourceManager->checkTextureAllocation(handle, target);
}
ASSERT(texture);
mState.setSamplerTexture(target, texture);
}
......@@ -737,82 +733,77 @@ void Context::bindDrawFramebuffer(GLuint framebufferHandle)
mState.setDrawFramebufferBinding(framebuffer);
}
void Context::bindRenderbuffer(GLuint renderbuffer)
void Context::bindRenderbuffer(GLuint renderbufferHandle)
{
mResourceManager->checkRenderbufferAllocation(renderbuffer);
mState.setRenderbufferBinding(getRenderbuffer(renderbuffer));
Renderbuffer *renderbuffer = mResourceManager->checkRenderbufferAllocation(renderbufferHandle);
mState.setRenderbufferBinding(renderbuffer);
}
void Context::bindVertexArray(GLuint vertexArray)
void Context::bindVertexArray(GLuint vertexArrayHandle)
{
checkVertexArrayAllocation(vertexArray);
mState.setVertexArrayBinding(getVertexArray(vertexArray));
VertexArray *vertexArray = checkVertexArrayAllocation(vertexArrayHandle);
mState.setVertexArrayBinding(vertexArray);
}
void Context::bindSampler(GLuint textureUnit, GLuint sampler)
void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
{
ASSERT(textureUnit < mCaps.maxCombinedTextureImageUnits);
mResourceManager->checkSamplerAllocation(sampler);
mState.setSamplerBinding(textureUnit, getSampler(sampler));
Sampler *sampler = mResourceManager->checkSamplerAllocation(samplerHandle);
mState.setSamplerBinding(textureUnit, sampler);
}
void Context::bindGenericUniformBuffer(GLuint buffer)
void Context::bindGenericUniformBuffer(GLuint bufferHandle)
{
mResourceManager->checkBufferAllocation(buffer);
mState.setGenericUniformBufferBinding(getBuffer(buffer));
Buffer *buffer = mResourceManager->checkBufferAllocation(bufferHandle);
mState.setGenericUniformBufferBinding(buffer);
}
void Context::bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
void Context::bindIndexedUniformBuffer(GLuint bufferHandle,
GLuint index,
GLintptr offset,
GLsizeiptr size)
{
mResourceManager->checkBufferAllocation(buffer);
mState.setIndexedUniformBufferBinding(index, getBuffer(buffer), offset, size);
Buffer *buffer = mResourceManager->checkBufferAllocation(bufferHandle);
mState.setIndexedUniformBufferBinding(index, buffer, offset, size);
}
void Context::bindGenericTransformFeedbackBuffer(GLuint buffer)
void Context::bindGenericTransformFeedbackBuffer(GLuint bufferHandle)
{
mResourceManager->checkBufferAllocation(buffer);
mState.getCurrentTransformFeedback()->bindGenericBuffer(getBuffer(buffer));
Buffer *buffer = mResourceManager->checkBufferAllocation(bufferHandle);
mState.getCurrentTransformFeedback()->bindGenericBuffer(buffer);
}
void Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
void Context::bindIndexedTransformFeedbackBuffer(GLuint bufferHandle,
GLuint index,
GLintptr offset,
GLsizeiptr size)
{
mResourceManager->checkBufferAllocation(buffer);
mState.getCurrentTransformFeedback()->bindIndexedBuffer(index, getBuffer(buffer), offset, size);
Buffer *buffer = mResourceManager->checkBufferAllocation(bufferHandle);
mState.getCurrentTransformFeedback()->bindIndexedBuffer(index, buffer, offset, size);
}
void Context::bindCopyReadBuffer(GLuint buffer)
void Context::bindCopyReadBuffer(GLuint bufferHandle)
{
mResourceManager->checkBufferAllocation(buffer);
mState.setCopyReadBufferBinding(getBuffer(buffer));
Buffer *buffer = mResourceManager->checkBufferAllocation(bufferHandle);
mState.setCopyReadBufferBinding(buffer);
}
void Context::bindCopyWriteBuffer(GLuint buffer)
void Context::bindCopyWriteBuffer(GLuint bufferHandle)
{
mResourceManager->checkBufferAllocation(buffer);
mState.setCopyWriteBufferBinding(getBuffer(buffer));
Buffer *buffer = mResourceManager->checkBufferAllocation(bufferHandle);
mState.setCopyWriteBufferBinding(buffer);
}
void Context::bindPixelPackBuffer(GLuint buffer)
void Context::bindPixelPackBuffer(GLuint bufferHandle)
{
mResourceManager->checkBufferAllocation(buffer);
mState.setPixelPackBufferBinding(getBuffer(buffer));
Buffer *buffer = mResourceManager->checkBufferAllocation(bufferHandle);
mState.setPixelPackBufferBinding(buffer);
}
void Context::bindPixelUnpackBuffer(GLuint buffer)
void Context::bindPixelUnpackBuffer(GLuint bufferHandle)
{
mResourceManager->checkBufferAllocation(buffer);
mState.setPixelUnpackBufferBinding(getBuffer(buffer));
Buffer *buffer = mResourceManager->checkBufferAllocation(bufferHandle);
mState.setPixelUnpackBufferBinding(buffer);
}
void Context::useProgram(GLuint program)
......@@ -820,11 +811,11 @@ void Context::useProgram(GLuint program)
mState.setProgram(getProgram(program));
}
void Context::bindTransformFeedback(GLuint transformFeedback)
void Context::bindTransformFeedback(GLuint transformFeedbackHandle)
{
checkTransformFeedbackAllocation(transformFeedback);
mState.setTransformFeedbackBinding(getTransformFeedback(transformFeedback));
TransformFeedback *transformFeedback =
checkTransformFeedbackAllocation(transformFeedbackHandle);
mState.setTransformFeedbackBinding(transformFeedback);
}
Error Context::beginQuery(GLenum target, GLuint query)
......@@ -1734,27 +1725,31 @@ EGLenum Context::getRenderBuffer() const
}
}
void Context::checkVertexArrayAllocation(GLuint vertexArray)
VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
{
// Only called after a prior call to Gen.
if (!getVertexArray(vertexArray))
VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
if (!vertexArray)
{
VertexArray *vertexArrayObject =
new VertexArray(mRenderer, vertexArray, MAX_VERTEX_ATTRIBS);
mVertexArrayMap[vertexArray] = vertexArrayObject;
vertexArray = new VertexArray(mRenderer, vertexArrayHandle, MAX_VERTEX_ATTRIBS);
mVertexArrayMap[vertexArrayHandle] = vertexArray;
}
return vertexArray;
}
void Context::checkTransformFeedbackAllocation(GLuint transformFeedback)
TransformFeedback *Context::checkTransformFeedbackAllocation(GLuint transformFeedbackHandle)
{
// Only called after a prior call to Gen.
if (!getTransformFeedback(transformFeedback))
TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
if (!transformFeedback)
{
TransformFeedback *transformFeedbackObject =
new TransformFeedback(mRenderer->createTransformFeedback(), transformFeedback, mCaps);
transformFeedbackObject->addRef();
mTransformFeedbackMap[transformFeedback] = transformFeedbackObject;
transformFeedback = new TransformFeedback(mRenderer, transformFeedbackHandle, mCaps);
transformFeedback->addRef();
mTransformFeedbackMap[transformFeedbackHandle] = transformFeedback;
}
return transformFeedback;
}
Framebuffer *Context::checkFramebufferAllocation(GLuint framebuffer)
......
......@@ -108,24 +108,30 @@ class Context final : public ValidationContext
GLuint createVertexArray();
void deleteVertexArray(GLuint vertexArray);
void bindArrayBuffer(GLuint buffer);
void bindElementArrayBuffer(GLuint buffer);
void bindArrayBuffer(GLuint bufferHandle);
void bindElementArrayBuffer(GLuint bufferHandle);
void bindTexture(GLenum target, GLuint handle);
void bindReadFramebuffer(GLuint framebufferHandle);
void bindDrawFramebuffer(GLuint framebufferHandle);
void bindRenderbuffer(GLuint renderbuffer);
void bindVertexArray(GLuint vertexArray);
void bindSampler(GLuint textureUnit, GLuint sampler);
void bindGenericUniformBuffer(GLuint buffer);
void bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);
void bindGenericTransformFeedbackBuffer(GLuint buffer);
void bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);
void bindCopyReadBuffer(GLuint buffer);
void bindCopyWriteBuffer(GLuint buffer);
void bindPixelPackBuffer(GLuint buffer);
void bindPixelUnpackBuffer(GLuint buffer);
void bindRenderbuffer(GLuint renderbufferHandle);
void bindVertexArray(GLuint vertexArrayHandle);
void bindSampler(GLuint textureUnit, GLuint samplerHandle);
void bindGenericUniformBuffer(GLuint bufferHandle);
void bindIndexedUniformBuffer(GLuint bufferHandle,
GLuint index,
GLintptr offset,
GLsizeiptr size);
void bindGenericTransformFeedbackBuffer(GLuint bufferHandle);
void bindIndexedTransformFeedbackBuffer(GLuint bufferHandle,
GLuint index,
GLintptr offset,
GLsizeiptr size);
void bindCopyReadBuffer(GLuint bufferHandle);
void bindCopyWriteBuffer(GLuint bufferHandle);
void bindPixelPackBuffer(GLuint bufferHandle);
void bindPixelUnpackBuffer(GLuint bufferHandle);
void useProgram(GLuint program);
void bindTransformFeedback(GLuint transformFeedback);
void bindTransformFeedback(GLuint transformFeedbackHandle);
Error beginQuery(GLenum target, GLuint query);
Error endQuery(GLenum target);
......@@ -397,8 +403,8 @@ class Context final : public ValidationContext
void syncStateForTexImage();
void syncStateForClear();
void syncStateForBlit();
void checkVertexArrayAllocation(GLuint vertexArray);
void checkTransformFeedbackAllocation(GLuint transformFeedback);
VertexArray *checkVertexArrayAllocation(GLuint vertexArrayHandle);
TransformFeedback *checkTransformFeedbackAllocation(GLuint transformFeedback);
Framebuffer *checkFramebufferAllocation(GLuint framebufferHandle);
void detachBuffer(GLuint buffer);
......
......@@ -356,96 +356,117 @@ void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
mRenderbufferMap[handle] = buffer;
}
void ResourceManager::checkBufferAllocation(GLuint handle)
Buffer *ResourceManager::checkBufferAllocation(GLuint handle)
{
if (handle != 0)
if (handle == 0)
{
auto bufferMapIt = mBufferMap.find(handle);
bool handleAllocated = (bufferMapIt != mBufferMap.end());
return nullptr;
}
if (handleAllocated && bufferMapIt->second != nullptr)
{
return;
}
auto bufferMapIt = mBufferMap.find(handle);
bool handleAllocated = (bufferMapIt != mBufferMap.end());
Buffer *buffer = new Buffer(mFactory->createBuffer(), handle);
buffer->addRef();
if (handleAllocated && bufferMapIt->second != nullptr)
{
return bufferMapIt->second;
}
if (handleAllocated)
{
bufferMapIt->second = buffer;
}
else
{
mBufferHandleAllocator.reserve(handle);
mBufferMap[handle] = buffer;
}
Buffer *buffer = new Buffer(mFactory->createBuffer(), handle);
buffer->addRef();
if (handleAllocated)
{
bufferMapIt->second = buffer;
}
else
{
mBufferHandleAllocator.reserve(handle);
mBufferMap[handle] = buffer;
}
return buffer;
}
void ResourceManager::checkTextureAllocation(GLuint handle, GLenum type)
Texture *ResourceManager::checkTextureAllocation(GLuint handle, GLenum type)
{
if (handle != 0)
if (handle == 0)
{
auto textureMapIt = mTextureMap.find(handle);
bool handleAllocated = (textureMapIt != mTextureMap.end());
return nullptr;
}
if (handleAllocated && textureMapIt->second != nullptr)
{
return;
}
auto textureMapIt = mTextureMap.find(handle);
bool handleAllocated = (textureMapIt != mTextureMap.end());
Texture *texture = new Texture(mFactory->createTexture(type), handle, type);
texture->addRef();
if (handleAllocated && textureMapIt->second != nullptr)
{
return textureMapIt->second;
}
if (handleAllocated)
{
textureMapIt->second = texture;
}
else
{
mTextureHandleAllocator.reserve(handle);
mTextureMap[handle] = texture;
}
Texture *texture = new Texture(mFactory->createTexture(type), handle, type);
texture->addRef();
if (handleAllocated)
{
textureMapIt->second = texture;
}
else
{
mTextureHandleAllocator.reserve(handle);
mTextureMap[handle] = texture;
}
return texture;
}
void ResourceManager::checkRenderbufferAllocation(GLuint handle)
Renderbuffer *ResourceManager::checkRenderbufferAllocation(GLuint handle)
{
if (handle != 0)
if (handle == 0)
{
auto renderbufferMapIt = mRenderbufferMap.find(handle);
bool handleAllocated = (renderbufferMapIt != mRenderbufferMap.end());
return nullptr;
}
if (handleAllocated && renderbufferMapIt->second != nullptr)
{
return;
}
auto renderbufferMapIt = mRenderbufferMap.find(handle);
bool handleAllocated = (renderbufferMapIt != mRenderbufferMap.end());
Renderbuffer *renderbuffer = new Renderbuffer(mFactory->createRenderbuffer(), handle);
renderbuffer->addRef();
if (handleAllocated && renderbufferMapIt->second != nullptr)
{
return renderbufferMapIt->second;
}
if (handleAllocated)
{
renderbufferMapIt->second = renderbuffer;
}
else
{
mRenderbufferHandleAllocator.reserve(handle);
mRenderbufferMap[handle] = renderbuffer;
}
Renderbuffer *renderbuffer = new Renderbuffer(mFactory->createRenderbuffer(), handle);
renderbuffer->addRef();
if (handleAllocated)
{
renderbufferMapIt->second = renderbuffer;
}
else
{
mRenderbufferHandleAllocator.reserve(handle);
mRenderbufferMap[handle] = renderbuffer;
}
return renderbuffer;
}
void ResourceManager::checkSamplerAllocation(GLuint sampler)
Sampler *ResourceManager::checkSamplerAllocation(GLuint samplerHandle)
{
if (sampler != 0 && !getSampler(sampler))
// Samplers cannot be created via Bind
if (samplerHandle == 0)
{
Sampler *samplerObject = new Sampler(mFactory, sampler);
mSamplerMap[sampler] = samplerObject;
samplerObject->addRef();
// Samplers cannot be created via Bind
return nullptr;
}
Sampler *sampler = getSampler(samplerHandle);
if (!sampler)
{
sampler = new Sampler(mFactory, samplerHandle);
mSamplerMap[samplerHandle] = sampler;
sampler->addRef();
}
return sampler;
}
bool ResourceManager::isSampler(GLuint sampler)
......@@ -453,4 +474,4 @@ bool ResourceManager::isSampler(GLuint sampler)
return mSamplerMap.find(sampler) != mSamplerMap.end();
}
}
} // namespace gl
......@@ -69,10 +69,10 @@ class ResourceManager : angle::NonCopyable
void setRenderbuffer(GLuint handle, Renderbuffer *renderbuffer);
void checkBufferAllocation(GLuint handle);
void checkTextureAllocation(GLuint handle, GLenum type);
void checkRenderbufferAllocation(GLuint handle);
void checkSamplerAllocation(GLuint sampler);
Buffer *checkBufferAllocation(GLuint handle);
Texture *checkTextureAllocation(GLuint handle, GLenum type);
Renderbuffer *checkRenderbufferAllocation(GLuint handle);
Sampler *checkSamplerAllocation(GLuint samplerHandle);
bool isSampler(GLuint sampler);
......@@ -110,6 +110,6 @@ class ResourceManager : angle::NonCopyable
HandleAllocator mFenceSyncHandleAllocator;
};
}
} // namespace gl
#endif // LIBANGLE_RESOURCEMANAGER_H_
......@@ -8,14 +8,15 @@
#include "libANGLE/Buffer.h"
#include "libANGLE/Caps.h"
#include "libANGLE/renderer/ImplFactory.h"
#include "libANGLE/renderer/TransformFeedbackImpl.h"
namespace gl
{
TransformFeedback::TransformFeedback(rx::TransformFeedbackImpl *impl, GLuint id, const Caps &caps)
TransformFeedback::TransformFeedback(rx::ImplFactory *implFactory, GLuint id, const Caps &caps)
: RefCountObject(id),
mImplementation(impl),
mImplementation(implFactory->createTransformFeedback()),
mLabel(),
mActive(false),
mPrimitiveMode(GL_NONE),
......@@ -23,7 +24,7 @@ TransformFeedback::TransformFeedback(rx::TransformFeedbackImpl *impl, GLuint id,
mGenericBuffer(),
mIndexedBuffers(caps.maxTransformFeedbackSeparateAttributes)
{
ASSERT(impl != NULL);
ASSERT(mImplementation != nullptr);
}
TransformFeedback::~TransformFeedback()
......
......@@ -16,6 +16,7 @@
namespace rx
{
class ImplFactory;
class TransformFeedbackImpl;
}
......@@ -27,7 +28,7 @@ struct Caps;
class TransformFeedback final : public RefCountObject, public LabeledObject
{
public:
TransformFeedback(rx::TransformFeedbackImpl* impl, GLuint id, const Caps &caps);
TransformFeedback(rx::ImplFactory *implFactory, GLuint id, const Caps &caps);
virtual ~TransformFeedback();
void setLabel(const std::string &label) override;
......
......@@ -11,6 +11,7 @@
#include "libANGLE/TransformFeedback.h"
#include "libANGLE/renderer/BufferImpl_mock.h"
#include "libANGLE/renderer/TransformFeedbackImpl_mock.h"
#include "tests/angle_unittests_utils.h"
using ::testing::_;
using ::testing::Return;
......@@ -19,45 +20,51 @@ using ::testing::SetArgumentPointee;
namespace
{
class MockFactory : public rx::NullFactory
{
public:
MOCK_METHOD0(createTransformFeedback, rx::TransformFeedbackImpl *());
};
class TransformFeedbackTest : public testing::Test
{
protected:
virtual void SetUp()
TransformFeedbackTest() : mImpl(nullptr), mFeedback(nullptr) {}
void SetUp() override
{
mImpl = new rx::MockTransformFeedbackImpl;
EXPECT_CALL(mMockFactory, createTransformFeedback())
.WillOnce(Return(mImpl))
.RetiresOnSaturation();
// Set a reasonable number of tf attributes
mCaps.maxTransformFeedbackSeparateAttributes = 8;
mImpl = new rx::MockTransformFeedbackImpl;
EXPECT_CALL(*mImpl, destructor());
mFeedback = new gl::TransformFeedback(mImpl, 1, mCaps);
mFeedback = new gl::TransformFeedback(&mMockFactory, 1, mCaps);
mFeedback->addRef();
}
virtual void TearDown()
void TearDown() override
{
mFeedback->release();
if (mFeedback)
{
mFeedback->release();
}
// Only needed because the mock is leaked if bugs are present,
// which logs an error, but does not cause the test to fail.
// Ordinarily mocks are verified when destroyed.
testing::Mock::VerifyAndClear(mImpl);
}
MockFactory mMockFactory;
rx::MockTransformFeedbackImpl* mImpl;
gl::TransformFeedback* mFeedback;
gl::Caps mCaps;
};
TEST_F(TransformFeedbackTest, DestructionDeletesImpl)
{
rx::MockTransformFeedbackImpl* impl = new rx::MockTransformFeedbackImpl;
EXPECT_CALL(*impl, destructor()).Times(1).RetiresOnSaturation();
gl::TransformFeedback* feedback = new gl::TransformFeedback(impl, 1, mCaps);
feedback->addRef();
feedback->release();
// Only needed because the mock is leaked if bugs are present,
// which logs an error, but does not cause the test to fail.
// Ordinarily mocks are verified when destroyed.
testing::Mock::VerifyAndClear(impl);
}
TEST_F(TransformFeedbackTest, SideEffectsOfStartAndStop)
{
testing::InSequence seq;
......@@ -98,35 +105,36 @@ TEST_F(TransformFeedbackTest, BufferBinding)
static const size_t bindIndex = 0;
rx::MockTransformFeedbackImpl *feedbackImpl = new rx::MockTransformFeedbackImpl;
EXPECT_CALL(*feedbackImpl, destructor()).Times(1).RetiresOnSaturation();
gl::TransformFeedback *feedback = new gl::TransformFeedback(feedbackImpl, 1, mCaps);
EXPECT_EQ(mFeedback->getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
EXPECT_EQ(feedback->getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
EXPECT_CALL(*mImpl, bindGenericBuffer(_));
mFeedback->bindGenericBuffer(buffer);
EXPECT_EQ(mFeedback->getGenericBuffer().get(), buffer);
EXPECT_CALL(*feedbackImpl, bindGenericBuffer(_));
feedback->bindGenericBuffer(buffer);
EXPECT_EQ(feedback->getGenericBuffer().get(), buffer);
EXPECT_CALL(*feedbackImpl, bindIndexedBuffer(_, _));
feedback->bindIndexedBuffer(bindIndex, buffer, 0, 1);
for (size_t i = 0; i < feedback->getIndexedBufferCount(); i++)
EXPECT_CALL(*mImpl, bindIndexedBuffer(_, _));
mFeedback->bindIndexedBuffer(bindIndex, buffer, 0, 1);
for (size_t i = 0; i < mFeedback->getIndexedBufferCount(); i++)
{
if (i == bindIndex)
{
EXPECT_EQ(feedback->getIndexedBuffer(i).get(), buffer);
EXPECT_EQ(mFeedback->getIndexedBuffer(i).get(), buffer);
}
else
{
EXPECT_EQ(feedback->getIndexedBuffer(i).get(), nullptr);
EXPECT_EQ(mFeedback->getIndexedBuffer(i).get(), nullptr);
}
}
feedback->addRef();
feedback->release();
// force-release the feedback object to ensure the buffer is released.
const size_t releaseCount = mFeedback->getRefCount();
for (size_t count = 0; count < releaseCount; ++count)
{
mFeedback->release();
}
mFeedback = nullptr;
testing::Mock::VerifyAndClear(bufferImpl);
}
} // namespace
} // anonymous namespace
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