summaryrefslogtreecommitdiffstats
path: root/gfx/angle/checkout/src/compiler/translator/tree_util/DriverUniform.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/checkout/src/compiler/translator/tree_util/DriverUniform.h')
-rw-r--r--gfx/angle/checkout/src/compiler/translator/tree_util/DriverUniform.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/compiler/translator/tree_util/DriverUniform.h b/gfx/angle/checkout/src/compiler/translator/tree_util/DriverUniform.h
new file mode 100644
index 0000000000..53eebae74d
--- /dev/null
+++ b/gfx/angle/checkout/src/compiler/translator/tree_util/DriverUniform.h
@@ -0,0 +1,110 @@
+//
+// 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.
+//
+// DriverUniform.h: Add code to support driver uniforms
+//
+
+#ifndef COMPILER_TRANSLATOR_TREEUTIL_DRIVERUNIFORM_H_
+#define COMPILER_TRANSLATOR_TREEUTIL_DRIVERUNIFORM_H_
+
+#include "common/angleutils.h"
+#include "compiler/translator/Types.h"
+
+namespace sh
+{
+
+class TCompiler;
+class TIntermBlock;
+class TIntermNode;
+class TSymbolTable;
+class TIntermTyped;
+class TIntermSwizzle;
+class TIntermBinary;
+
+enum class DriverUniformMode
+{
+ // Define the driver uniforms as an interface block. Used by the
+ // Vulkan and Metal/SPIR-V backends.
+ InterfaceBlock,
+
+ // Define the driver uniforms as a structure. Used by the
+ // direct-to-MSL Metal backend.
+ Structure
+};
+
+enum class DriverUniformFlip
+{
+ // Flip uniforms for fragment shaders
+ Fragment,
+ // Flip uniforms for pre-rasterization stages. These differ from the fragment values by whether
+ // the viewport needs to be flipped, and whether negative viewports are supported.
+ PreFragment,
+};
+
+class DriverUniform
+{
+ public:
+ DriverUniform(DriverUniformMode mode)
+ : mMode(mode), mDriverUniforms(nullptr), mEmulatedDepthRangeType(nullptr)
+ {}
+ virtual ~DriverUniform() = default;
+
+ bool addComputeDriverUniformsToShader(TIntermBlock *root, TSymbolTable *symbolTable);
+ bool addGraphicsDriverUniformsToShader(TIntermBlock *root, TSymbolTable *symbolTable);
+
+ TIntermTyped *getAcbBufferOffsets() const;
+ TIntermTyped *getDepthRange() const;
+ TIntermTyped *getViewportZScale() const;
+ TIntermTyped *getHalfRenderArea() const;
+ TIntermTyped *getFlipXY(TSymbolTable *symbolTable, DriverUniformFlip stage) const;
+ // Returns vec2(flip.x, -flip.y)
+ TIntermTyped *getNegFlipXY(TSymbolTable *symbolTable, DriverUniformFlip stage) const;
+ TIntermTyped *getDither() const;
+ TIntermTyped *getSwapXY() const;
+ TIntermTyped *getAdvancedBlendEquation() const;
+ TIntermTyped *getNumSamples() const;
+ TIntermTyped *getClipDistancesEnabled() const;
+ TIntermTyped *getTransformDepth() const;
+
+ virtual TIntermTyped *getViewport() const { return nullptr; }
+ virtual TIntermTyped *getXfbBufferOffsets() const { return nullptr; }
+ virtual TIntermTyped *getXfbVerticesPerInstance() const { return nullptr; }
+
+ const TVariable *getDriverUniformsVariable() const { return mDriverUniforms; }
+
+ protected:
+ TIntermTyped *createDriverUniformRef(const char *fieldName) const;
+ virtual TFieldList *createUniformFields(TSymbolTable *symbolTable);
+ const TType *createEmulatedDepthRangeType(TSymbolTable *symbolTable);
+
+ const DriverUniformMode mMode;
+ const TVariable *mDriverUniforms;
+ TType *mEmulatedDepthRangeType;
+};
+
+class DriverUniformExtended : public DriverUniform
+{
+ public:
+ DriverUniformExtended(DriverUniformMode mode) : DriverUniform(mode) {}
+ ~DriverUniformExtended() override {}
+
+ TIntermTyped *getXfbBufferOffsets() const override;
+ TIntermTyped *getXfbVerticesPerInstance() const override;
+
+ protected:
+ TFieldList *createUniformFields(TSymbolTable *symbolTable) override;
+};
+
+// Returns either (1,0) or (0,1) based on whether X and Y should remain as-is or swapped
+// respectively. dot((x,y), multiplier) will yield x, and dot((x,y), multiplier.yx) will yield y in
+// the possibly-swapped coordinates.
+//
+// Each component is separately returned by a function
+TIntermTyped *MakeSwapXMultiplier(TIntermTyped *swapped);
+TIntermTyped *MakeSwapYMultiplier(TIntermTyped *swapped);
+
+} // namespace sh
+
+#endif // COMPILER_TRANSLATOR_TREEUTIL_DRIVERUNIFORM_H_