Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: src/sksl/SkSLSPIRVCodeGenerator.cpp

Issue 2187433003: added support for push_constant layout (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: rebased Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/sksl/SkSLSPIRVCodeGenerator.h ('k') | src/sksl/ast/SkSLASTLayout.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkSLSPIRVCodeGenerator.h" 8 #include "SkSLSPIRVCodeGenerator.h"
9 9
10 #include "string.h" 10 #include "string.h"
(...skipping 957 matching lines...) Expand 10 before | Expand all | Expand 10 after
968 if (fCapabilities & bit) { 968 if (fCapabilities & bit) {
969 this->writeInstruction(SpvOpCapability, (SpvId) i, out); 969 this->writeInstruction(SpvOpCapability, (SpvId) i, out);
970 } 970 }
971 } 971 }
972 } 972 }
973 973
974 SpvId SPIRVCodeGenerator::nextId() { 974 SpvId SPIRVCodeGenerator::nextId() {
975 return fIdCount++; 975 return fIdCount++;
976 } 976 }
977 977
978 void SPIRVCodeGenerator::writeStruct(const Type& type, SpvId resultId) { 978 void SPIRVCodeGenerator::writeStruct(const Type& type, const MemoryLayout& layou t, SpvId resultId) {
979 this->writeInstruction(SpvOpName, resultId, type.name().c_str(), fNameBuffer ); 979 this->writeInstruction(SpvOpName, resultId, type.name().c_str(), fNameBuffer );
980 // go ahead and write all of the field types, so we don't inadvertently writ e them while we're 980 // go ahead and write all of the field types, so we don't inadvertently writ e them while we're
981 // in the middle of writing the struct instruction 981 // in the middle of writing the struct instruction
982 std::vector<SpvId> types; 982 std::vector<SpvId> types;
983 for (const auto& f : type.fields()) { 983 for (const auto& f : type.fields()) {
984 types.push_back(this->getType(*f.fType)); 984 types.push_back(this->getType(*f.fType, layout));
985 } 985 }
986 this->writeOpCode(SpvOpTypeStruct, 2 + (int32_t) types.size(), fConstantBuff er); 986 this->writeOpCode(SpvOpTypeStruct, 2 + (int32_t) types.size(), fConstantBuff er);
987 this->writeWord(resultId, fConstantBuffer); 987 this->writeWord(resultId, fConstantBuffer);
988 for (SpvId id : types) { 988 for (SpvId id : types) {
989 this->writeWord(id, fConstantBuffer); 989 this->writeWord(id, fConstantBuffer);
990 } 990 }
991 size_t offset = 0; 991 size_t offset = 0;
992 for (int32_t i = 0; i < (int32_t) type.fields().size(); i++) { 992 for (int32_t i = 0; i < (int32_t) type.fields().size(); i++) {
993 size_t size = type.fields()[i].fType->size(); 993 size_t size = layout.size(*type.fields()[i].fType);
994 size_t alignment = type.fields()[i].fType->alignment(); 994 size_t alignment = layout.alignment(*type.fields()[i].fType);
995 size_t mod = offset % alignment; 995 size_t mod = offset % alignment;
996 if (mod != 0) { 996 if (mod != 0) {
997 offset += alignment - mod; 997 offset += alignment - mod;
998 } 998 }
999 this->writeInstruction(SpvOpMemberName, resultId, i, type.fields()[i].fN ame.c_str(), 999 this->writeInstruction(SpvOpMemberName, resultId, i, type.fields()[i].fN ame.c_str(),
1000 fNameBuffer); 1000 fNameBuffer);
1001 this->writeLayout(type.fields()[i].fModifiers.fLayout, resultId, i); 1001 this->writeLayout(type.fields()[i].fModifiers.fLayout, resultId, i);
1002 if (type.fields()[i].fModifiers.fLayout.fBuiltin < 0) { 1002 if (type.fields()[i].fModifiers.fLayout.fBuiltin < 0) {
1003 this->writeInstruction(SpvOpMemberDecorate, resultId, (SpvId) i, Spv DecorationOffset, 1003 this->writeInstruction(SpvOpMemberDecorate, resultId, (SpvId) i, Spv DecorationOffset,
1004 (SpvId) offset, fDecorationBuffer); 1004 (SpvId) offset, fDecorationBuffer);
1005 } 1005 }
1006 if (type.fields()[i].fType->kind() == Type::kMatrix_Kind) { 1006 if (type.fields()[i].fType->kind() == Type::kMatrix_Kind) {
1007 this->writeInstruction(SpvOpMemberDecorate, resultId, i, SpvDecorati onColMajor, 1007 this->writeInstruction(SpvOpMemberDecorate, resultId, i, SpvDecorati onColMajor,
1008 fDecorationBuffer); 1008 fDecorationBuffer);
1009 this->writeInstruction(SpvOpMemberDecorate, resultId, i, SpvDecorati onMatrixStride, 1009 this->writeInstruction(SpvOpMemberDecorate, resultId, i, SpvDecorati onMatrixStride,
1010 (SpvId) type.fields()[i].fType->stride(), fDe corationBuffer); 1010 (SpvId) layout.stride(*type.fields()[i].fType ),
1011 fDecorationBuffer);
1011 } 1012 }
1012 offset += size; 1013 offset += size;
1013 Type::Kind kind = type.fields()[i].fType->kind(); 1014 Type::Kind kind = type.fields()[i].fType->kind();
1014 if ((kind == Type::kArray_Kind || kind == Type::kStruct_Kind) && offset % alignment != 0) { 1015 if ((kind == Type::kArray_Kind || kind == Type::kStruct_Kind) && offset % alignment != 0) {
1015 offset += alignment - offset % alignment; 1016 offset += alignment - offset % alignment;
1016 } 1017 }
1017 } 1018 }
1018 } 1019 }
1019 1020
1020 SpvId SPIRVCodeGenerator::getType(const Type& type) { 1021 SpvId SPIRVCodeGenerator::getType(const Type& type) {
1021 auto entry = fTypeMap.find(type.name()); 1022 return this->getType(type, fDefaultLayout);
1023 }
1024
1025 SpvId SPIRVCodeGenerator::getType(const Type& type, const MemoryLayout& layout) {
1026 SkString key = type.name() + to_string((int) layout.fStd);
1027 auto entry = fTypeMap.find(key);
1022 if (entry == fTypeMap.end()) { 1028 if (entry == fTypeMap.end()) {
1023 SpvId result = this->nextId(); 1029 SpvId result = this->nextId();
1024 switch (type.kind()) { 1030 switch (type.kind()) {
1025 case Type::kScalar_Kind: 1031 case Type::kScalar_Kind:
1026 if (type == *fContext.fBool_Type) { 1032 if (type == *fContext.fBool_Type) {
1027 this->writeInstruction(SpvOpTypeBool, result, fConstantBuffe r); 1033 this->writeInstruction(SpvOpTypeBool, result, fConstantBuffe r);
1028 } else if (type == *fContext.fInt_Type) { 1034 } else if (type == *fContext.fInt_Type) {
1029 this->writeInstruction(SpvOpTypeInt, result, 32, 1, fConstan tBuffer); 1035 this->writeInstruction(SpvOpTypeInt, result, 32, 1, fConstan tBuffer);
1030 } else if (type == *fContext.fUInt_Type) { 1036 } else if (type == *fContext.fUInt_Type) {
1031 this->writeInstruction(SpvOpTypeInt, result, 32, 0, fConstan tBuffer); 1037 this->writeInstruction(SpvOpTypeInt, result, 32, 0, fConstan tBuffer);
1032 } else if (type == *fContext.fFloat_Type) { 1038 } else if (type == *fContext.fFloat_Type) {
1033 this->writeInstruction(SpvOpTypeFloat, result, 32, fConstant Buffer); 1039 this->writeInstruction(SpvOpTypeFloat, result, 32, fConstant Buffer);
1034 } else if (type == *fContext.fDouble_Type) { 1040 } else if (type == *fContext.fDouble_Type) {
1035 this->writeInstruction(SpvOpTypeFloat, result, 64, fConstant Buffer); 1041 this->writeInstruction(SpvOpTypeFloat, result, 64, fConstant Buffer);
1036 } else { 1042 } else {
1037 ASSERT(false); 1043 ASSERT(false);
1038 } 1044 }
1039 break; 1045 break;
1040 case Type::kVector_Kind: 1046 case Type::kVector_Kind:
1041 this->writeInstruction(SpvOpTypeVector, result, 1047 this->writeInstruction(SpvOpTypeVector, result,
1042 this->getType(type.componentType()), 1048 this->getType(type.componentType(), layou t),
1043 type.columns(), fConstantBuffer); 1049 type.columns(), fConstantBuffer);
1044 break; 1050 break;
1045 case Type::kMatrix_Kind: 1051 case Type::kMatrix_Kind:
1046 this->writeInstruction(SpvOpTypeMatrix, result, 1052 this->writeInstruction(SpvOpTypeMatrix, result,
1047 this->getType(index_type(fContext, type)) , 1053 this->getType(index_type(fContext, type), layout),
1048 type.columns(), fConstantBuffer); 1054 type.columns(), fConstantBuffer);
1049 break; 1055 break;
1050 case Type::kStruct_Kind: 1056 case Type::kStruct_Kind:
1051 this->writeStruct(type, result); 1057 this->writeStruct(type, layout, result);
1052 break; 1058 break;
1053 case Type::kArray_Kind: { 1059 case Type::kArray_Kind: {
1054 if (type.columns() > 0) { 1060 if (type.columns() > 0) {
1055 IntLiteral count(fContext, Position(), type.columns()); 1061 IntLiteral count(fContext, Position(), type.columns());
1056 this->writeInstruction(SpvOpTypeArray, result, 1062 this->writeInstruction(SpvOpTypeArray, result,
1057 this->getType(type.componentType()), 1063 this->getType(type.componentType(), l ayout),
1058 this->writeIntLiteral(count), fConsta ntBuffer); 1064 this->writeIntLiteral(count), fConsta ntBuffer);
1059 this->writeInstruction(SpvOpDecorate, result, SpvDecorationA rrayStride, 1065 this->writeInstruction(SpvOpDecorate, result, SpvDecorationA rrayStride,
1060 (int32_t) type.stride(), fDecorationB uffer); 1066 (int32_t) layout.stride(type),
1067 fDecorationBuffer);
1061 } else { 1068 } else {
1062 ABORT("runtime-sized arrays are not yet supported"); 1069 ABORT("runtime-sized arrays are not yet supported");
1063 this->writeInstruction(SpvOpTypeRuntimeArray, result, 1070 this->writeInstruction(SpvOpTypeRuntimeArray, result,
1064 this->getType(type.componentType()), fConstantBuffer); 1071 this->getType(type.componentType(), l ayout),
1072 fConstantBuffer);
1065 } 1073 }
1066 break; 1074 break;
1067 } 1075 }
1068 case Type::kSampler_Kind: { 1076 case Type::kSampler_Kind: {
1069 SpvId image = result; 1077 SpvId image = result;
1070 if (SpvDimSubpassData != type.dimensions()) { 1078 if (SpvDimSubpassData != type.dimensions()) {
1071 image = this->nextId(); 1079 image = this->nextId();
1072 } 1080 }
1073 this->writeInstruction(SpvOpTypeImage, image, this->getType(*fCo ntext.fFloat_Type), 1081 this->writeInstruction(SpvOpTypeImage, image,
1082 this->getType(*fContext.fFloat_Type, layo ut),
1074 type.dimensions(), type.isDepth(), type.i sArrayed(), 1083 type.dimensions(), type.isDepth(), type.i sArrayed(),
1075 type.isMultisampled(), type.isSampled() ? 1 : 2, 1084 type.isMultisampled(), type.isSampled() ? 1 : 2,
1076 SpvImageFormatUnknown, fConstantBuffer); 1085 SpvImageFormatUnknown, fConstantBuffer);
1077 if (SpvDimSubpassData != type.dimensions()) { 1086 if (SpvDimSubpassData != type.dimensions()) {
1078 this->writeInstruction(SpvOpTypeSampledImage, result, image, fConstantBuffer); 1087 this->writeInstruction(SpvOpTypeSampledImage, result, image, fConstantBuffer);
1079 } 1088 }
1080 break; 1089 break;
1081 } 1090 }
1082 default: 1091 default:
1083 if (type == *fContext.fVoid_Type) { 1092 if (type == *fContext.fVoid_Type) {
1084 this->writeInstruction(SpvOpTypeVoid, result, fConstantBuffe r); 1093 this->writeInstruction(SpvOpTypeVoid, result, fConstantBuffe r);
1085 } else { 1094 } else {
1086 ABORT("invalid type: %s", type.description().c_str()); 1095 ABORT("invalid type: %s", type.description().c_str());
1087 } 1096 }
1088 } 1097 }
1089 fTypeMap[type.name()] = result; 1098 fTypeMap[key] = result;
1090 return result; 1099 return result;
1091 } 1100 }
1092 return entry->second; 1101 return entry->second;
1093 } 1102 }
1094 1103
1095 SpvId SPIRVCodeGenerator::getFunctionType(const FunctionDeclaration& function) { 1104 SpvId SPIRVCodeGenerator::getFunctionType(const FunctionDeclaration& function) {
1096 SkString key = function.fReturnType.description() + "("; 1105 SkString key = function.fReturnType.description() + "(";
1097 SkString separator; 1106 SkString separator;
1098 for (size_t i = 0; i < function.fParameters.size(); i++) { 1107 for (size_t i = 0; i < function.fParameters.size(); i++) {
1099 key += separator; 1108 key += separator;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1142 this->writeWord(returnType, fConstantBuffer); 1151 this->writeWord(returnType, fConstantBuffer);
1143 for (SpvId id : parameterTypes) { 1152 for (SpvId id : parameterTypes) {
1144 this->writeWord(id, fConstantBuffer); 1153 this->writeWord(id, fConstantBuffer);
1145 } 1154 }
1146 fTypeMap[key] = result; 1155 fTypeMap[key] = result;
1147 return result; 1156 return result;
1148 } 1157 }
1149 return entry->second; 1158 return entry->second;
1150 } 1159 }
1151 1160
1152 SpvId SPIRVCodeGenerator::getPointerType(const Type& type, 1161 SpvId SPIRVCodeGenerator::getPointerType(const Type& type, SpvStorageClass_ stor ageClass) {
1162 return this->getPointerType(type, fDefaultLayout, storageClass);
1163 }
1164
1165 SpvId SPIRVCodeGenerator::getPointerType(const Type& type, const MemoryLayout& l ayout,
1153 SpvStorageClass_ storageClass) { 1166 SpvStorageClass_ storageClass) {
1154 SkString key = type.description() + "*" + to_string(storageClass); 1167 SkString key = type.description() + "*" + to_string(layout.fStd) + to_string (storageClass);
1155 auto entry = fTypeMap.find(key); 1168 auto entry = fTypeMap.find(key);
1156 if (entry == fTypeMap.end()) { 1169 if (entry == fTypeMap.end()) {
1157 SpvId result = this->nextId(); 1170 SpvId result = this->nextId();
1158 this->writeInstruction(SpvOpTypePointer, result, storageClass, 1171 this->writeInstruction(SpvOpTypePointer, result, storageClass,
1159 this->getType(type), fConstantBuffer); 1172 this->getType(type), fConstantBuffer);
1160 fTypeMap[key] = result; 1173 fTypeMap[key] = result;
1161 return result; 1174 return result;
1162 } 1175 }
1163 return entry->second; 1176 return entry->second;
1164 } 1177 }
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
1583 return this->writeVectorConstructor(c, out); 1596 return this->writeVectorConstructor(c, out);
1584 case Type::kMatrix_Kind: 1597 case Type::kMatrix_Kind:
1585 return this->writeMatrixConstructor(c, out); 1598 return this->writeMatrixConstructor(c, out);
1586 default: 1599 default:
1587 ABORT("unsupported constructor: %s", c.description().c_str()); 1600 ABORT("unsupported constructor: %s", c.description().c_str());
1588 } 1601 }
1589 } 1602 }
1590 1603
1591 SpvStorageClass_ get_storage_class(const Modifiers& modifiers) { 1604 SpvStorageClass_ get_storage_class(const Modifiers& modifiers) {
1592 if (modifiers.fFlags & Modifiers::kIn_Flag) { 1605 if (modifiers.fFlags & Modifiers::kIn_Flag) {
1606 ASSERT(!modifiers.fLayout.fPushConstant);
1593 return SpvStorageClassInput; 1607 return SpvStorageClassInput;
1594 } else if (modifiers.fFlags & Modifiers::kOut_Flag) { 1608 } else if (modifiers.fFlags & Modifiers::kOut_Flag) {
1609 ASSERT(!modifiers.fLayout.fPushConstant);
1595 return SpvStorageClassOutput; 1610 return SpvStorageClassOutput;
1596 } else if (modifiers.fFlags & Modifiers::kUniform_Flag) { 1611 } else if (modifiers.fFlags & Modifiers::kUniform_Flag) {
1612 if (modifiers.fLayout.fPushConstant) {
1613 return SpvStorageClassPushConstant;
1614 }
1597 return SpvStorageClassUniform; 1615 return SpvStorageClassUniform;
1598 } else { 1616 } else {
1599 return SpvStorageClassFunction; 1617 return SpvStorageClassFunction;
1600 } 1618 }
1601 } 1619 }
1602 1620
1603 SpvStorageClass_ get_storage_class(const Expression& expr) { 1621 SpvStorageClass_ get_storage_class(const Expression& expr) {
1604 switch (expr.fKind) { 1622 switch (expr.fKind) {
1605 case Expression::kVariableReference_Kind: 1623 case Expression::kVariableReference_Kind:
1606 return get_storage_class(((VariableReference&) expr).fVariable.fModi fiers); 1624 return get_storage_class(((VariableReference&) expr).fVariable.fModi fiers);
(...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after
2397 this->writeInstruction(SpvOpDecorate, target, member, SpvDecorationInput AttachmentIndex, 2415 this->writeInstruction(SpvOpDecorate, target, member, SpvDecorationInput AttachmentIndex,
2398 layout.fInputAttachmentIndex, fDecorationBuffer); 2416 layout.fInputAttachmentIndex, fDecorationBuffer);
2399 } 2417 }
2400 if (layout.fBuiltin >= 0) { 2418 if (layout.fBuiltin >= 0) {
2401 this->writeInstruction(SpvOpMemberDecorate, target, member, SpvDecoratio nBuiltIn, 2419 this->writeInstruction(SpvOpMemberDecorate, target, member, SpvDecoratio nBuiltIn,
2402 layout.fBuiltin, fDecorationBuffer); 2420 layout.fBuiltin, fDecorationBuffer);
2403 } 2421 }
2404 } 2422 }
2405 2423
2406 SpvId SPIRVCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf) { 2424 SpvId SPIRVCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf) {
2407 SpvId type = this->getType(intf.fVariable.fType); 2425 MemoryLayout layout = intf.fVariable.fModifiers.fLayout.fPushConstant ?
2426 MemoryLayout(MemoryLayout::k430_Standard) :
2427 fDefaultLayout;
2428 SpvId type = this->getType(intf.fVariable.fType, layout);
2408 SpvId result = this->nextId(); 2429 SpvId result = this->nextId();
2409 this->writeInstruction(SpvOpDecorate, type, SpvDecorationBlock, fDecorationB uffer); 2430 this->writeInstruction(SpvOpDecorate, type, SpvDecorationBlock, fDecorationB uffer);
2410 SpvStorageClass_ storageClass = get_storage_class(intf.fVariable.fModifiers) ; 2431 SpvStorageClass_ storageClass = get_storage_class(intf.fVariable.fModifiers) ;
2411 SpvId ptrType = this->nextId(); 2432 SpvId ptrType = this->nextId();
2412 this->writeInstruction(SpvOpTypePointer, ptrType, storageClass, type, fConst antBuffer); 2433 this->writeInstruction(SpvOpTypePointer, ptrType, storageClass, type, fConst antBuffer);
2413 this->writeInstruction(SpvOpVariable, ptrType, result, storageClass, fConsta ntBuffer); 2434 this->writeInstruction(SpvOpVariable, ptrType, result, storageClass, fConsta ntBuffer);
2414 this->writeLayout(intf.fVariable.fModifiers.fLayout, result); 2435 this->writeLayout(intf.fVariable.fModifiers.fLayout, result);
2415 fVariableMap[&intf.fVariable] = result; 2436 fVariableMap[&intf.fVariable] = result;
2416 return result; 2437 return result;
2417 } 2438 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2453 } 2474 }
2454 SpvId id = this->nextId(); 2475 SpvId id = this->nextId();
2455 fVariableMap[var] = id; 2476 fVariableMap[var] = id;
2456 SpvId type = this->getPointerType(var->fType, storageClass); 2477 SpvId type = this->getPointerType(var->fType, storageClass);
2457 this->writeInstruction(SpvOpVariable, type, id, storageClass, fConstantB uffer); 2478 this->writeInstruction(SpvOpVariable, type, id, storageClass, fConstantB uffer);
2458 this->writeInstruction(SpvOpName, id, var->fName.c_str(), fNameBuffer); 2479 this->writeInstruction(SpvOpName, id, var->fName.c_str(), fNameBuffer);
2459 if (var->fType.kind() == Type::kMatrix_Kind) { 2480 if (var->fType.kind() == Type::kMatrix_Kind) {
2460 this->writeInstruction(SpvOpMemberDecorate, id, (SpvId) i, SpvDecora tionColMajor, 2481 this->writeInstruction(SpvOpMemberDecorate, id, (SpvId) i, SpvDecora tionColMajor,
2461 fDecorationBuffer); 2482 fDecorationBuffer);
2462 this->writeInstruction(SpvOpMemberDecorate, id, (SpvId) i, SpvDecora tionMatrixStride, 2483 this->writeInstruction(SpvOpMemberDecorate, id, (SpvId) i, SpvDecora tionMatrixStride,
2463 (SpvId) var->fType.stride(), fDecorationBuffe r); 2484 (SpvId) fDefaultLayout.stride(var->fType), fD ecorationBuffer);
2464 } 2485 }
2465 if (varDecl.fValue) { 2486 if (varDecl.fValue) {
2466 ASSERT(!fCurrentBlock); 2487 ASSERT(!fCurrentBlock);
2467 fCurrentBlock = -1; 2488 fCurrentBlock = -1;
2468 SpvId value = this->writeExpression(*varDecl.fValue, fGlobalInitiali zersBuffer); 2489 SpvId value = this->writeExpression(*varDecl.fValue, fGlobalInitiali zersBuffer);
2469 this->writeInstruction(SpvOpStore, id, value, fGlobalInitializersBuf fer); 2490 this->writeInstruction(SpvOpStore, id, value, fGlobalInitializersBuf fer);
2470 fCurrentBlock = 0; 2491 fCurrentBlock = 0;
2471 } 2492 }
2472 this->writeLayout(var->fModifiers.fLayout, id); 2493 this->writeLayout(var->fModifiers.fLayout, id);
2473 } 2494 }
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
2694 this->writeWord(SpvVersion, out); 2715 this->writeWord(SpvVersion, out);
2695 this->writeWord(SKSL_MAGIC, out); 2716 this->writeWord(SKSL_MAGIC, out);
2696 SkDynamicMemoryWStream buffer; 2717 SkDynamicMemoryWStream buffer;
2697 this->writeInstructions(program, buffer); 2718 this->writeInstructions(program, buffer);
2698 this->writeWord(fIdCount, out); 2719 this->writeWord(fIdCount, out);
2699 this->writeWord(0, out); // reserved, always zero 2720 this->writeWord(0, out); // reserved, always zero
2700 write_data(*buffer.detachAsData(), out); 2721 write_data(*buffer.detachAsData(), out);
2701 } 2722 }
2702 2723
2703 } 2724 }
OLDNEW
« no previous file with comments | « src/sksl/SkSLSPIRVCodeGenerator.h ('k') | src/sksl/ast/SkSLASTLayout.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698