Commit ab372311 by Le Hoang Quyen Committed by Commit Bot

Metal: refactor RenderUtils to split into multiple util classes.

This is useful for later modifications where blit/clear could be further categorized based on texture format type (float/integer). Bug: angleproject:2634 Change-Id: I877abd21761af9e91657686a60e189a43a33e3f4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2193195Reviewed-by: 's avatarJonah Ryan-Davis <jonahr@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 957a2359
...@@ -63,10 +63,7 @@ class BufferHolderMtl ...@@ -63,10 +63,7 @@ class BufferHolderMtl
// a queue of mtl::Buffer and only let CPU modifies a free mtl::Buffer. // a queue of mtl::Buffer and only let CPU modifies a free mtl::Buffer.
// So, in order to let GPU use the most recent modified content, one must call this method // So, in order to let GPU use the most recent modified content, one must call this method
// right before the draw call to retrieved the most up-to-date mtl::Buffer. // right before the draw call to retrieved the most up-to-date mtl::Buffer.
mtl::BufferRef getCurrentBuffer(const gl::Context *context) mtl::BufferRef getCurrentBuffer() { return mIsWeak ? mBufferWeakRef.lock() : mBuffer; }
{
return mIsWeak ? mBufferWeakRef.lock() : mBuffer;
}
protected: protected:
mtl::BufferRef mBuffer; mtl::BufferRef mBuffer;
...@@ -111,8 +108,7 @@ class BufferMtl : public BufferImpl, public BufferHolderMtl ...@@ -111,8 +108,7 @@ class BufferMtl : public BufferImpl, public BufferHolderMtl
bool primitiveRestartEnabled, bool primitiveRestartEnabled,
gl::IndexRange *outRange) override; gl::IndexRange *outRange) override;
angle::Result getFirstLastIndices(const gl::Context *context, angle::Result getFirstLastIndices(gl::DrawElementsType type,
gl::DrawElementsType type,
size_t offset, size_t offset,
size_t count, size_t count,
std::pair<uint32_t, uint32_t> *outIndices) const; std::pair<uint32_t, uint32_t> *outIndices) const;
......
...@@ -228,8 +228,7 @@ angle::Result BufferMtl::getIndexRange(const gl::Context *context, ...@@ -228,8 +228,7 @@ angle::Result BufferMtl::getIndexRange(const gl::Context *context,
return angle::Result::Continue; return angle::Result::Continue;
} }
angle::Result BufferMtl::getFirstLastIndices(const gl::Context *context, angle::Result BufferMtl::getFirstLastIndices(gl::DrawElementsType type,
gl::DrawElementsType type,
size_t offset, size_t offset,
size_t count, size_t count,
std::pair<uint32_t, uint32_t> *outIndices) const std::pair<uint32_t, uint32_t> *outIndices) const
......
...@@ -175,7 +175,7 @@ angle::Result ContextMtl::drawTriFanArraysWithBaseVertex(const gl::Context *cont ...@@ -175,7 +175,7 @@ angle::Result ContextMtl::drawTriFanArraysWithBaseVertex(const gl::Context *cont
ANGLE_TRY( ANGLE_TRY(
mtl::Buffer::MakeBuffer(this, indexBufferSize, nullptr, &mTriFanArraysIndexBuffer)); mtl::Buffer::MakeBuffer(this, indexBufferSize, nullptr, &mTriFanArraysIndexBuffer));
ANGLE_TRY(getDisplay()->getUtils().generateTriFanBufferFromArrays( ANGLE_TRY(getDisplay()->getUtils().generateTriFanBufferFromArrays(
context, {0, static_cast<uint32_t>(count), mTriFanArraysIndexBuffer, 0})); this, {0, static_cast<uint32_t>(count), mTriFanArraysIndexBuffer, 0}));
} }
ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::TriangleFan, first, count, instances, ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::TriangleFan, first, count, instances,
...@@ -203,7 +203,7 @@ angle::Result ContextMtl::drawTriFanArraysLegacy(const gl::Context *context, ...@@ -203,7 +203,7 @@ angle::Result ContextMtl::drawTriFanArraysLegacy(const gl::Context *context,
ANGLE_TRY(AllocateTriangleFanBufferFromPool(this, count, &mTriFanIndexBuffer, &genIdxBuffer, ANGLE_TRY(AllocateTriangleFanBufferFromPool(this, count, &mTriFanIndexBuffer, &genIdxBuffer,
&genIdxBufferOffset, &genIndicesCount)); &genIdxBufferOffset, &genIndicesCount));
ANGLE_TRY(getDisplay()->getUtils().generateTriFanBufferFromArrays( ANGLE_TRY(getDisplay()->getUtils().generateTriFanBufferFromArrays(
context, {static_cast<uint32_t>(first), static_cast<uint32_t>(count), genIdxBuffer, this, {static_cast<uint32_t>(first), static_cast<uint32_t>(count), genIdxBuffer,
genIdxBufferOffset})); genIdxBufferOffset}));
ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::TriangleFan, first, count, instances, ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::TriangleFan, first, count, instances,
...@@ -314,7 +314,7 @@ angle::Result ContextMtl::drawTriFanElements(const gl::Context *context, ...@@ -314,7 +314,7 @@ angle::Result ContextMtl::drawTriFanElements(const gl::Context *context,
&genIdxBufferOffset, &genIndicesCount)); &genIdxBufferOffset, &genIndicesCount));
ANGLE_TRY(getDisplay()->getUtils().generateTriFanBufferFromElementsArray( ANGLE_TRY(getDisplay()->getUtils().generateTriFanBufferFromElementsArray(
context, {type, count, indices, genIdxBuffer, genIdxBufferOffset})); this, {type, count, indices, genIdxBuffer, genIdxBufferOffset}));
ANGLE_TRY(mTriFanIndexBuffer.commit(this)); ANGLE_TRY(mTriFanIndexBuffer.commit(this));
...@@ -1552,7 +1552,7 @@ angle::Result ContextMtl::genLineLoopLastSegment(const gl::Context *context, ...@@ -1552,7 +1552,7 @@ angle::Result ContextMtl::genLineLoopLastSegment(const gl::Context *context,
if (indexTypeOrNone == gl::DrawElementsType::InvalidEnum) if (indexTypeOrNone == gl::DrawElementsType::InvalidEnum)
{ {
ANGLE_TRY(getDisplay()->getUtils().generateLineLoopLastSegment( ANGLE_TRY(getDisplay()->getUtils().generateLineLoopLastSegment(
context, firstVertex, firstVertex + vertexOrIndexCount - 1, newBuffer, 0)); this, firstVertex, firstVertex + vertexOrIndexCount - 1, newBuffer, 0));
} }
else else
{ {
...@@ -1560,7 +1560,7 @@ angle::Result ContextMtl::genLineLoopLastSegment(const gl::Context *context, ...@@ -1560,7 +1560,7 @@ angle::Result ContextMtl::genLineLoopLastSegment(const gl::Context *context,
// taken into account // taken into account
ASSERT(firstVertex == 0); ASSERT(firstVertex == 0);
ANGLE_TRY(getDisplay()->getUtils().generateLineLoopLastSegmentFromElementsArray( ANGLE_TRY(getDisplay()->getUtils().generateLineLoopLastSegmentFromElementsArray(
context, {indexTypeOrNone, vertexOrIndexCount, indices, newBuffer, 0})); this, {indexTypeOrNone, vertexOrIndexCount, indices, newBuffer, 0}));
} }
ANGLE_TRY(mLineLoopIndexBuffer.commit(this)); ANGLE_TRY(mLineLoopIndexBuffer.commit(this));
......
...@@ -534,9 +534,7 @@ angle::Result FramebufferMtl::clearWithDraw(const gl::Context *context, ...@@ -534,9 +534,7 @@ angle::Result FramebufferMtl::clearWithDraw(const gl::Context *context,
// Start new render encoder if not already. // Start new render encoder if not already.
mtl::RenderCommandEncoder *encoder = contextMtl->getRenderCommandEncoder(mRenderPassDesc); mtl::RenderCommandEncoder *encoder = contextMtl->getRenderCommandEncoder(mRenderPassDesc);
display->getUtils().clearWithDraw(context, encoder, clearOpts); return display->getUtils().clearWithDraw(context, encoder, clearOpts);
return angle::Result::Continue;
} }
angle::Result FramebufferMtl::clearImpl(const gl::Context *context, angle::Result FramebufferMtl::clearImpl(const gl::Context *context,
......
...@@ -1200,9 +1200,7 @@ angle::Result TextureMtl::copySubImageWithDraw(const gl::Context *context, ...@@ -1200,9 +1200,7 @@ angle::Result TextureMtl::copySubImageWithDraw(const gl::Context *context,
blitParams.srcYFlipped = framebufferMtl->flipY(); blitParams.srcYFlipped = framebufferMtl->flipY();
blitParams.dstLuminance = internalFormat.isLUMA(); blitParams.dstLuminance = internalFormat.isLUMA();
displayMtl->getUtils().blitWithDraw(context, cmdEncoder, blitParams); return displayMtl->getUtils().blitWithDraw(context, cmdEncoder, blitParams);
return angle::Result::Continue;
} }
angle::Result TextureMtl::copySubImageCPU(const gl::Context *context, angle::Result TextureMtl::copySubImageCPU(const gl::Context *context,
......
...@@ -315,7 +315,7 @@ angle::Result VertexArrayMtl::setupDraw(const gl::Context *glContext, ...@@ -315,7 +315,7 @@ angle::Result VertexArrayMtl::setupDraw(const gl::Context *glContext,
} }
desc.layouts[bufferIdx].stride = mCurrentArrayBufferStrides[v]; desc.layouts[bufferIdx].stride = mCurrentArrayBufferStrides[v];
cmdEncoder->setVertexBuffer(mCurrentArrayBuffers[v]->getCurrentBuffer(glContext), cmdEncoder->setVertexBuffer(mCurrentArrayBuffers[v]->getCurrentBuffer(),
bufferOffset, bufferIdx); bufferOffset, bufferIdx);
} }
else else
...@@ -487,7 +487,7 @@ angle::Result VertexArrayMtl::getIndexBuffer(const gl::Context *context, ...@@ -487,7 +487,7 @@ angle::Result VertexArrayMtl::getIndexBuffer(const gl::Context *context,
{ {
// No conversion needed: // No conversion needed:
BufferMtl *bufferMtl = mtl::GetImpl(glElementArrayBuffer); BufferMtl *bufferMtl = mtl::GetImpl(glElementArrayBuffer);
*idxBufferOut = bufferMtl->getCurrentBuffer(context); *idxBufferOut = bufferMtl->getCurrentBuffer();
*idxBufferOffsetOut = convertedOffset; *idxBufferOffsetOut = convertedOffset;
} }
} }
...@@ -555,10 +555,11 @@ angle::Result VertexArrayMtl::convertIndexBufferGPU(const gl::Context *glContext ...@@ -555,10 +555,11 @@ angle::Result VertexArrayMtl::convertIndexBufferGPU(const gl::Context *glContext
&conversion->convertedOffset)); &conversion->convertedOffset));
// Do the conversion on GPU. // Do the conversion on GPU.
ANGLE_TRY(display->getUtils().convertIndexBuffer( ANGLE_TRY(display->getUtils().convertIndexBufferGPU(
glContext, indexType, static_cast<uint32_t>(indexCount), mtl::GetImpl(glContext),
idxBuffer->getCurrentBuffer(glContext), static_cast<uint32_t>(offset), {indexType, static_cast<uint32_t>(indexCount), idxBuffer->getCurrentBuffer(),
conversion->convertedBuffer, static_cast<uint32_t>(conversion->convertedOffset))); static_cast<uint32_t>(offset), conversion->convertedBuffer,
static_cast<uint32_t>(conversion->convertedOffset)}));
ANGLE_TRY(conversion->data.commit(contextMtl)); ANGLE_TRY(conversion->data.commit(contextMtl));
...@@ -659,14 +660,13 @@ angle::Result VertexArrayMtl::convertVertexBufferCPU(const gl::Context *glContex ...@@ -659,14 +660,13 @@ angle::Result VertexArrayMtl::convertVertexBufferCPU(const gl::Context *glContex
// Cache the last converted results to be re-used later if the buffer's content won't ever be // Cache the last converted results to be re-used later if the buffer's content won't ever be
// changed. // changed.
conversion->convertedBuffer = conversion->convertedBuffer = mConvertedArrayBufferHolders[attribIndex].getCurrentBuffer();
mConvertedArrayBufferHolders[attribIndex].getCurrentBuffer(glContext);
conversion->convertedOffset = mCurrentArrayBufferOffsets[attribIndex]; conversion->convertedOffset = mCurrentArrayBufferOffsets[attribIndex];
#ifndef NDEBUG #ifndef NDEBUG
ANGLE_MTL_OBJC_SCOPE ANGLE_MTL_OBJC_SCOPE
{ {
mConvertedArrayBufferHolders[attribIndex].getCurrentBuffer(glContext)->get().label = mConvertedArrayBufferHolders[attribIndex].getCurrentBuffer()->get().label =
[NSString stringWithFormat:@"Converted from %p offset=%zu stride=%u", srcBuffer, [NSString stringWithFormat:@"Converted from %p offset=%zu stride=%u", srcBuffer,
binding.getOffset(), binding.getStride()]; binding.getOffset(), binding.getStride()];
} }
......
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