Commit 405d4cf3 by Le Hoang Quyen Committed by Commit Bot

Metal: multiple bug fixes

- ContextMtl: triangle fan draws should call setupDraw() with original parameters. Not the modified parameters. - SurfaceMtl: should initialize metal layer's drawableSize after layer's creation. - TextureMtl & FrameBufferMtl: Fix texture copySubImage CPU path incorrectly copied unflipped area. - mtl_render_utils: Fix wrong variable name used for trifan compute pipeline cache table. - mtl_resources: Fix texture & buffer memory leaks due to missing ANGLE_MTL_AUTORELEASE. - mtl_utils: Fix viewport flipping error due to arithmetic between unsigned & signed values. These bugs were discovered during dEQP tests running. Bug: angleproject:2634 Change-Id: Ie01380910ab68a2b876718d9dac0b5b4c41b607c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1906608 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarJonah Ryan-Davis <jonahr@google.com>
parent c2f1f618
...@@ -150,8 +150,8 @@ angle::Result ContextMtl::drawTriFanArraysWithBaseVertex(const gl::Context *cont ...@@ -150,8 +150,8 @@ angle::Result ContextMtl::drawTriFanArraysWithBaseVertex(const gl::Context *cont
context, {0, static_cast<uint32_t>(count), mTriFanArraysIndexBuffer, 0})); context, {0, static_cast<uint32_t>(count), mTriFanArraysIndexBuffer, 0}));
} }
ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::Triangles, first, genIndicesCount, 1, ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::TriangleFan, first, count, 1,
gl::DrawElementsType::UnsignedInt, reinterpret_cast<const void *>(0))); gl::DrawElementsType::InvalidEnum, reinterpret_cast<const void *>(0)));
// Draw with the zero starting index buffer, shift the vertex index using baseVertex instanced // Draw with the zero starting index buffer, shift the vertex index using baseVertex instanced
// draw: // draw:
...@@ -173,9 +173,8 @@ angle::Result ContextMtl::drawTriFanArraysLegacy(const gl::Context *context, ...@@ -173,9 +173,8 @@ angle::Result ContextMtl::drawTriFanArraysLegacy(const gl::Context *context,
context, {static_cast<uint32_t>(first), static_cast<uint32_t>(count), genIdxBuffer, context, {static_cast<uint32_t>(first), static_cast<uint32_t>(count), genIdxBuffer,
genIdxBufferOffset})); genIdxBufferOffset}));
ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::Triangles, 0, genIndicesCount, 1, ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::TriangleFan, first, count, 1,
gl::DrawElementsType::UnsignedInt, gl::DrawElementsType::InvalidEnum, reinterpret_cast<const void *>(0)));
reinterpret_cast<const void *>(genIdxBufferOffset)));
mRenderEncoder.drawIndexed(MTLPrimitiveTypeTriangle, genIndicesCount, MTLIndexTypeUInt32, mRenderEncoder.drawIndexed(MTLPrimitiveTypeTriangle, genIndicesCount, MTLIndexTypeUInt32,
genIdxBuffer, genIdxBufferOffset); genIdxBuffer, genIdxBufferOffset);
...@@ -258,9 +257,7 @@ angle::Result ContextMtl::drawTriFanElements(const gl::Context *context, ...@@ -258,9 +257,7 @@ angle::Result ContextMtl::drawTriFanElements(const gl::Context *context,
ANGLE_TRY(mTriFanIndexBuffer.commit(this)); ANGLE_TRY(mTriFanIndexBuffer.commit(this));
ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::Triangles, 0, genIndicesCount, 1, ANGLE_TRY(setupDraw(context, gl::PrimitiveMode::TriangleFan, 0, count, 1, type, indices));
gl::DrawElementsType::UnsignedInt,
reinterpret_cast<const void *>(genIdxBufferOffset)));
mRenderEncoder.drawIndexed(MTLPrimitiveTypeTriangle, genIndicesCount, MTLIndexTypeUInt32, mRenderEncoder.drawIndexed(MTLPrimitiveTypeTriangle, genIndicesCount, MTLIndexTypeUInt32,
genIdxBuffer, genIdxBufferOffset); genIdxBuffer, genIdxBufferOffset);
......
...@@ -95,6 +95,11 @@ class FramebufferMtl : public FramebufferImpl ...@@ -95,6 +95,11 @@ class FramebufferMtl : public FramebufferImpl
void onFinishedDrawingToFrameBuffer(const gl::Context *context, void onFinishedDrawingToFrameBuffer(const gl::Context *context,
mtl::RenderCommandEncoder *encoder); mtl::RenderCommandEncoder *encoder);
// The actual area will be adjusted based on framebuffer flipping property.
gl::Rectangle getReadPixelArea(const gl::Rectangle &glArea);
// NOTE: this method doesn't do the flipping of area. Caller must do it if needed before
// callling this. See getReadPixelsArea().
angle::Result readPixelsImpl(const gl::Context *context, angle::Result readPixelsImpl(const gl::Context *context,
const gl::Rectangle &area, const gl::Rectangle &area,
const PackPixelsParams &packPixelsParams, const PackPixelsParams &packPixelsParams,
......
...@@ -188,11 +188,7 @@ angle::Result FramebufferMtl::readPixels(const gl::Context *context, ...@@ -188,11 +188,7 @@ angle::Result FramebufferMtl::readPixels(const gl::Context *context,
// nothing to read // nothing to read
return angle::Result::Continue; return angle::Result::Continue;
} }
gl::Rectangle flippedArea = clippedArea; gl::Rectangle flippedArea = getReadPixelArea(clippedArea);
if (mFlipY)
{
flippedArea.y = fbRect.height - flippedArea.y - flippedArea.height;
}
ContextMtl *contextMtl = mtl::GetImpl(context); ContextMtl *contextMtl = mtl::GetImpl(context);
const gl::State &glState = context->getState(); const gl::State &glState = context->getState();
...@@ -673,6 +669,21 @@ angle::Result FramebufferMtl::invalidateImpl(ContextMtl *contextMtl, ...@@ -673,6 +669,21 @@ angle::Result FramebufferMtl::invalidateImpl(ContextMtl *contextMtl,
return angle::Result::Continue; return angle::Result::Continue;
} }
gl::Rectangle FramebufferMtl::getReadPixelArea(const gl::Rectangle &glArea)
{
RenderTargetMtl *colorReadRT = getColorReadRenderTarget();
ASSERT(colorReadRT);
gl::Rectangle flippedArea = glArea;
if (mFlipY)
{
flippedArea.y =
colorReadRT->getTexture()->height(static_cast<uint32_t>(colorReadRT->getLevelIndex())) -
flippedArea.y - flippedArea.height;
}
return flippedArea;
}
angle::Result FramebufferMtl::readPixelsImpl(const gl::Context *context, angle::Result FramebufferMtl::readPixelsImpl(const gl::Context *context,
const gl::Rectangle &area, const gl::Rectangle &area,
const PackPixelsParams &packPixelsParams, const PackPixelsParams &packPixelsParams,
......
...@@ -263,6 +263,9 @@ egl::Error SurfaceMtl::initialize(const egl::Display *display) ...@@ -263,6 +263,9 @@ egl::Error SurfaceMtl::initialize(const egl::Display *display)
[mLayer addSublayer:mMetalLayer.get()]; [mLayer addSublayer:mMetalLayer.get()];
} }
// ensure drawableSize is set to correct value:
checkIfLayerResized();
} }
return egl::NoError(); return egl::NoError();
......
...@@ -803,6 +803,7 @@ angle::Result TextureMtl::copySubImageWithDraw(const gl::Context *context, ...@@ -803,6 +803,7 @@ angle::Result TextureMtl::copySubImageWithDraw(const gl::Context *context,
blitParams.dstColorMask = mTexture->getColorWritableMask(); blitParams.dstColorMask = mTexture->getColorWritableMask();
blitParams.src = colorReadRT->getTexture(); blitParams.src = colorReadRT->getTexture();
blitParams.srcLevel = static_cast<uint32_t>(colorReadRT->getLevelIndex());
blitParams.srcRect = clippedSourceArea; blitParams.srcRect = clippedSourceArea;
blitParams.srcYFlipped = framebufferMtl->flipY(); blitParams.srcYFlipped = framebufferMtl->flipY();
blitParams.dstLuminance = internalFormat.isLUMA(); blitParams.dstLuminance = internalFormat.isLUMA();
...@@ -827,7 +828,7 @@ angle::Result TextureMtl::copySubImageCPU(const gl::Context *context, ...@@ -827,7 +828,7 @@ angle::Result TextureMtl::copySubImageCPU(const gl::Context *context,
angle::MemoryBuffer conversionRow; angle::MemoryBuffer conversionRow;
ANGLE_CHECK_GL_ALLOC(contextMtl, conversionRow.resize(dstRowPitch)); ANGLE_CHECK_GL_ALLOC(contextMtl, conversionRow.resize(dstRowPitch));
MTLRegion mtlDstRowArea = MTLRegionMake2D(clippedSourceArea.x, 0, clippedSourceArea.width, 1); MTLRegion mtlDstRowArea = MTLRegionMake2D(modifiedDestOffset.x, 0, clippedSourceArea.width, 1);
gl::Rectangle srcRowArea = gl::Rectangle(clippedSourceArea.x, 0, clippedSourceArea.width, 1); gl::Rectangle srcRowArea = gl::Rectangle(clippedSourceArea.x, 0, clippedSourceArea.width, 1);
for (int r = 0; r < clippedSourceArea.height; ++r) for (int r = 0; r < clippedSourceArea.height; ++r)
...@@ -838,7 +839,8 @@ angle::Result TextureMtl::copySubImageCPU(const gl::Context *context, ...@@ -838,7 +839,8 @@ angle::Result TextureMtl::copySubImageCPU(const gl::Context *context,
PackPixelsParams packParams(srcRowArea, dstFormat, dstRowPitch, false, nullptr, 0); PackPixelsParams packParams(srcRowArea, dstFormat, dstRowPitch, false, nullptr, 0);
// Read pixels from framebuffer to memory: // Read pixels from framebuffer to memory:
ANGLE_TRY(framebufferMtl->readPixelsImpl(context, srcRowArea, packParams, gl::Rectangle flippedSrcRowArea = framebufferMtl->getReadPixelArea(srcRowArea);
ANGLE_TRY(framebufferMtl->readPixelsImpl(context, flippedSrcRowArea, packParams,
framebufferMtl->getColorReadRenderTarget(), framebufferMtl->getColorReadRenderTarget(),
conversionRow.data())); conversionRow.data()));
......
...@@ -605,7 +605,7 @@ AutoObjCPtr<id<MTLComputePipelineState>> RenderUtils::getTriFanFromElemArrayGene ...@@ -605,7 +605,7 @@ AutoObjCPtr<id<MTLComputePipelineState>> RenderUtils::getTriFanFromElemArrayGene
IndexConvesionPipelineCacheKey key = {srcType, aligned}; IndexConvesionPipelineCacheKey key = {srcType, aligned};
auto &cache = mIndexConversionPipelineCaches[key]; auto &cache = mTriFanFromElemArrayGeneratorPipelineCaches[key];
if (!cache) if (!cache)
{ {
......
...@@ -161,48 +161,54 @@ Texture::Texture(ContextMtl *context, ...@@ -161,48 +161,54 @@ Texture::Texture(ContextMtl *context,
bool renderTargetOnly, bool renderTargetOnly,
bool supportTextureView) bool supportTextureView)
{ {
id<MTLDevice> metalDevice = context->getMetalDevice(); ANGLE_MTL_OBJC_SCOPE
if (mips > 1 && mips < desc.mipmapLevelCount)
{ {
desc.mipmapLevelCount = mips; id<MTLDevice> metalDevice = context->getMetalDevice();
}
// Every texture will support being rendered for now if (mips > 1 && mips < desc.mipmapLevelCount)
desc.usage = 0; {
desc.mipmapLevelCount = mips;
}
if (Format::FormatRenderable(desc.pixelFormat)) // Every texture will support being rendered for now
{ desc.usage = 0;
desc.usage |= MTLTextureUsageRenderTarget;
}
if (!Format::FormatCPUReadable(desc.pixelFormat)) if (Format::FormatRenderable(desc.pixelFormat))
{ {
desc.resourceOptions = MTLResourceStorageModePrivate; desc.usage |= MTLTextureUsageRenderTarget;
} }
if (!renderTargetOnly) if (!Format::FormatCPUReadable(desc.pixelFormat))
{ {
desc.usage = desc.usage | MTLTextureUsageShaderRead; desc.resourceOptions = MTLResourceStorageModePrivate;
} }
if (supportTextureView) if (!renderTargetOnly)
{ {
desc.usage = desc.usage | MTLTextureUsagePixelFormatView; desc.usage = desc.usage | MTLTextureUsageShaderRead;
} }
set([metalDevice newTextureWithDescriptor:desc]); if (supportTextureView)
{
desc.usage = desc.usage | MTLTextureUsagePixelFormatView;
}
set([[metalDevice newTextureWithDescriptor:desc] ANGLE_MTL_AUTORELEASE]);
}
} }
Texture::Texture(Texture *original, MTLTextureType type, NSRange mipmapLevelRange, uint32_t slice) Texture::Texture(Texture *original, MTLTextureType type, NSRange mipmapLevelRange, uint32_t slice)
: Resource(original) : Resource(original)
{ {
auto view = [original->get() newTextureViewWithPixelFormat:original->pixelFormat() ANGLE_MTL_OBJC_SCOPE
textureType:type {
levels:mipmapLevelRange auto view = [original->get() newTextureViewWithPixelFormat:original->pixelFormat()
slices:NSMakeRange(slice, 1)]; textureType:type
levels:mipmapLevelRange
slices:NSMakeRange(slice, 1)];
set(view); set([view ANGLE_MTL_AUTORELEASE]);
}
} }
void Texture::syncContent(ContextMtl *context) void Texture::syncContent(ContextMtl *context)
...@@ -380,7 +386,7 @@ angle::Result Buffer::reset(ContextMtl *context, size_t size, const uint8_t *dat ...@@ -380,7 +386,7 @@ angle::Result Buffer::reset(ContextMtl *context, size_t size, const uint8_t *dat
newBuffer = [metalDevice newBufferWithLength:size options:options]; newBuffer = [metalDevice newBufferWithLength:size options:options];
} }
set(newBuffer); set([newBuffer ANGLE_MTL_AUTORELEASE]);
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -99,7 +99,7 @@ MTLViewport GetViewportFlipY(const gl::Rectangle &rect, ...@@ -99,7 +99,7 @@ MTLViewport GetViewportFlipY(const gl::Rectangle &rect,
MTLViewport re; MTLViewport re;
re.originX = rect.x; re.originX = rect.x;
re.originY = screenHeight - rect.y1(); re.originY = static_cast<double>(screenHeight) - rect.y1();
re.width = rect.width; re.width = rect.width;
re.height = rect.height; re.height = rect.height;
re.znear = znear; re.znear = znear;
......
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