1 //
2 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // DriverUniformMetal:
7 // Struct defining the default driver uniforms for direct and SpirV based ANGLE translation
8 //
9
10 #include "compiler/translator/DriverUniformMetal.h"
11 #include "compiler/translator/tree_util/BuiltIn.h"
12 #include "compiler/translator/tree_util/DriverUniform.h"
13 #include "compiler/translator/tree_util/IntermNode_util.h"
14
15 namespace sh
16 {
17
18 namespace
19 {
20
21 // Metal specific driver uniforms
22 constexpr const char kHalfRenderArea[] = "halfRenderArea";
23 constexpr const char kFlipXY[] = "flipXY";
24 constexpr const char kNegFlipXY[] = "negFlipXY";
25 constexpr const char kCoverageMask[] = "coverageMask";
26 constexpr const char kUnusedMetal[] = "unusedMetal";
27
28 } // namespace
29
30 // class DriverUniformMetal
31 // The fields here must match the DriverUniforms structure defined in ContextMtl.h.
createUniformFields(TSymbolTable * symbolTable)32 TFieldList *DriverUniformMetal::createUniformFields(TSymbolTable *symbolTable)
33 {
34 TFieldList *driverFieldList = DriverUniform::createUniformFields(symbolTable);
35
36 constexpr size_t kNumGraphicsDriverUniformsMetal = 5;
37 constexpr std::array<const char *, kNumGraphicsDriverUniformsMetal>
38 kGraphicsDriverUniformNamesMetal = {
39 {kHalfRenderArea, kFlipXY, kNegFlipXY, kCoverageMask, kUnusedMetal}};
40
41 const std::array<TType *, kNumGraphicsDriverUniformsMetal> kDriverUniformTypesMetal = {{
42 new TType(EbtFloat, EbpHigh, EvqGlobal, 2), // halfRenderArea
43 new TType(EbtFloat, EbpLow, EvqGlobal, 2), // flipXY
44 new TType(EbtFloat, EbpLow, EvqGlobal, 2), // negFlipXY
45 new TType(EbtUInt, EbpHigh, EvqGlobal), // kCoverageMask
46 new TType(EbtUInt, EbpHigh, EvqGlobal), // kUnusedMetal
47 }};
48
49 for (size_t uniformIndex = 0; uniformIndex < kNumGraphicsDriverUniformsMetal; ++uniformIndex)
50 {
51 TField *driverUniformField =
52 new TField(kDriverUniformTypesMetal[uniformIndex],
53 ImmutableString(kGraphicsDriverUniformNamesMetal[uniformIndex]),
54 TSourceLoc(), SymbolType::AngleInternal);
55 driverFieldList->push_back(driverUniformField);
56 }
57
58 return driverFieldList;
59 }
60
getHalfRenderAreaRef() const61 TIntermTyped *DriverUniformMetal::getHalfRenderAreaRef() const
62 {
63 return createDriverUniformRef(kHalfRenderArea);
64 }
65
getFlipXYRef() const66 TIntermTyped *DriverUniformMetal::getFlipXYRef() const
67 {
68 return createDriverUniformRef(kFlipXY);
69 }
70
getNegFlipXYRef() const71 TIntermTyped *DriverUniformMetal::getNegFlipXYRef() const
72 {
73 return createDriverUniformRef(kNegFlipXY);
74 }
75
getNegFlipYRef() const76 TIntermTyped *DriverUniformMetal::getNegFlipYRef() const
77 {
78 // Create a swizzle to "negFlipXY.y"
79 TIntermTyped *negFlipXY = createDriverUniformRef(kNegFlipXY);
80 TVector<int> swizzleOffsetY = {1};
81 TIntermSwizzle *negFlipY = new TIntermSwizzle(negFlipXY, swizzleOffsetY);
82 return negFlipY;
83 }
84
getCoverageMaskFieldRef() const85 TIntermTyped *DriverUniformMetal::getCoverageMaskFieldRef() const
86 {
87 return createDriverUniformRef(kCoverageMask);
88 }
89
90 } // namespace sh
91