| Index: src/sksl/SkSLSPIRVCodeGenerator.cpp
|
| diff --git a/src/sksl/SkSLSPIRVCodeGenerator.cpp b/src/sksl/SkSLSPIRVCodeGenerator.cpp
|
| index b899e4fcbd4a98590c8e79fe26645fe931582a46..a4919686742f20c006b2a39f933e2aeb0184b228 100644
|
| --- a/src/sksl/SkSLSPIRVCodeGenerator.cpp
|
| +++ b/src/sksl/SkSLSPIRVCodeGenerator.cpp
|
| @@ -968,13 +968,13 @@
|
| return fIdCount++;
|
| }
|
|
|
| -void SPIRVCodeGenerator::writeStruct(const Type& type, const MemoryLayout& layout, SpvId resultId) {
|
| +void SPIRVCodeGenerator::writeStruct(const Type& type, SpvId resultId) {
|
| this->writeInstruction(SpvOpName, resultId, type.name().c_str(), fNameBuffer);
|
| // go ahead and write all of the field types, so we don't inadvertently write them while we're
|
| // in the middle of writing the struct instruction
|
| std::vector<SpvId> types;
|
| for (const auto& f : type.fields()) {
|
| - types.push_back(this->getType(*f.fType, layout));
|
| + types.push_back(this->getType(*f.fType));
|
| }
|
| this->writeOpCode(SpvOpTypeStruct, 2 + (int32_t) types.size(), fConstantBuffer);
|
| this->writeWord(resultId, fConstantBuffer);
|
| @@ -983,8 +983,8 @@
|
| }
|
| size_t offset = 0;
|
| for (int32_t i = 0; i < (int32_t) type.fields().size(); i++) {
|
| - size_t size = layout.size(*type.fields()[i].fType);
|
| - size_t alignment = layout.alignment(*type.fields()[i].fType);
|
| + size_t size = type.fields()[i].fType->size();
|
| + size_t alignment = type.fields()[i].fType->alignment();
|
| size_t mod = offset % alignment;
|
| if (mod != 0) {
|
| offset += alignment - mod;
|
| @@ -1000,8 +1000,7 @@
|
| this->writeInstruction(SpvOpMemberDecorate, resultId, i, SpvDecorationColMajor,
|
| fDecorationBuffer);
|
| this->writeInstruction(SpvOpMemberDecorate, resultId, i, SpvDecorationMatrixStride,
|
| - (SpvId) layout.stride(*type.fields()[i].fType),
|
| - fDecorationBuffer);
|
| + (SpvId) type.fields()[i].fType->stride(), fDecorationBuffer);
|
| }
|
| offset += size;
|
| Type::Kind kind = type.fields()[i].fType->kind();
|
| @@ -1013,12 +1012,7 @@
|
| }
|
|
|
| SpvId SPIRVCodeGenerator::getType(const Type& type) {
|
| - return this->getType(type, fDefaultLayout);
|
| -}
|
| -
|
| -SpvId SPIRVCodeGenerator::getType(const Type& type, const MemoryLayout& layout) {
|
| - std::string key = type.name() + to_string((int) layout.fStd);
|
| - auto entry = fTypeMap.find(key);
|
| + auto entry = fTypeMap.find(type.name());
|
| if (entry == fTypeMap.end()) {
|
| SpvId result = this->nextId();
|
| switch (type.kind()) {
|
| @@ -1039,38 +1033,35 @@
|
| break;
|
| case Type::kVector_Kind:
|
| this->writeInstruction(SpvOpTypeVector, result,
|
| - this->getType(type.componentType(), layout),
|
| + this->getType(type.componentType()),
|
| type.columns(), fConstantBuffer);
|
| break;
|
| case Type::kMatrix_Kind:
|
| this->writeInstruction(SpvOpTypeMatrix, result,
|
| - this->getType(index_type(fContext, type), layout),
|
| + this->getType(index_type(fContext, type)),
|
| type.columns(), fConstantBuffer);
|
| break;
|
| case Type::kStruct_Kind:
|
| - this->writeStruct(type, layout, result);
|
| + this->writeStruct(type, result);
|
| break;
|
| case Type::kArray_Kind: {
|
| if (type.columns() > 0) {
|
| IntLiteral count(fContext, Position(), type.columns());
|
| this->writeInstruction(SpvOpTypeArray, result,
|
| - this->getType(type.componentType(), layout),
|
| + this->getType(type.componentType()),
|
| this->writeIntLiteral(count), fConstantBuffer);
|
| this->writeInstruction(SpvOpDecorate, result, SpvDecorationArrayStride,
|
| - (int32_t) layout.stride(type),
|
| - fDecorationBuffer);
|
| + (int32_t) type.stride(), fDecorationBuffer);
|
| } else {
|
| ABORT("runtime-sized arrays are not yet supported");
|
| this->writeInstruction(SpvOpTypeRuntimeArray, result,
|
| - this->getType(type.componentType(), layout),
|
| - fConstantBuffer);
|
| + this->getType(type.componentType()), fConstantBuffer);
|
| }
|
| break;
|
| }
|
| case Type::kSampler_Kind: {
|
| SpvId image = this->nextId();
|
| - this->writeInstruction(SpvOpTypeImage, image,
|
| - this->getType(*fContext.fFloat_Type, layout),
|
| + this->writeInstruction(SpvOpTypeImage, image, this->getType(*fContext.fFloat_Type),
|
| type.dimensions(), type.isDepth(), type.isArrayed(),
|
| type.isMultisampled(), type.isSampled(),
|
| SpvImageFormatUnknown, fConstantBuffer);
|
| @@ -1084,7 +1075,7 @@
|
| ABORT("invalid type: %s", type.description().c_str());
|
| }
|
| }
|
| - fTypeMap[key] = result;
|
| + fTypeMap[type.name()] = result;
|
| return result;
|
| }
|
| return entry->second;
|
| @@ -1147,13 +1138,9 @@
|
| return entry->second;
|
| }
|
|
|
| -SpvId SPIRVCodeGenerator::getPointerType(const Type& type, SpvStorageClass_ storageClass) {
|
| - return this->getPointerType(type, fDefaultLayout, storageClass);
|
| -}
|
| -
|
| -SpvId SPIRVCodeGenerator::getPointerType(const Type& type, const MemoryLayout& layout,
|
| +SpvId SPIRVCodeGenerator::getPointerType(const Type& type,
|
| SpvStorageClass_ storageClass) {
|
| - std::string key = type.description() + "*" + to_string(layout.fStd) + to_string(storageClass);
|
| + std::string key = type.description() + "*" + to_string(storageClass);
|
| auto entry = fTypeMap.find(key);
|
| if (entry == fTypeMap.end()) {
|
| SpvId result = this->nextId();
|
| @@ -1564,15 +1551,10 @@
|
|
|
| SpvStorageClass_ get_storage_class(const Modifiers& modifiers) {
|
| if (modifiers.fFlags & Modifiers::kIn_Flag) {
|
| - ASSERT(!modifiers.fLayout.fPushConstant);
|
| return SpvStorageClassInput;
|
| } else if (modifiers.fFlags & Modifiers::kOut_Flag) {
|
| - ASSERT(!modifiers.fLayout.fPushConstant);
|
| return SpvStorageClassOutput;
|
| } else if (modifiers.fFlags & Modifiers::kUniform_Flag) {
|
| - if (modifiers.fLayout.fPushConstant) {
|
| - return SpvStorageClassPushConstant;
|
| - }
|
| return SpvStorageClassUniform;
|
| } else {
|
| return SpvStorageClassFunction;
|
| @@ -2376,10 +2358,7 @@
|
| }
|
|
|
| SpvId SPIRVCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf) {
|
| - MemoryLayout layout = intf.fVariable.fModifiers.fLayout.fPushConstant ?
|
| - MemoryLayout(MemoryLayout::k430_Standard) :
|
| - fDefaultLayout;
|
| - SpvId type = this->getType(intf.fVariable.fType, layout);
|
| + SpvId type = this->getType(intf.fVariable.fType);
|
| SpvId result = this->nextId();
|
| this->writeInstruction(SpvOpDecorate, type, SpvDecorationBlock, fDecorationBuffer);
|
| SpvStorageClass_ storageClass = get_storage_class(intf.fVariable.fModifiers);
|
| @@ -2432,11 +2411,10 @@
|
| this->writeInstruction(SpvOpVariable, type, id, storageClass, fConstantBuffer);
|
| this->writeInstruction(SpvOpName, id, var->fName.c_str(), fNameBuffer);
|
| if (var->fType.kind() == Type::kMatrix_Kind) {
|
| - this->writeInstruction(SpvOpMemberDecorate, id, (SpvId) i, SpvDecorationColMajor,
|
| + this->writeInstruction(SpvOpMemberDecorate, id, (SpvId) i, SpvDecorationColMajor,
|
| fDecorationBuffer);
|
| - this->writeInstruction(SpvOpMemberDecorate, id, (SpvId) i, SpvDecorationMatrixStride,
|
| - (SpvId) fDefaultLayout.stride(var->fType),
|
| - fDecorationBuffer);
|
| + this->writeInstruction(SpvOpMemberDecorate, id, (SpvId) i, SpvDecorationMatrixStride,
|
| + (SpvId) var->fType.stride(), fDecorationBuffer);
|
| }
|
| if (varDecl.fValue) {
|
| ASSERT(!fCurrentBlock);
|
|
|