Hash :
2df17a12
Author :
Date :
2022-05-25T16:18:37
Vulkan: Pack driver uniforms Previously 5 vec4s were used for driver uniforms + 2 vec4s if specialization constants couldn't be supported. The driver uniforms are rearranged and packed such that only 2 vec4s are normally used, which include fallback for specialization constants as well. In the future, most of the specialization constants may turn into uniforms, and this change prepares for that. Additional uniforms are used (3 vec4s) only if common extensions are missing; transform feedback and bresenham lines. This change makes it more practical for driver uniforms to be turned into push constants. Additionally, these uniforms could potentially be loaded and cached at the beginning of the shader for more efficient memory access. On Pixel6, with this change, the traces show no difference in wall time. On most traces, CPU time shows up to ~7% improvement. Bug: angleproject:7366 Change-Id: I0f47f863955af06a19c69d1f1d7c45b97d95476e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3668151 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
//
// 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.
//
// DriverUniformMetal:
// Struct defining the default driver uniforms for direct and SpirV based ANGLE translation
//
#include "compiler/translator/DriverUniformMetal.h"
#include "compiler/translator/tree_util/BuiltIn.h"
#include "compiler/translator/tree_util/DriverUniform.h"
#include "compiler/translator/tree_util/IntermNode_util.h"
namespace sh
{
namespace
{
// Metal specific driver uniforms
constexpr const char kXfbBufferOffsets[] = "xfbBufferOffsets";
constexpr const char kXfbVerticesPerInstance[] = "xfbVerticesPerInstance";
constexpr const char kCoverageMask[] = "coverageMask";
constexpr const char kUnused[] = "unused";
} // namespace
// class DriverUniformMetal
// The fields here must match the DriverUniforms structure defined in ContextMtl.h.
TFieldList *DriverUniformMetal::createUniformFields(TSymbolTable *symbolTable)
{
TFieldList *driverFieldList = DriverUniform::createUniformFields(symbolTable);
constexpr size_t kNumGraphicsDriverUniformsMetal = 4;
constexpr std::array<const char *, kNumGraphicsDriverUniformsMetal>
kGraphicsDriverUniformNamesMetal = {
{kXfbBufferOffsets, kXfbVerticesPerInstance, kCoverageMask, kUnused}};
const std::array<TType *, kNumGraphicsDriverUniformsMetal> kDriverUniformTypesMetal = {{
// xfbBufferOffsets: uvec4
new TType(EbtInt, EbpHigh, EvqGlobal, 4),
// xfbVerticesPerInstance: uint
new TType(EbtInt, EbpHigh, EvqGlobal),
// coverageMask: uint
new TType(EbtUInt, EbpHigh, EvqGlobal),
// unused: uvec2
new TType(EbtUInt, EbpHigh, EvqGlobal, 2),
}};
for (size_t uniformIndex = 0; uniformIndex < kNumGraphicsDriverUniformsMetal; ++uniformIndex)
{
TField *driverUniformField =
new TField(kDriverUniformTypesMetal[uniformIndex],
ImmutableString(kGraphicsDriverUniformNamesMetal[uniformIndex]),
TSourceLoc(), SymbolType::AngleInternal);
driverFieldList->push_back(driverUniformField);
}
return driverFieldList;
}
TIntermTyped *DriverUniformMetal::getCoverageMaskField() const
{
return createDriverUniformRef(kCoverageMask);
}
} // namespace sh