Commit c0c938af by Le Hoang Quyen Committed by Commit Bot

Metal: draw 1 triangle instead of 2 for fullscreen shaders.

Reference article in favour of one big triangle instead of 2: https://michaldrobot.com/2014/04/01/gcn-execution-patterns-in-full-screen-passes/ According to this article, the performance could be increased by ~10% for fullscreen shaders. Bug: angleproject:2634 Change-Id: Ia5b04c40f0587e3cb8680c0f30f7b68d9d7a3efe Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2193192 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 8470b533
{ {
"src/libANGLE/renderer/metal/shaders/blit.metal": "src/libANGLE/renderer/metal/shaders/blit.metal":
"86cad2bdbbed1fe7ec94f4ce01ede0c1", "9281aba529ceb4ed5131b7f9c0515362",
"src/libANGLE/renderer/metal/shaders/clear.metal": "src/libANGLE/renderer/metal/shaders/clear.metal":
"1c231afc6100433a79fce49046aa5965", "1c231afc6100433a79fce49046aa5965",
"src/libANGLE/renderer/metal/shaders/common.h": "src/libANGLE/renderer/metal/shaders/common.h":
"d44903e10552301d7ec89c1a0e6e0862", "569171e345ef36dd6a3b12aeebfae4a6",
"src/libANGLE/renderer/metal/shaders/compiled/mtl_default_shaders.inc": "src/libANGLE/renderer/metal/shaders/compiled/mtl_default_shaders.inc":
"ae02216e4b3588d28b0e87a54deddabb", "c42c37285c375de9a065b925ed54aebd",
"src/libANGLE/renderer/metal/shaders/gen_indices.metal": "src/libANGLE/renderer/metal/shaders/gen_indices.metal":
"002511e2b980a7fca7e80cbda6a82712", "002511e2b980a7fca7e80cbda6a82712",
"src/libANGLE/renderer/metal/shaders/gen_mtl_internal_shaders.py": "src/libANGLE/renderer/metal/shaders/gen_mtl_internal_shaders.py":
...@@ -14,5 +14,5 @@ ...@@ -14,5 +14,5 @@
"src/libANGLE/renderer/metal/shaders/master_source.metal": "src/libANGLE/renderer/metal/shaders/master_source.metal":
"fbe6f4bfb49a48ae87791a4cff5fab0a", "fbe6f4bfb49a48ae87791a4cff5fab0a",
"src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc": "src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc":
"492ddcfd51acfc95d02de2658cf999cd" "8a94beb0d979f472d71686b6f95b624f"
} }
\ No newline at end of file
...@@ -39,14 +39,13 @@ struct ClearParamsUniform ...@@ -39,14 +39,13 @@ struct ClearParamsUniform
struct BlitParamsUniform struct BlitParamsUniform
{ {
// 0: lower left, 1: lower right, 2: upper left, 3: upper right // 0: lower left, 1: lower right, 2: upper left
float srcTexCoords[4][2]; float srcTexCoords[3][2];
int srcLevel = 0; int srcLevel = 0;
uint8_t srcLuminance = 0; // source texture is luminance texture uint8_t srcLuminance = 0; // source texture is luminance texture
uint8_t dstFlipY = 0; uint8_t dstFlipY = 0;
uint8_t dstLuminance = 0; // dest texture is luminace uint8_t dstLuminance = 0; // dest texture is luminace
uint8_t padding1; uint8_t padding;
float padding2[2];
}; };
struct IndexConversionUniform struct IndexConversionUniform
...@@ -229,8 +228,8 @@ void RenderUtils::clearWithDraw(const gl::Context *context, ...@@ -229,8 +228,8 @@ void RenderUtils::clearWithDraw(const gl::Context *context,
setupClearWithDraw(context, cmdEncoder, overridedParams); setupClearWithDraw(context, cmdEncoder, overridedParams);
// Draw the screen aligned quad // Draw the screen aligned triangle
cmdEncoder->draw(MTLPrimitiveTypeTriangle, 0, 6); cmdEncoder->draw(MTLPrimitiveTypeTriangle, 0, 3);
// Invalidate current context's state // Invalidate current context's state
auto contextMtl = GetImpl(context); auto contextMtl = GetImpl(context);
...@@ -247,8 +246,8 @@ void RenderUtils::blitWithDraw(const gl::Context *context, ...@@ -247,8 +246,8 @@ void RenderUtils::blitWithDraw(const gl::Context *context,
} }
setupBlitWithDraw(context, cmdEncoder, params); setupBlitWithDraw(context, cmdEncoder, params);
// Draw the screen aligned quad // Draw the screen aligned triangle
cmdEncoder->draw(MTLPrimitiveTypeTriangle, 0, 6); cmdEncoder->draw(MTLPrimitiveTypeTriangle, 0, 3);
// Invalidate current context's state // Invalidate current context's state
ContextMtl *contextMtl = GetImpl(context); ContextMtl *contextMtl = GetImpl(context);
...@@ -474,26 +473,24 @@ void RenderUtils::setupBlitWithDrawUniformData(RenderCommandEncoder *cmdEncoder, ...@@ -474,26 +473,24 @@ void RenderUtils::setupBlitWithDrawUniformData(RenderCommandEncoder *cmdEncoder,
std::swap(y0, y1); std::swap(y0, y1);
} }
float u0 = (float)x0 / srcWidth; float u0 = static_cast<float>(x0) / srcWidth;
float u1 = (float)x1 / srcWidth; float u1 = static_cast<float>(x1) / srcWidth;
float v0 = (float)y0 / srcHeight; float v0 = static_cast<float>(y0) / srcHeight;
float v1 = (float)y1 / srcHeight; float v1 = static_cast<float>(y1) / srcHeight;
float du = static_cast<float>(x1 - x0) / srcWidth;
float dv = static_cast<float>(y1 - y0) / srcHeight;
// lower left // lower left
uniformParams.srcTexCoords[0][0] = u0; uniformParams.srcTexCoords[0][0] = u0;
uniformParams.srcTexCoords[0][1] = v0; uniformParams.srcTexCoords[0][1] = v0;
// lower right // lower right
uniformParams.srcTexCoords[1][0] = u1; uniformParams.srcTexCoords[1][0] = u1 + du;
uniformParams.srcTexCoords[1][1] = v0; uniformParams.srcTexCoords[1][1] = v0;
// upper left // upper left
uniformParams.srcTexCoords[2][0] = u0; uniformParams.srcTexCoords[2][0] = u0;
uniformParams.srcTexCoords[2][1] = v1; uniformParams.srcTexCoords[2][1] = v1 + dv;
// upper right
uniformParams.srcTexCoords[3][0] = u1;
uniformParams.srcTexCoords[3][1] = v1;
cmdEncoder->setVertexData(uniformParams, 0); cmdEncoder->setVertexData(uniformParams, 0);
cmdEncoder->setFragmentData(uniformParams, 0); cmdEncoder->setFragmentData(uniformParams, 0);
......
...@@ -10,8 +10,8 @@ ...@@ -10,8 +10,8 @@
struct BlitParams struct BlitParams
{ {
// 0: lower left, 1: lower right, 2: upper left, 3: upper right // 0: lower left, 1: lower right, 2: upper left
float2 srcTexCoords[4]; float2 srcTexCoords[3];
int srcLevel; int srcLevel;
bool srcLuminance; // source texture is luminance texture bool srcLuminance; // source texture is luminance texture
bool dstFlipViewportY; bool dstFlipViewportY;
...@@ -28,8 +28,8 @@ vertex BlitVSOut blitVS(unsigned int vid [[ vertex_id ]], ...@@ -28,8 +28,8 @@ vertex BlitVSOut blitVS(unsigned int vid [[ vertex_id ]],
constant BlitParams &options [[buffer(0)]]) constant BlitParams &options [[buffer(0)]])
{ {
BlitVSOut output; BlitVSOut output;
output.position = float4(gCorners[vid], 0.0, 1.0); output.position = float4(gCorners[vid], 0.0, 1.0);
output.texCoords = options.srcTexCoords[gTexcoordsIndices[vid]]; output.texCoords = options.srcTexCoords[vid];
if (!options.dstFlipViewportY) if (!options.dstFlipViewportY)
{ {
......
...@@ -21,15 +21,8 @@ ...@@ -21,15 +21,8 @@
using namespace metal; using namespace metal;
// Full screen quad's vertices // Full screen triangle's vertices
constant float2 gCorners[6] = { constant float2 gCorners[3] = {float2(-1.0f, -1.0f), float2(3.0f, -1.0f), float2(-1.0f, 3.0f)};
float2(-1.0f, 1.0f), float2(1.0f, -1.0f), float2(-1.0f, -1.0f),
float2(-1.0f, 1.0f), float2(1.0f, 1.0f), float2(1.0f, -1.0f),
};
// Full screen quad's texcoords indices:
// 0: lower left, 1: lower right, 2: upper left, 3: upper right
constant int gTexcoordsIndices[6] = {2, 1, 0, 2, 3, 1};
fragment float4 dummyFS() fragment float4 dummyFS()
{ {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
// GENERATED FILE - DO NOT EDIT. // GENERATED FILE - DO NOT EDIT.
// Generated by gen_mtl_internal_shaders.py // Generated by gen_mtl_internal_shaders.py
// //
// Copyright 2019 The ANGLE Project Authors. All rights reserved. // Copyright 2020 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// //
...@@ -17,7 +17,7 @@ constexpr char default_metallib_src[] = R"( ...@@ -17,7 +17,7 @@ constexpr char default_metallib_src[] = R"(
# 1 "master_source.metal" # 1 "master_source.metal"
# 1 "<built-in>" 1 # 1 "<built-in>" 1
# 1 "<built-in>" 3 # 1 "<built-in>" 3
# 374 "<built-in>" 3 # 376 "<built-in>" 3
# 1 "<command line>" 1 # 1 "<command line>" 1
# 1 "<built-in>" 2 # 1 "<built-in>" 2
# 1 "master_source.metal" 2 # 1 "master_source.metal" 2
...@@ -42,14 +42,7 @@ constexpr char default_metallib_src[] = R"( ...@@ -42,14 +42,7 @@ constexpr char default_metallib_src[] = R"(
using namespace metal; using namespace metal;
constant float2 gCorners[6] = { constant float2 gCorners[3] = {float2(-1.0f, -1.0f), float2(3.0f, -1.0f), float2(-1.0f, 3.0f)};
float2(-1.0f, 1.0f), float2(1.0f, -1.0f), float2(-1.0f, -1.0f),
float2(-1.0f, 1.0f), float2(1.0f, 1.0f), float2(1.0f, -1.0f),
};
constant int gTexcoordsIndices[6] = {2, 1, 0, 2, 3, 1};
fragment float4 dummyFS() fragment float4 dummyFS()
{ {
...@@ -79,7 +72,7 @@ fragment float4 clearFS(constant ClearParams &clearParams [[buffer(0)]]) ...@@ -79,7 +72,7 @@ fragment float4 clearFS(constant ClearParams &clearParams [[buffer(0)]])
struct BlitParams struct BlitParams
{ {
float2 srcTexCoords[4]; float2 srcTexCoords[3];
int srcLevel; int srcLevel;
bool srcLuminance; bool srcLuminance;
bool dstFlipViewportY; bool dstFlipViewportY;
...@@ -97,7 +90,7 @@ vertex BlitVSOut blitVS(unsigned int vid [[ vertex_id ]], ...@@ -97,7 +90,7 @@ vertex BlitVSOut blitVS(unsigned int vid [[ vertex_id ]],
{ {
BlitVSOut output; BlitVSOut output;
output.position = float4(gCorners[vid], 0.0, 1.0); output.position = float4(gCorners[vid], 0.0, 1.0);
output.texCoords = options.srcTexCoords[gTexcoordsIndices[vid]]; output.texCoords = options.srcTexCoords[vid];
if (!options.dstFlipViewportY) if (!options.dstFlipViewportY)
{ {
......
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