| 1 | /* | 
| 2 |  * Copyright 2019 Google Inc. | 
| 3 |  * | 
| 4 |  * Use of this source code is governed by a BSD-style license that can be | 
| 5 |  * found in the LICENSE file. | 
| 6 |  */ | 
| 7 |  | 
| 8 | #ifndef GrSPIRVUniformHandler_DEFINED | 
| 9 | #define GrSPIRVUniformHandler_DEFINED | 
| 10 |  | 
| 11 | #include "src/gpu/GrTBlockList.h" | 
| 12 | #include "src/gpu/glsl/GrGLSLUniformHandler.h" | 
| 13 |  | 
| 14 | /* | 
| 15 |  * This class can be used for basic SPIR-V uniform handling. It will make a single uniform buffer | 
| 16 |  * for all the uniforms and will be placed in the first set and binding. Textures and samplers are | 
| 17 |  * placed in the second set and kept as separate objects. They are interleaved as sampler texture | 
| 18 |  * pairs with each object in the next binding slot. | 
| 19 |  */ | 
| 20 | class GrSPIRVUniformHandler : public GrGLSLUniformHandler { | 
| 21 | public: | 
| 22 |     static const int kUniformsPerBlock = 8; | 
| 23 |  | 
| 24 |     const GrShaderVar& getUniformVariable(UniformHandle u) const override; | 
| 25 |     const char* getUniformCStr(UniformHandle u) const override; | 
| 26 |  | 
| 27 |     struct SPIRVUniformInfo : public UniformInfo { | 
| 28 |         int fUBOOffset; | 
| 29 |     }; | 
| 30 |     typedef GrTBlockList<SPIRVUniformInfo> UniformInfoArray; | 
| 31 |     enum { | 
| 32 |         kUniformBinding = 0, | 
| 33 |         kUniformDescriptorSet = 0, | 
| 34 |         kSamplerTextureDescriptorSet = 1, | 
| 35 |     }; | 
| 36 |     uint32_t getRTHeightOffset() const; | 
| 37 |  | 
| 38 |     int numUniforms() const override { | 
| 39 |         return fUniforms.count(); | 
| 40 |     } | 
| 41 |  | 
| 42 |     UniformInfo& uniform(int idx) override { | 
| 43 |         return fUniforms.item(idx); | 
| 44 |     } | 
| 45 |     const UniformInfo& uniform(int idx) const override { | 
| 46 |         return fUniforms.item(idx); | 
| 47 |     } | 
| 48 |  | 
| 49 | private: | 
| 50 |     explicit GrSPIRVUniformHandler(GrGLSLProgramBuilder* program); | 
| 51 |  | 
| 52 |     SamplerHandle addSampler(const GrBackendFormat&, GrSamplerState, const GrSwizzle&, | 
| 53 |                              const char* name, const GrShaderCaps*) override; | 
| 54 |     const char* samplerVariable(SamplerHandle handle) const override; | 
| 55 |     GrSwizzle samplerSwizzle(SamplerHandle handle) const override; | 
| 56 |     void appendUniformDecls(GrShaderFlags visibility, SkString*) const override; | 
| 57 |     UniformHandle internalAddUniformArray(const GrFragmentProcessor* owner, | 
| 58 |                                           uint32_t visibility, | 
| 59 |                                           GrSLType type, | 
| 60 |                                           const char* name, | 
| 61 |                                           bool mangleName, | 
| 62 |                                           int arrayCount, | 
| 63 |                                           const char** outName) override; | 
| 64 |  | 
| 65 |     UniformInfoArray    fUniforms; | 
| 66 |     UniformInfoArray    fSamplers; | 
| 67 |     UniformInfoArray    fTextures; | 
| 68 |     SkTArray<GrSwizzle> fSamplerSwizzles; | 
| 69 |     SkTArray<SkString>  fSamplerReferences; | 
| 70 |  | 
| 71 |     uint32_t fCurrentUBOOffset = 0; | 
| 72 |     uint32_t fRTHeightOffset = 0; | 
| 73 |  | 
| 74 |     friend class GrD3DPipelineStateBuilder; | 
| 75 |     friend class GrDawnProgramBuilder; | 
| 76 |  | 
| 77 |     typedef GrGLSLUniformHandler INHERITED; | 
| 78 | }; | 
| 79 |  | 
| 80 | #endif | 
| 81 |  |