tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

blocklayoutHLSL.h (2399B)


      1 //
      2 // Copyright 2013 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 // blocklayout.h:
      7 //   Methods and classes related to uniform layout and packing in GLSL and HLSL.
      8 //
      9 
     10 #ifndef COMMON_BLOCKLAYOUTHLSL_H_
     11 #define COMMON_BLOCKLAYOUTHLSL_H_
     12 
     13 #include <cstddef>
     14 #include <vector>
     15 
     16 #include <GLSLANG/ShaderLang.h>
     17 #include "angle_gl.h"
     18 #include "blocklayout.h"
     19 
     20 namespace sh
     21 {
     22 // Block layout packed according to the D3D9 or default D3D10+ register packing rules
     23 // See http://msdn.microsoft.com/en-us/library/windows/desktop/bb509632(v=vs.85).aspx
     24 // The strategy should be ENCODE_LOOSE for D3D9 constant blocks, and ENCODE_PACKED
     25 // for everything else (D3D10+ constant blocks and all attributes/varyings).
     26 
     27 class HLSLBlockEncoder : public BlockLayoutEncoder
     28 {
     29  public:
     30    enum HLSLBlockEncoderStrategy
     31    {
     32        ENCODE_PACKED,
     33        ENCODE_LOOSE
     34    };
     35 
     36    HLSLBlockEncoder(HLSLBlockEncoderStrategy strategy, bool transposeMatrices);
     37 
     38    void enterAggregateType(const ShaderVariable &structVar) override;
     39    void exitAggregateType(const ShaderVariable &structVar) override;
     40    void skipRegisters(unsigned int numRegisters);
     41 
     42    bool isPacked() const { return mEncoderStrategy == ENCODE_PACKED; }
     43 
     44    static HLSLBlockEncoderStrategy GetStrategyFor(ShShaderOutput outputType);
     45 
     46  protected:
     47    void getBlockLayoutInfo(GLenum type,
     48                            const std::vector<unsigned int> &arraySizes,
     49                            bool isRowMajorMatrix,
     50                            int *arrayStrideOut,
     51                            int *matrixStrideOut) override;
     52    void advanceOffset(GLenum type,
     53                       const std::vector<unsigned int> &arraySizes,
     54                       bool isRowMajorMatrix,
     55                       int arrayStride,
     56                       int matrixStride) override;
     57 
     58    HLSLBlockEncoderStrategy mEncoderStrategy;
     59    bool mTransposeMatrices;
     60 };
     61 
     62 // This method returns the number of used registers for a ShaderVariable. It is dependent on the
     63 // HLSLBlockEncoder class to count the number of used registers in a struct (which are individually
     64 // packed according to the same rules).
     65 unsigned int HLSLVariableRegisterCount(const ShaderVariable &variable, ShShaderOutput outputType);
     66 }  // namespace sh
     67 
     68 #endif  // COMMON_BLOCKLAYOUTHLSL_H_