• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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