SkSL: implement full support for separate textures and samplers.
This extends the support for separate textures and samplers to include 1D, 2D, 3D, ExternalOES, Cube, 2DRect, Buffer and ISampler2D. The new texture types are now mandatory for a texturesampler which generates SPIR-V, so we can remove the special case code for 2D previously landed. Change-Id: Iec4bd6dc456169e6f4914ac416a10cd9720c42e0 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/230556 Reviewed-by: Ethan Nicholas <ethannicholas@google.com> Commit-Queue: Stephen White <senorblanco@chromium.org>
This commit is contained in:
parent
406ff500a4
commit
792e23044d
@ -91,19 +91,24 @@ public:
|
||||
, fDouble4x2_Type(new Type("double4x2", *fDouble_Type, 4, 2))
|
||||
, fDouble4x3_Type(new Type("double4x3", *fDouble_Type, 4, 3))
|
||||
, fDouble4x4_Type(new Type("double4x4", *fDouble_Type, 4, 4))
|
||||
, fTexture2D_Type(new Type("texture2D", Type::kTexture_Kind))
|
||||
, fSampler1D_Type(new Type("sampler1D", SpvDim1D, false, false, false, true))
|
||||
, fSampler2D_Type(new Type("sampler2D", SpvDim2D, false, false, false, true, &*fTexture2D_Type))
|
||||
, fSampler3D_Type(new Type("sampler3D", SpvDim3D, false, false, false, true))
|
||||
, fSamplerExternalOES_Type(new Type("samplerExternalOES", SpvDim2D, false, false,
|
||||
false, true))
|
||||
, fSamplerCube_Type(new Type("samplerCube", SpvDimCube, false, false, false, true))
|
||||
, fSampler2DRect_Type(new Type("sampler2DRect", SpvDimRect, false, false, false, true))
|
||||
, fTexture1D_Type(new Type("texture1D", SpvDim1D, false, false, false, true))
|
||||
, fTexture2D_Type(new Type("texture2D", SpvDim2D, false, false, false, true))
|
||||
, fTexture3D_Type(new Type("texture3D", SpvDim3D, false, false, false, true))
|
||||
, fTextureExternalOES_Type(new Type("textureExternalOES", SpvDim2D, false, false, false, true))
|
||||
, fTextureCube_Type(new Type("textureCube", SpvDimCube, false, false, false, true))
|
||||
, fTexture2DRect_Type(new Type("texture2DRect", SpvDimRect, false, false, false, true))
|
||||
, fTextureBuffer_Type(new Type("textureBuffer", SpvDimBuffer, false, false, false, true))
|
||||
, fITexture2D_Type(new Type("itexture2D", SpvDim2D, false, false, false, true))
|
||||
, fSampler1D_Type(new Type("sampler1D", *fTexture1D_Type))
|
||||
, fSampler2D_Type(new Type("sampler2D", *fTexture2D_Type))
|
||||
, fSampler3D_Type(new Type("sampler3D", *fTexture3D_Type))
|
||||
, fSamplerExternalOES_Type(new Type("samplerExternalOES", *fTextureExternalOES_Type))
|
||||
, fSamplerCube_Type(new Type("samplerCube", *fTextureCube_Type))
|
||||
, fSampler2DRect_Type(new Type("sampler2DRect", *fTexture2DRect_Type))
|
||||
, fSampler1DArray_Type(new Type("sampler1DArray"))
|
||||
, fSampler2DArray_Type(new Type("sampler2DArray"))
|
||||
, fSamplerCubeArray_Type(new Type("samplerCubeArray"))
|
||||
, fSamplerBuffer_Type(new Type("samplerBuffer", SpvDimBuffer, false, false, false,
|
||||
true))
|
||||
, fSamplerBuffer_Type(new Type("samplerBuffer", *fTextureBuffer_Type))
|
||||
, fSampler2DMS_Type(new Type("sampler2DMS"))
|
||||
, fSampler2DMSArray_Type(new Type("sampler2DMSArray"))
|
||||
, fSampler1DShadow_Type(new Type("sampler1DShadow"))
|
||||
@ -115,7 +120,7 @@ public:
|
||||
, fSamplerCubeArrayShadow_Type(new Type("samplerCubeArrayShadow"))
|
||||
|
||||
// Related to below FIXME, gsampler*s don't currently expand to cover integer case.
|
||||
, fISampler2D_Type(new Type("isampler2D", SpvDim2D, false, false, false, true))
|
||||
, fISampler2D_Type(new Type("isampler2D", *fITexture2D_Type))
|
||||
|
||||
, fSampler_Type(new Type("sampler", Type::kSeparateSampler_Kind))
|
||||
// FIXME express these as "gimage2D" that expand to image2D, iimage2D, and uimage2D.
|
||||
@ -295,7 +300,14 @@ public:
|
||||
const std::unique_ptr<Type> fDouble4x3_Type;
|
||||
const std::unique_ptr<Type> fDouble4x4_Type;
|
||||
|
||||
const std::unique_ptr<Type> fTexture1D_Type;
|
||||
const std::unique_ptr<Type> fTexture2D_Type;
|
||||
const std::unique_ptr<Type> fTexture3D_Type;
|
||||
const std::unique_ptr<Type> fTextureExternalOES_Type;
|
||||
const std::unique_ptr<Type> fTextureCube_Type;
|
||||
const std::unique_ptr<Type> fTexture2DRect_Type;
|
||||
const std::unique_ptr<Type> fTextureBuffer_Type;
|
||||
const std::unique_ptr<Type> fITexture2D_Type;
|
||||
|
||||
const std::unique_ptr<Type> fSampler1D_Type;
|
||||
const std::unique_ptr<Type> fSampler2D_Type;
|
||||
|
@ -529,23 +529,11 @@ SpvId SPIRVCodeGenerator::getType(const Type& rawType, const MemoryLayout& layou
|
||||
case Type::kSampler_Kind: {
|
||||
SpvId image = result;
|
||||
if (SpvDimSubpassData != type.dimensions()) {
|
||||
if (type.textureType()) {
|
||||
image = this->getType(*type.textureType(), layout);
|
||||
} else {
|
||||
image = nextId();
|
||||
}
|
||||
image = this->getType(type.textureType(), layout);
|
||||
}
|
||||
if (SpvDimBuffer == type.dimensions()) {
|
||||
fCapabilities |= (((uint64_t) 1) << SpvCapabilitySampledBuffer);
|
||||
}
|
||||
if (!type.textureType()) {
|
||||
this->writeInstruction(SpvOpTypeImage, image,
|
||||
this->getType(*fContext.fFloat_Type, layout),
|
||||
type.dimensions(), type.isDepth(), type.isArrayed(),
|
||||
type.isMultisampled(), type.isSampled() ? 1 : 2,
|
||||
SpvImageFormatUnknown, fConstantBuffer);
|
||||
fImageTypeMap[key] = image;
|
||||
}
|
||||
if (SpvDimSubpassData != type.dimensions()) {
|
||||
this->writeInstruction(SpvOpTypeSampledImage, result, image, fConstantBuffer);
|
||||
}
|
||||
@ -556,11 +544,10 @@ SpvId SPIRVCodeGenerator::getType(const Type& rawType, const MemoryLayout& layou
|
||||
break;
|
||||
}
|
||||
case Type::kTexture_Kind: {
|
||||
// FIXME: should support more than 2D
|
||||
this->writeInstruction(SpvOpTypeImage, result,
|
||||
this->getType(*fContext.fFloat_Type, layout),
|
||||
SpvDim2D, type.isDepth(), type.isArrayed(),
|
||||
type.isMultisampled(), 1,
|
||||
type.dimensions(), type.isDepth(), type.isArrayed(),
|
||||
type.isMultisampled(), type.isSampled() ? 1 : 2,
|
||||
SpvImageFormatUnknown, fConstantBuffer);
|
||||
fImageTypeMap[key] = result;
|
||||
break;
|
||||
|
@ -194,19 +194,35 @@ public:
|
||||
fName.fLength = fNameString.size();
|
||||
}
|
||||
|
||||
// Create a sampler type.
|
||||
// Create a texture type.
|
||||
Type(const char* name, SpvDim_ dimensions, bool isDepth, bool isArrayed, bool isMultisampled,
|
||||
bool isSampled, Type* textureType = nullptr)
|
||||
bool isSampled)
|
||||
: INHERITED(-1, kType_Kind, StringFragment())
|
||||
, fNameString(name)
|
||||
, fTypeKind(kSampler_Kind)
|
||||
, fTypeKind(kTexture_Kind)
|
||||
, fNumberKind(kNonnumeric_NumberKind)
|
||||
, fDimensions(dimensions)
|
||||
, fIsDepth(isDepth)
|
||||
, fIsArrayed(isArrayed)
|
||||
, fIsMultisampled(isMultisampled)
|
||||
, fIsSampled(isSampled)
|
||||
, fTextureType(textureType)
|
||||
{
|
||||
fName.fChars = fNameString.c_str();
|
||||
fName.fLength = fNameString.size();
|
||||
}
|
||||
|
||||
// Create a sampler type.
|
||||
Type(const char* name, const Type& textureType)
|
||||
: INHERITED(-1, kType_Kind, StringFragment())
|
||||
, fNameString(name)
|
||||
, fTypeKind(kSampler_Kind)
|
||||
, fNumberKind(kNonnumeric_NumberKind)
|
||||
, fDimensions(textureType.dimensions())
|
||||
, fIsDepth(textureType.isDepth())
|
||||
, fIsArrayed(textureType.isArrayed())
|
||||
, fIsMultisampled(textureType.isMultisampled())
|
||||
, fIsSampled(textureType.isSampled())
|
||||
, fTextureType(&textureType)
|
||||
{
|
||||
fName.fChars = fNameString.c_str();
|
||||
fName.fLength = fNameString.size();
|
||||
@ -312,8 +328,9 @@ public:
|
||||
* For texturesamplers, returns the type of texture it samples (e.g., sampler2D has
|
||||
* a texture type of texture2D).
|
||||
*/
|
||||
const Type* textureType() const {
|
||||
return fTextureType;
|
||||
const Type& textureType() const {
|
||||
SkASSERT(fTextureType);
|
||||
return *fTextureType;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user