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":
"86cad2bdbbed1fe7ec94f4ce01ede0c1",
"9281aba529ceb4ed5131b7f9c0515362",
"src/libANGLE/renderer/metal/shaders/clear.metal":
"1c231afc6100433a79fce49046aa5965",
"src/libANGLE/renderer/metal/shaders/common.h":
"d44903e10552301d7ec89c1a0e6e0862",
"569171e345ef36dd6a3b12aeebfae4a6",
"src/libANGLE/renderer/metal/shaders/compiled/mtl_default_shaders.inc":
"ae02216e4b3588d28b0e87a54deddabb",
"c42c37285c375de9a065b925ed54aebd",
"src/libANGLE/renderer/metal/shaders/gen_indices.metal":
"002511e2b980a7fca7e80cbda6a82712",
"src/libANGLE/renderer/metal/shaders/gen_mtl_internal_shaders.py":
......@@ -14,5 +14,5 @@
"src/libANGLE/renderer/metal/shaders/master_source.metal":
"fbe6f4bfb49a48ae87791a4cff5fab0a",
"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
struct BlitParamsUniform
{
// 0: lower left, 1: lower right, 2: upper left, 3: upper right
float srcTexCoords[4][2];
// 0: lower left, 1: lower right, 2: upper left
float srcTexCoords[3][2];
int srcLevel = 0;
uint8_t srcLuminance = 0; // source texture is luminance texture
uint8_t dstFlipY = 0;
uint8_t dstLuminance = 0; // dest texture is luminace
uint8_t padding1;
float padding2[2];
uint8_t padding;
};
struct IndexConversionUniform
......@@ -229,8 +228,8 @@ void RenderUtils::clearWithDraw(const gl::Context *context,
setupClearWithDraw(context, cmdEncoder, overridedParams);
// Draw the screen aligned quad
cmdEncoder->draw(MTLPrimitiveTypeTriangle, 0, 6);
// Draw the screen aligned triangle
cmdEncoder->draw(MTLPrimitiveTypeTriangle, 0, 3);
// Invalidate current context's state
auto contextMtl = GetImpl(context);
......@@ -247,8 +246,8 @@ void RenderUtils::blitWithDraw(const gl::Context *context,
}
setupBlitWithDraw(context, cmdEncoder, params);
// Draw the screen aligned quad
cmdEncoder->draw(MTLPrimitiveTypeTriangle, 0, 6);
// Draw the screen aligned triangle
cmdEncoder->draw(MTLPrimitiveTypeTriangle, 0, 3);
// Invalidate current context's state
ContextMtl *contextMtl = GetImpl(context);
......@@ -474,26 +473,24 @@ void RenderUtils::setupBlitWithDrawUniformData(RenderCommandEncoder *cmdEncoder,
std::swap(y0, y1);
}
float u0 = (float)x0 / srcWidth;
float u1 = (float)x1 / srcWidth;
float v0 = (float)y0 / srcHeight;
float v1 = (float)y1 / srcHeight;
float u0 = static_cast<float>(x0) / srcWidth;
float u1 = static_cast<float>(x1) / srcWidth;
float v0 = static_cast<float>(y0) / 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
uniformParams.srcTexCoords[0][0] = u0;
uniformParams.srcTexCoords[0][1] = v0;
// lower right
uniformParams.srcTexCoords[1][0] = u1;
uniformParams.srcTexCoords[1][0] = u1 + du;
uniformParams.srcTexCoords[1][1] = v0;
// upper left
uniformParams.srcTexCoords[2][0] = u0;
uniformParams.srcTexCoords[2][1] = v1;
// upper right
uniformParams.srcTexCoords[3][0] = u1;
uniformParams.srcTexCoords[3][1] = v1;
uniformParams.srcTexCoords[2][1] = v1 + dv;
cmdEncoder->setVertexData(uniformParams, 0);
cmdEncoder->setFragmentData(uniformParams, 0);
......
......@@ -10,8 +10,8 @@
struct BlitParams
{
// 0: lower left, 1: lower right, 2: upper left, 3: upper right
float2 srcTexCoords[4];
// 0: lower left, 1: lower right, 2: upper left
float2 srcTexCoords[3];
int srcLevel;
bool srcLuminance; // source texture is luminance texture
bool dstFlipViewportY;
......@@ -28,8 +28,8 @@ vertex BlitVSOut blitVS(unsigned int vid [[ vertex_id ]],
constant BlitParams &options [[buffer(0)]])
{
BlitVSOut output;
output.position = float4(gCorners[vid], 0.0, 1.0);
output.texCoords = options.srcTexCoords[gTexcoordsIndices[vid]];
output.position = float4(gCorners[vid], 0.0, 1.0);
output.texCoords = options.srcTexCoords[vid];
if (!options.dstFlipViewportY)
{
......
......@@ -21,15 +21,8 @@
using namespace metal;
// Full screen quad's vertices
constant float2 gCorners[6] = {
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};
// Full screen triangle's vertices
constant float2 gCorners[3] = {float2(-1.0f, -1.0f), float2(3.0f, -1.0f), float2(-1.0f, 3.0f)};
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 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
// found in the LICENSE file.
//
......@@ -17,7 +17,7 @@ constexpr char default_metallib_src[] = R"(
# 1 "master_source.metal"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 374 "<built-in>" 3
# 376 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "master_source.metal" 2
......@@ -42,14 +42,7 @@ constexpr char default_metallib_src[] = R"(
using namespace metal;
constant float2 gCorners[6] = {
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};
constant float2 gCorners[3] = {float2(-1.0f, -1.0f), float2(3.0f, -1.0f), float2(-1.0f, 3.0f)};
fragment float4 dummyFS()
{
......@@ -79,7 +72,7 @@ fragment float4 clearFS(constant ClearParams &clearParams [[buffer(0)]])
struct BlitParams
{
float2 srcTexCoords[4];
float2 srcTexCoords[3];
int srcLevel;
bool srcLuminance;
bool dstFlipViewportY;
......@@ -97,7 +90,7 @@ vertex BlitVSOut blitVS(unsigned int vid [[ vertex_id ]],
{
BlitVSOut output;
output.position = float4(gCorners[vid], 0.0, 1.0);
output.texCoords = options.srcTexCoords[gTexcoordsIndices[vid]];
output.texCoords = options.srcTexCoords[vid];
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