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
GrVkUniformHandler Class Reference

#include <GrVkUniformHandler.h>

Inheritance diagram for GrVkUniformHandler:
GrGLSLUniformHandler

Classes

struct  VkUniformInfo
 

Public Types

enum  { kUniformBufferDescSet = 0 , kSamplerDescSet = 1 , kInputDescSet = 2 , kLastDescSet = kInputDescSet }
 
enum  { kUniformBinding = 0 , kInputBinding = 0 }
 
enum  { kDstInputAttachmentIndex = 0 }
 
enum  Layout { kStd140Layout = 0 , kStd430Layout = 1 , kLastLayout = kStd430Layout }
 
typedef SkTBlockList< VkUniformInfoUniformInfoArray
 
- Public Types inherited from GrGLSLUniformHandler
using UniformHandle = GrGLSLProgramDataManager::UniformHandle
 

Public Member Functions

 ~GrVkUniformHandler () override
 
const GrShaderVargetUniformVariable (UniformHandle u) const override
 
const char * getUniformCStr (UniformHandle u) const override
 
uint32_t getRTFlipOffset () const
 
int numUniforms () const override
 
UniformInfouniform (int idx) override
 
const UniformInfouniform (int idx) const override
 
bool usePushConstants () const
 
uint32_t currentOffset () const
 
- 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 kDescSetCount = kLastDescSet + 1
 
static constexpr int kLayoutCount = kLastLayout + 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
 
SamplerHandle addInputSampler (const skgpu::Swizzle &swizzle, const char *name) override
 
const char * samplerVariable (SamplerHandle handle) const override
 
skgpu::Swizzle samplerSwizzle (SamplerHandle handle) const override
 
const char * inputSamplerVariable (SamplerHandle handle) const override
 
skgpu::Swizzle inputSamplerSwizzle (SamplerHandle handle) const override
 
void appendUniformDecls (GrShaderFlags, SkString *) const override
 

Friends

class GrVkPipelineStateBuilder
 
class GrVkDescriptorSetManager
 

Additional Inherited Members

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

Detailed Description

Definition at line 19 of file GrVkUniformHandler.h.

Member Typedef Documentation

◆ UniformInfoArray

Definition at line 63 of file GrVkUniformHandler.h.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
kUniformBufferDescSet 

Binding a descriptor set invalidates all higher index descriptor sets. We must bind in the order of this enumeration. Samplers are after Uniforms because GrOps can specify GP textures as dynamic state, meaning they get rebound for each draw in a pipeline while uniforms are bound once before all the draws. We bind input attachments after samplers so those also need to be rebound if we bind new samplers.

kSamplerDescSet 
kInputDescSet 
kLastDescSet 

Definition at line 23 of file GrVkUniformHandler.h.

23 {
24 /**
25 * Binding a descriptor set invalidates all higher index descriptor sets. We must bind
26 * in the order of this enumeration. Samplers are after Uniforms because GrOps can specify
27 * GP textures as dynamic state, meaning they get rebound for each draw in a pipeline while
28 * uniforms are bound once before all the draws. We bind input attachments after samplers
29 * so those also need to be rebound if we bind new samplers.
30 */
33 kInputDescSet = 2,
34
36 };

◆ anonymous enum

anonymous enum
Enumerator
kUniformBinding 
kInputBinding 

Definition at line 40 of file GrVkUniformHandler.h.

◆ anonymous enum

anonymous enum
Enumerator
kDstInputAttachmentIndex 

Definition at line 44 of file GrVkUniformHandler.h.

◆ Layout

Enumerator
kStd140Layout 
kStd430Layout 
kLastLayout 

Definition at line 49 of file GrVkUniformHandler.h.

Constructor & Destructor Documentation

◆ ~GrVkUniformHandler()

GrVkUniformHandler::~GrVkUniformHandler ( )
override

Definition at line 194 of file GrVkUniformHandler.cpp.

194 {
195 for (VkUniformInfo& sampler : fSamplers.items()) {
196 if (sampler.fImmutableSampler) {
197 sampler.fImmutableSampler->unref();
198 sampler.fImmutableSampler = nullptr;
199 }
200 }
201}

Member Function Documentation

◆ addInputSampler()

GrGLSLUniformHandler::SamplerHandle GrVkUniformHandler::addInputSampler ( const skgpu::Swizzle swizzle,
const char *  name 
)
overrideprivatevirtual

Reimplemented from GrGLSLUniformHandler.

Definition at line 300 of file GrVkUniformHandler.cpp.

301 {
302 SkASSERT(name && strlen(name));
303 SkASSERT(fInputUniform.fVariable.getType() == SkSLType::kVoid);
304
305 const char prefix = 'u';
306 SkString mangleName = fProgramBuilder->nameVariable(prefix, name, /*mangle=*/true);
307
308 auto layoutQualifier = SkStringPrintf("vulkan, input_attachment_index=%d, set=%d, binding=%d",
312
313 fInputUniform = {GrShaderVar{std::move(mangleName),
317 std::move(layoutQualifier),
318 SkString()},
320 nullptr,
321 SkString(name)};
322 fInputSwizzle = swizzle;
323 return GrGLSLUniformHandler::SamplerHandle(0);
324}
@ kFragment_GrShaderFlag
#define SkASSERT(cond)
Definition SkAssert.h:116
SK_API SkString static SkString SkStringPrintf()
Definition SkString.h:287
SkString nameVariable(char prefix, const char *name, bool mangle=true)
GrGLSLProgramBuilder * fProgramBuilder
SkSLType getType() const
Definition GrShaderVar.h:97
const char * name
Definition fuchsia.cc:50

◆ addSampler()

GrGLSLUniformHandler::SamplerHandle GrVkUniformHandler::addSampler ( const GrBackendFormat backendFormat,
GrSamplerState  state,
const skgpu::Swizzle swizzle,
const char *  name,
const GrShaderCaps shaderCaps 
)
overrideprivatevirtual

Implements GrGLSLUniformHandler.

Definition at line 252 of file GrVkUniformHandler.cpp.

257 {
258 SkASSERT(name && strlen(name));
259
260 const char prefix = 'u';
261 SkString mangleName = fProgramBuilder->nameVariable(prefix, name, /*mangle=*/true);
262
263 SkString layoutQualifier;
264 layoutQualifier.appendf("vulkan, set=%d, binding=%d", kSamplerDescSet, fSamplers.count());
265
266 VkUniformInfo tempInfo;
267 tempInfo.fVariable =
268 GrShaderVar{std::move(mangleName),
272 std::move(layoutQualifier),
273 SkString()};
274
275 tempInfo.fVisibility = kFragment_GrShaderFlag;
276 tempInfo.fOwner = nullptr;
277 tempInfo.fRawName = SkString(name);
278 tempInfo.fOffsets[0] = 0;
279 tempInfo.fOffsets[1] = 0;
280
281 fSamplers.push_back(tempInfo);
282
283 // Check if we are dealing with an external texture and store the needed information if so.
284 auto ycbcrInfo = GrBackendFormats::GetVkYcbcrConversionInfo(backendFormat);
285 if (ycbcrInfo && ycbcrInfo->isValid()) {
286 GrVkGpu* gpu = static_cast<GrVkPipelineStateBuilder*>(fProgramBuilder)->gpu();
288 *ycbcrInfo);
289 fSamplers.back().fImmutableSampler = sampler;
290 if (!sampler) {
291 return {};
292 }
293 }
294
295 fSamplerSwizzles.push_back(swizzle);
296 SkASSERT(fSamplerSwizzles.size() == fSamplers.count());
297 return GrGLSLUniformHandler::SamplerHandle(fSamplers.count() - 1);
298}
static SkSLType SkSLCombinedSamplerTypeForTextureType(GrTextureType type)
Definition GrUtil.h:50
GrTextureType textureType() const
GrVkResourceProvider & resourceProvider()
Definition GrVkGpu.h:83
GrVkSampler * findOrCreateCompatibleSampler(GrSamplerState, const GrVkYcbcrConversionInfo &ycbcrInfo)
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
AtkStateType state
SK_API const GrVkYcbcrConversionInfo * GetVkYcbcrConversionInfo(const GrBackendFormat &)

◆ appendUniformDecls()

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

Implements GrGLSLUniformHandler.

Definition at line 326 of file GrVkUniformHandler.cpp.

326 {
327 for (const VkUniformInfo& sampler : fSamplers.items()) {
328 SkASSERT(sampler.fVariable.getType() == SkSLType::kTexture2DSampler ||
329 sampler.fVariable.getType() == SkSLType::kTextureExternalSampler);
330 if (visibility == sampler.fVisibility) {
331 sampler.fVariable.appendDecl(fProgramBuilder->shaderCaps(), out);
332 out->append(";\n");
333 }
334 }
335 if (fInputUniform.fVariable.getType() == SkSLType::kInput) {
336 if (visibility == fInputUniform.fVisibility) {
337 SkASSERT(visibility == kFragment_GrShaderFlag);
338 fInputUniform.fVariable.appendDecl(fProgramBuilder->shaderCaps(), out);
339 out->append(";\n");
340 }
341 }
342
343#ifdef SK_DEBUG
344 bool firstOffsetCheck = false;
345 for (const VkUniformInfo& localUniform : fUniforms.items()) {
346 if (!firstOffsetCheck) {
347 // Check to make sure we are starting our offset at 0 so the offset qualifier we
348 // set on each variable in the uniform block is valid.
349 SkASSERT(0 == localUniform.fOffsets[kStd140Layout] &&
350 0 == localUniform.fOffsets[kStd430Layout]);
351 firstOffsetCheck = true;
352 }
353 }
354#endif
355
356 // At this point we determine whether we'll be using push constants based on the
357 // uniforms set so far. Later checks will use the internal bool we set here to
358 // keep things consistent.
359 this->determineIfUsePushConstants();
360 SkString uniformsString;
361 for (const VkUniformInfo& localUniform : fUniforms.items()) {
362 if (visibility & localUniform.fVisibility) {
363 if (SkSLTypeCanBeUniformValue(localUniform.fVariable.getType())) {
364 Layout layout = fUsePushConstants ? kStd430Layout : kStd140Layout;
365 uniformsString.appendf("layout(offset=%u) ", localUniform.fOffsets[layout]);
366 localUniform.fVariable.appendDecl(fProgramBuilder->shaderCaps(), &uniformsString);
367 uniformsString.append(";\n");
368 }
369 }
370 }
371
372 if (!uniformsString.isEmpty()) {
373 if (fUsePushConstants) {
374 out->append("layout (vulkan, push_constant) ");
375 } else {
376 out->appendf("layout (vulkan, set=%d, binding=%d) ",
378 }
379 out->append("uniform uniformBuffer\n{\n");
380 out->appendf("%s\n};\n", uniformsString.c_str());
381 }
382}
static constexpr bool SkSLTypeCanBeUniformValue(SkSLType type)
@ kTextureExternalSampler
@ kTexture2DSampler
const GrShaderCaps * shaderCaps() const
void appendDecl(const GrShaderCaps *, SkString *out) 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

◆ currentOffset()

uint32_t GrVkUniformHandler::currentOffset ( ) const
inline

Definition at line 92 of file GrVkUniformHandler.h.

92 {
93 return fUsePushConstants ? fCurrentOffsets[kStd430Layout] : fCurrentOffsets[kStd140Layout];
94 }

◆ getRTFlipOffset()

uint32_t GrVkUniformHandler::getRTFlipOffset ( ) const

Returns the offset that the RTFlip synthetic uniform should use if it needs to be created.

Definition at line 384 of file GrVkUniformHandler.cpp.

384 {
385 Layout layout = fUsePushConstants ? kStd430Layout : kStd140Layout;
386 uint32_t currentOffset = fCurrentOffsets[layout];
388}
static uint32_t get_aligned_offset(uint32_t *currentOffset, SkSLType type, int arrayCount, int layout)
uint32_t currentOffset() const

◆ getUniformCStr()

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

Shortcut for getUniformVariable(u).c_str()

Implements GrGLSLUniformHandler.

Definition at line 71 of file GrVkUniformHandler.h.

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

◆ getUniformVariable()

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

Implements GrGLSLUniformHandler.

Definition at line 67 of file GrVkUniformHandler.h.

67 {
68 return fUniforms.item(u.toIndex()).fVariable;
69 }
T & item(int i)

◆ inputSamplerSwizzle()

skgpu::Swizzle GrVkUniformHandler::inputSamplerSwizzle ( SamplerHandle  handle) const
inlineoverrideprivatevirtual

Reimplemented from GrGLSLUniformHandler.

Definition at line 143 of file GrVkUniformHandler.h.

143 {
144 SkASSERT(handle.toIndex() == 0);
145 return fInputSwizzle;
146 }

◆ inputSamplerVariable()

const char * GrVkUniformHandler::inputSamplerVariable ( SamplerHandle  handle) const
inlineoverrideprivatevirtual

Reimplemented from GrGLSLUniformHandler.

Definition at line 136 of file GrVkUniformHandler.h.

136 {
137 // Currently we will only ever have one input sampler variable, though in the future we may
138 // expand to allow more inputs. For now assert that any requested handle maps to index 0,
139 // to make sure we didn't add multiple input samplers.
140 SkASSERT(handle.toIndex() == 0);
141 return fInputUniform.fVariable.c_str();
142 }

◆ internalAddUniformArray()

GrGLSLUniformHandler::UniformHandle GrVkUniformHandler::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 203 of file GrVkUniformHandler.cpp.

210 {
211 SkASSERT(name && strlen(name));
213
214 // TODO this is a bit hacky, lets think of a better way. Basically we need to be able to use
215 // the uniform view matrix name in the GP, and the GP is immutable so it has to tell the PB
216 // exactly what name it wants to use for the uniform view matrix. If we prefix anythings, then
217 // the names will mismatch. I think the correct solution is to have all GPs which need the
218 // uniform view matrix, they should upload the view matrix in their setData along with regular
219 // uniforms.
220 char prefix = 'u';
221 if ('u' == name[0] || !strncmp(name, GR_NO_MANGLE_PREFIX, strlen(GR_NO_MANGLE_PREFIX))) {
222 prefix = '\0';
223 }
224 SkString resolvedName = fProgramBuilder->nameVariable(prefix, name, mangleName);
225
226 VkUniformInfo tempInfo;
227 tempInfo.fVariable = GrShaderVar{std::move(resolvedName),
228 type,
230 arrayCount};
231
232 tempInfo.fVisibility = visibility;
233 tempInfo.fOwner = owner;
234 tempInfo.fRawName = SkString(name);
235
236 for (int layout = 0; layout < kLayoutCount; ++layout) {
237 tempInfo.fOffsets[layout] = get_aligned_offset(&fCurrentOffsets[layout],
238 type,
239 arrayCount,
240 layout);
241 }
242
243 fUniforms.push_back(tempInfo);
244
245 if (outName) {
246 *outName = fUniforms.back().fVariable.c_str();
247 }
248
249 return GrGLSLUniformHandler::UniformHandle(fUniforms.count() - 1);
250}
#define GR_NO_MANGLE_PREFIX
GrGLSLProgramDataManager::UniformHandle UniformHandle
static constexpr int kLayoutCount

◆ numUniforms()

int GrVkUniformHandler::numUniforms ( ) const
inlineoverridevirtual

Implements GrGLSLUniformHandler.

Definition at line 80 of file GrVkUniformHandler.h.

80 {
81 return fUniforms.count();
82 }

◆ samplerSwizzle()

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

Implements GrGLSLUniformHandler.

Definition at line 125 of file GrVkUniformHandler.h.

125 {
126 return fSamplerSwizzles[handle.toIndex()];
127 }

◆ samplerVariable()

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

Implements GrGLSLUniformHandler.

Definition at line 122 of file GrVkUniformHandler.h.

122 {
123 return fSamplers.item(handle.toIndex()).fVariable.c_str();
124 }

◆ uniform() [1/2]

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

Implements GrGLSLUniformHandler.

Definition at line 87 of file GrVkUniformHandler.h.

87 {
88 return fUniforms.item(idx);
89 }

◆ uniform() [2/2]

UniformInfo & GrVkUniformHandler::uniform ( int  idx)
inlineoverridevirtual

Implements GrGLSLUniformHandler.

Definition at line 84 of file GrVkUniformHandler.h.

84 {
85 return fUniforms.item(idx);
86 }

◆ usePushConstants()

bool GrVkUniformHandler::usePushConstants ( ) const
inline

Definition at line 91 of file GrVkUniformHandler.h.

91{ return fUsePushConstants; }

Friends And Related Symbol Documentation

◆ GrVkDescriptorSetManager

friend class GrVkDescriptorSetManager
friend

Definition at line 166 of file GrVkUniformHandler.h.

◆ GrVkPipelineStateBuilder

friend class GrVkPipelineStateBuilder
friend

Definition at line 165 of file GrVkUniformHandler.h.

Member Data Documentation

◆ kDescSetCount

constexpr int GrVkUniformHandler::kDescSetCount = kLastDescSet + 1
staticconstexpr

Definition at line 37 of file GrVkUniformHandler.h.

◆ kLayoutCount

constexpr int GrVkUniformHandler::kLayoutCount = kLastLayout + 1
staticconstexpr

Definition at line 55 of file GrVkUniformHandler.h.

◆ kUniformsPerBlock

const int GrVkUniformHandler::kUniformsPerBlock = 8
static

Definition at line 21 of file GrVkUniformHandler.h.


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