diff --git a/m133/src/sksl/SkSLIntrinsicList.h b/m133/src/sksl/SkSLIntrinsicList.h index cf6750f49ba2df46e0b353130c6ef5d380b682c8..265b14bd728f78ba94d010f54043aefe9d293db2 100644 --- a/m133/src/sksl/SkSLIntrinsicList.h +++ b/m133/src/sksl/SkSLIntrinsicList.h @@ -124,6 +124,7 @@ #define SKSL_INTRINSIC_LIST \ SKSL_INTRINSIC_LIST_BASE \ SKSL_INTRINSIC(textureSize) \ + SKSL_INTRINSIC(sampleGather) \ SKSL_INTRINSIC(nonuniformEXT) #else // SKSL_EXT #define SKSL_INTRINSIC_LIST SKSL_INTRINSIC_LIST_BASE diff --git a/m133/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp b/m133/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp index cf89700e4652763a24fb7f254a30710c29b0eb9d..651c26095ee7638b3508b7d1f031fd192adbc411 100644 --- a/m133/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp +++ b/m133/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp @@ -233,6 +233,7 @@ private: kWorkgroupBarrier_SpecialIntrinsic, #ifdef SKSL_EXT kTextureSize_SpecialIntrinsic, + kSampleGather_SpecialIntrinsic, kNonuniformEXT_SpecialIntrinsic, #endif }; @@ -980,6 +981,7 @@ SPIRVCodeGenerator::Intrinsic SPIRVCodeGenerator::getIntrinsic(IntrinsicKind ik) case k_workgroupBarrier_IntrinsicKind: return SPECIAL(WorkgroupBarrier); #ifdef SKSL_EXT case k_textureSize_IntrinsicKind: return SPECIAL(TextureSize); + case k_sampleGather_IntrinsicKind: return SPECIAL(SampleGather); case k_nonuniformEXT_IntrinsicKind: return SPECIAL(NonuniformEXT); #endif default: @@ -2502,6 +2504,21 @@ SpvId SPIRVCodeGenerator::writeSpecialIntrinsic(const FunctionCall& c, SpecialIn this->writeInstruction(SpvOpImageQuerySizeLod, dimsType, result, image, lod, out); break; } + case kSampleGather_SpecialIntrinsic: { + SpvOp_ op = SpvOpImageGather; + SpvId type = this->getType(callType); + SpvId sampler = this->writeExpression(*arguments[0], out); + SpvId uv = this->writeExpression(*arguments[1], out); + SpvId comp; + if (arguments.size() == 3) { + comp = this->writeExpression(*arguments[2], out); + } else { + SkASSERT(arguments.size() == 2); + comp = this->writeLiteral(0, *fContext.fTypes.fInt); + } + this->writeInstruction(op, type, result, sampler, uv, comp, out); + break; + } case kNonuniformEXT_SpecialIntrinsic: { fCapabilitiesExt.insert(SpvCapabilityShaderNonUniform); SpvId dimsType = this->getType(*fContext.fTypes.fUInt); diff --git a/m133/src/sksl/sksl_ext.sksl.h b/m133/src/sksl/sksl_ext.sksl.h index 731ef32d111fc3226a547ee3ce31f1fd867e1025..751eebf0a0949957fab46ae9444629ba9a826dc9 100644 --- a/m133/src/sksl/sksl_ext.sksl.h +++ b/m133/src/sksl/sksl_ext.sksl.h @@ -385,6 +385,10 @@ $pure float coverage_bias(float scale) { // add the support of textureSize int2 textureSize(sampler2D x, int y); +// add the support of textureGather +half4 sampleGather(sampler2D s, float2 p); +half4 sampleGather(sampler2D s, float2 p, int comp); + // add the support of nonuniformEXT uint nonuniformEXT(uint x); )"}, diff --git a/src/sksl/SkSLIntrinsicList.h b/src/sksl/SkSLIntrinsicList.h index c8060d9e8ded413de2e72fdcb4b29011493697bb..334181aa76713adc75212241c6edd814a03cf9fc 100644 --- a/src/sksl/SkSLIntrinsicList.h +++ b/src/sksl/SkSLIntrinsicList.h @@ -109,6 +109,7 @@ #define SKSL_INTRINSIC_LIST \ SKSL_INTRINSIC_LIST_BASE \ SKSL_INTRINSIC(textureSize) \ + SKSL_INTRINSIC(sampleGather) \ SKSL_INTRINSIC(nonuniformEXT) #else // SKSL_EXT #define SKSL_INTRINSIC_LIST SKSL_INTRINSIC_LIST_BASE diff --git a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp index 3b93f6baba71943143b7fd91b2056b62e944f244..a8e693f8a8cfb8c18d5b53816d621befbe0137f1 100644 --- a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp +++ b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp @@ -209,6 +209,7 @@ void SPIRVCodeGenerator::setupIntrinsics() { SpvOpUndef); #ifdef SKSL_EXT fIntrinsicMap[k_textureSize_IntrinsicKind] = SPECIAL(TextureSize); + fIntrinsicMap[k_sampleGather_IntrinsicKind] = SPECIAL(SampleGather); fIntrinsicMap[k_nonuniformEXT_IntrinsicKind] = SPECIAL(NonuniformEXT); #endif // interpolateAt* not yet supported... @@ -1284,6 +1285,21 @@ SpvId SPIRVCodeGenerator::writeSpecialIntrinsic(const FunctionCall& c, SpecialIn this->writeInstruction(SpvOpImageQuerySizeLod, dimsType, result, image, lod, out); break; } + case kSampleGather_SpecialIntrinsic: { + SpvOp_ op = SpvOpImageGather; + SpvId type = this->getType(callType); + SpvId sampler = this->writeExpression(*arguments[0], out); + SpvId uv = this->writeExpression(*arguments[1], out); + SpvId comp; + if (arguments.size() == 3) { + comp = this->writeExpression(*arguments[2], out); + } else { + SkASSERT(arguments.size() == 2); + comp = this->writeLiteral(0, *fContext.fTypes.fInt); + } + this->writeInstruction(op, type, result, sampler, uv, comp, out); + break; + } case kNonuniformEXT_SpecialIntrinsic: { fCapabilitiesExt.insert(SpvCapabilityShaderNonUniform); SpvId dimsType = this->getType(*fContext.fTypes.fUInt); diff --git a/src/sksl/codegen/SkSLSPIRVCodeGenerator.h b/src/sksl/codegen/SkSLSPIRVCodeGenerator.h index 6738d96d3611c3f85c8f549ad1f52598caaa812b..eb4b768a652b99ea1a701f0812b932413da61b1e 100644 --- a/src/sksl/codegen/SkSLSPIRVCodeGenerator.h +++ b/src/sksl/codegen/SkSLSPIRVCodeGenerator.h @@ -167,6 +167,7 @@ private: kTexture_SpecialIntrinsic, #ifdef SKSL_EXT kTextureSize_SpecialIntrinsic, + kSampleGather_SpecialIntrinsic, kNonuniformEXT_SpecialIntrinsic, #endif }; diff --git a/src/sksl/sksl_ext.sksl.h b/src/sksl/sksl_ext.sksl.h index c2e5b33f3d438f31e6c0dd44e228bc51331a6275..8c62a954665b749b92778d1d5cb81cb445b942cb 100644 --- a/src/sksl/sksl_ext.sksl.h +++ b/src/sksl/sksl_ext.sksl.h @@ -560,6 +560,10 @@ half cross(half2 a, half2 b) { // add the support of textureSize int2 textureSize(sampler2D x, int y); +// add the support of textureGather +half4 sampleGather(sampler2D s, float2 p); +half4 sampleGather(sampler2D s, float2 p, int comp); + // add the support of nonuniformEXT uint nonuniformEXT(uint x); )"}