Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Static Public Attributes | Private Member Functions | Friends | List of all members
GrMtlUniformHandler Class Reference

#include <GrMtlUniformHandler.h>

Inheritance diagram for GrMtlUniformHandler:
GrGLSLUniformHandler

Classes

struct  MtlUniformInfo
 

Public Types

enum  { kUniformBinding = 0 , kLastUniformBinding = kUniformBinding }
 
typedef SkTBlockList< MtlUniformInfoUniformInfoArray
 
- Public Types inherited from GrGLSLUniformHandler
using UniformHandle = GrGLSLProgramDataManager::UniformHandle
 

Public Member Functions

const GrShaderVargetUniformVariable (UniformHandle u) const override
 
const char * getUniformCStr (UniformHandle u) const override
 
int numUniforms () const override
 
UniformInfouniform (int idx) override
 
const UniformInfouniform (int idx) const override
 
- Public Member Functions inherited from GrGLSLUniformHandler
virtual ~GrGLSLUniformHandler ()
 
UniformHandle addUniform (const GrProcessor *owner, uint32_t visibility, SkSLType type, const char *name, const char **outName=nullptr)
 
UniformHandle addUniformArray (const GrProcessor *owner, uint32_t visibility, SkSLType type, const char *name, int arrayCount, const char **outName=nullptr)
 
GrShaderVar getUniformMapping (const GrProcessor &owner, SkString rawName) const
 
GrShaderVar liftUniformToVertexShader (const GrProcessor &owner, SkString rawName)
 

Static Public Attributes

static const int kUniformsPerBlock = 8
 
static constexpr int kUniformBindingCount = kLastUniformBinding + 1
 

Private Member Functions

UniformHandle internalAddUniformArray (const GrProcessor *owner, uint32_t visibility, SkSLType type, const char *name, bool mangleName, int arrayCount, const char **outName) override
 
SamplerHandle addSampler (const GrBackendFormat &, GrSamplerState, const skgpu::Swizzle &, const char *name, const GrShaderCaps *) override
 
const char * samplerVariable (SamplerHandle handle) const override
 
skgpu::Swizzle samplerSwizzle (SamplerHandle handle) const override
 
void appendUniformDecls (GrShaderFlags, SkString *) const override
 

Friends

class GrMtlPipelineStateBuilder
 

Additional Inherited Members

- Protected Member Functions inherited from GrGLSLUniformHandler
 GrGLSLUniformHandler (GrGLSLProgramBuilder *program)
 
- Protected Attributes inherited from GrGLSLUniformHandler
GrGLSLProgramBuilderfProgramBuilder
 

Detailed Description

Definition at line 22 of file GrMtlUniformHandler.h.

Member Typedef Documentation

◆ UniformInfoArray

Definition at line 36 of file GrMtlUniformHandler.h.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
kUniformBinding 
kLastUniformBinding 

Definition at line 26 of file GrMtlUniformHandler.h.

Member Function Documentation

◆ addSampler()

GrGLSLUniformHandler::SamplerHandle GrMtlUniformHandler::addSampler ( const GrBackendFormat backendFormat,
GrSamplerState  ,
const skgpu::Swizzle swizzle,
const char *  name,
const GrShaderCaps caps 
)
overrideprivatevirtual

Implements GrGLSLUniformHandler.

Definition at line 232 of file GrMtlUniformHandler.mm.

234 {
235 int binding = fSamplers.count();
236
237 SkASSERT(name && strlen(name));
238
239 constexpr char prefix = 'u';
240 SkString mangleName = fProgramBuilder->nameVariable(prefix, name, /*mangle=*/true);
241
242 GrTextureType type = backendFormat.textureType();
243
244 SkString layoutQualifier;
245 layoutQualifier.appendf("metal, binding=%d", binding);
246
247 MtlUniformInfo tempInfo;
248 tempInfo.fVariable = GrShaderVar{std::move(mangleName),
252 std::move(layoutQualifier),
253 SkString()};
254
255 tempInfo.fVisibility = kFragment_GrShaderFlag;
256 tempInfo.fOwner = nullptr;
257 tempInfo.fRawName = SkString(name);
258 tempInfo.fUBOffset = 0;
259
260 fSamplers.push_back(tempInfo);
261
262 fSamplerSwizzles.push_back(swizzle);
263 SkASSERT(fSamplerSwizzles.size() == fSamplers.count());
264 return GrGLSLUniformHandler::SamplerHandle(fSamplers.count() - 1);
265}
@ kFragment_GrShaderFlag
GrTextureType
static SkSLType SkSLCombinedSamplerTypeForTextureType(GrTextureType type)
Definition GrUtil.h:50
#define SkASSERT(cond)
Definition SkAssert.h:116
GrTextureType textureType() const
SkString nameVariable(char prefix, const char *name, bool mangle=true)
GrGLSLProgramBuilder * fProgramBuilder
void void void appendf(const char format[],...) SK_PRINTF_LIKE(2
Definition SkString.cpp:550
int count() const
int size() const
Definition SkTArray.h:416
const char * name
Definition fuchsia.cc:50

◆ appendUniformDecls()

void GrMtlUniformHandler::appendUniformDecls ( GrShaderFlags  visibility,
SkString out 
) const
overrideprivatevirtual

Implements GrGLSLUniformHandler.

Definition at line 267 of file GrMtlUniformHandler.mm.

267 {
268 for (const UniformInfo& sampler : fSamplers.items()) {
269 SkASSERT(sampler.fVariable.getType() == SkSLType::kTexture2DSampler);
270 if (visibility == sampler.fVisibility) {
271 sampler.fVariable.appendDecl(fProgramBuilder->shaderCaps(), out);
272 out->append(";\n");
273 }
274 }
275
276#ifdef SK_DEBUG
277 bool firstOffsetCheck = false;
278 for (const MtlUniformInfo& localUniform : fUniforms.items()) {
279 if (!firstOffsetCheck) {
280 // Check to make sure we are starting our offset at 0 so the offset qualifier we
281 // set on each variable in the uniform block is valid.
282 SkASSERT(0 == localUniform.fUBOffset);
283 firstOffsetCheck = true;
284 }
285 }
286#endif
287
288 SkString uniformsString;
289 for (const UniformInfo& localUniform : fUniforms.items()) {
290 if (visibility & localUniform.fVisibility) {
291 if (SkSLTypeCanBeUniformValue(localUniform.fVariable.getType())) {
292 localUniform.fVariable.appendDecl(fProgramBuilder->shaderCaps(), &uniformsString);
293 uniformsString.append(";\n");
294 }
295 }
296 }
297
298 if (!uniformsString.isEmpty()) {
299 out->appendf("layout (metal, binding=%d) uniform uniformBuffer\n{\n", kUniformBinding);
300 out->appendf("%s\n};\n", uniformsString.c_str());
301 }
302}
static constexpr bool SkSLTypeCanBeUniformValue(SkSLType type)
@ kTexture2DSampler
const GrShaderCaps * shaderCaps() const
bool isEmpty() const
Definition SkString.h:130
void append(const char text[])
Definition SkString.h:203
const char * c_str() const
Definition SkString.h:133

◆ getUniformCStr()

const char * GrMtlUniformHandler::getUniformCStr ( UniformHandle  u) const
inlineoverridevirtual

Shortcut for getUniformVariable(u).c_str()

Implements GrGLSLUniformHandler.

Definition at line 42 of file GrMtlUniformHandler.h.

42 {
43 return this->getUniformVariable(u).c_str();
44 }
const GrShaderVar & getUniformVariable(UniformHandle u) const override
const char * c_str() const
Definition GrShaderVar.h:94

◆ getUniformVariable()

const GrShaderVar & GrMtlUniformHandler::getUniformVariable ( UniformHandle  u) const
inlineoverridevirtual

Implements GrGLSLUniformHandler.

Definition at line 38 of file GrMtlUniformHandler.h.

38 {
39 return fUniforms.item(u.toIndex()).fVariable;
40 }
T & item(int i)

◆ internalAddUniformArray()

GrGLSLUniformHandler::UniformHandle GrMtlUniformHandler::internalAddUniformArray ( const GrProcessor owner,
uint32_t  visibility,
SkSLType  type,
const char *  name,
bool  mangleName,
int  arrayCount,
const char **  outName 
)
overrideprivatevirtual

Implements GrGLSLUniformHandler.

Definition at line 180 of file GrMtlUniformHandler.mm.

187 {
188 SkASSERT(name && strlen(name));
190
191 // TODO this is a bit hacky, lets think of a better way. Basically we need to be able to use
192 // the uniform view matrix name in the GP, and the GP is immutable so it has to tell the PB
193 // exactly what name it wants to use for the uniform view matrix. If we prefix anythings, then
194 // the names will mismatch. I think the correct solution is to have all GPs which need the
195 // uniform view matrix, they should upload the view matrix in their setData along with regular
196 // uniforms.
197 char prefix = 'u';
198 if ('u' == name[0] || !strncmp(name, GR_NO_MANGLE_PREFIX, strlen(GR_NO_MANGLE_PREFIX))) {
199 prefix = '\0';
200 }
201 SkString resolvedName = fProgramBuilder->nameVariable(prefix, name, mangleName);
202
203 uint32_t offset = get_ubo_aligned_offset(&fCurrentUBOOffset, &fCurrentUBOMaxAlignment,
204 type, arrayCount);
205 SkString layoutQualifier;
206 layoutQualifier.appendf("offset=%u", offset);
207
208 // When outputing the GLSL, only the outer uniform block will get the Uniform modifier. Thus
209 // we set the modifier to none for all uniforms declared inside the block.
210 MtlUniformInfo tempInfo;
211 tempInfo.fVariable = GrShaderVar{std::move(resolvedName),
212 type,
214 arrayCount,
215 std::move(layoutQualifier),
216 SkString()};
217
218 tempInfo.fVisibility = kFragment_GrShaderFlag | kVertex_GrShaderFlag;
219 tempInfo.fOwner = owner;
220 tempInfo.fRawName = SkString(name);
221 tempInfo.fUBOffset = offset;
222
223 fUniforms.push_back(tempInfo);
224
225 if (outName) {
226 *outName = fUniforms.back().fVariable.c_str();
227 }
228
229 return GrGLSLUniformHandler::UniformHandle(fUniforms.count() - 1);
230}
#define GR_NO_MANGLE_PREFIX
static uint32_t get_ubo_aligned_offset(uint32_t *currentOffset, uint32_t *maxAlignment, SkSLType type, int arrayCount)
@ kVertex_GrShaderFlag
GrGLSLProgramDataManager::UniformHandle UniformHandle
Point offset

◆ numUniforms()

int GrMtlUniformHandler::numUniforms ( ) const
inlineoverridevirtual

Implements GrGLSLUniformHandler.

Definition at line 46 of file GrMtlUniformHandler.h.

46 {
47 return fUniforms.count();
48 }

◆ samplerSwizzle()

skgpu::Swizzle GrMtlUniformHandler::samplerSwizzle ( SamplerHandle  handle) const
inlineoverrideprivatevirtual

Implements GrGLSLUniformHandler.

Definition at line 84 of file GrMtlUniformHandler.h.

84 {
85 return fSamplerSwizzles[handle.toIndex()];
86 }

◆ samplerVariable()

const char * GrMtlUniformHandler::samplerVariable ( SamplerHandle  handle) const
inlineoverrideprivatevirtual

Implements GrGLSLUniformHandler.

Definition at line 81 of file GrMtlUniformHandler.h.

81 {
82 return fSamplers.item(handle.toIndex()).fVariable.c_str();
83 }

◆ uniform() [1/2]

const UniformInfo & GrMtlUniformHandler::uniform ( int  idx) const
inlineoverridevirtual

Implements GrGLSLUniformHandler.

Definition at line 53 of file GrMtlUniformHandler.h.

53 {
54 return fUniforms.item(idx);
55 }

◆ uniform() [2/2]

UniformInfo & GrMtlUniformHandler::uniform ( int  idx)
inlineoverridevirtual

Implements GrGLSLUniformHandler.

Definition at line 50 of file GrMtlUniformHandler.h.

50 {
51 return fUniforms.item(idx);
52 }

Friends And Related Symbol Documentation

◆ GrMtlPipelineStateBuilder

friend class GrMtlPipelineStateBuilder
friend

Definition at line 104 of file GrMtlUniformHandler.h.

Member Data Documentation

◆ kUniformBindingCount

constexpr int GrMtlUniformHandler::kUniformBindingCount = kLastUniformBinding + 1
staticconstexpr

Definition at line 30 of file GrMtlUniformHandler.h.

◆ kUniformsPerBlock

const int GrMtlUniformHandler::kUniformsPerBlock = 8
static

Definition at line 24 of file GrMtlUniformHandler.h.


The documentation for this class was generated from the following files: