Skip to content

Commit

Permalink
Write only texture types. (#5454)
Browse files Browse the repository at this point in the history
* Add support for write-only textures.

* Fix capabilities.

* Fix implementation.

* Fix.

* format code

---------

Co-authored-by: Ellie Hermaszewska <[email protected]>
Co-authored-by: slangbot <[email protected]>
  • Loading branch information
3 people authored Oct 30, 2024
1 parent feec3cf commit 28f20f4
Show file tree
Hide file tree
Showing 16 changed files with 174 additions and 102 deletions.
213 changes: 120 additions & 93 deletions source/slang/hlsl.meta.slang

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions source/slang/slang-ast-type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1132,6 +1132,7 @@ SlangResourceAccess ResourceType::getAccess()
{
case kCoreModule_ResourceAccessReadOnly: return SLANG_RESOURCE_ACCESS_READ;
case kCoreModule_ResourceAccessReadWrite: return SLANG_RESOURCE_ACCESS_READ_WRITE;
case kCoreModule_ResourceAccessWriteOnly: return SLANG_RESOURCE_ACCESS_WRITE;
case kCoreModule_ResourceAccessRasterizerOrdered:
return SLANG_RESOURCE_ACCESS_RASTER_ORDERED;
case kCoreModule_ResourceAccessFeedback: return SLANG_RESOURCE_ACCESS_FEEDBACK;
Expand Down
4 changes: 2 additions & 2 deletions source/slang/slang-capabilities.capdef
Original file line number Diff line number Diff line change
Expand Up @@ -1757,11 +1757,11 @@ alias getattributeatvertex = fragment + _sm_6_1 | fragment + GL_EXT_fragment_sha
alias memorybarrier = sm_5_0_version;
/// Capabilities required to use sm_4_0 texture operations
/// [Compound]
alias texture_sm_4_0 = sm_4_0_version | GL_ARB_sparse_texture_clamp + GL_EXT_texture_query_lod
alias texture_sm_4_0 = sm_4_0_version
;
/// Capabilities required to use sm_4_1 texture operations
/// [Compound]
alias texture_sm_4_1 = sm_4_1_version | GL_ARB_sparse_texture_clamp + GL_EXT_texture_query_lod
alias texture_sm_4_1 = sm_4_1_version
;
/// Capabilities required to use sm_4_1 samplerless texture operations
/// [Compound]
Expand Down
3 changes: 2 additions & 1 deletion source/slang/slang-core-module-textures.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,8 @@ void TextureTypeInfo::writeFuncBody(
if (spirvDefault.getLength() && spirvCombined.getLength())
{
sb << i << "case spirv:\n";
sb << i << "if (access == " << kCoreModule_ResourceAccessReadWrite << ")\n";
sb << i << "if (access == " << kCoreModule_ResourceAccessReadWrite
<< " || access == " << kCoreModule_ResourceAccessWriteOnly << ")\n";
sb << i << "return spirv_asm\n";
{
BraceScope spirvRWScope{i, sb, ";\n"};
Expand Down
1 change: 1 addition & 0 deletions source/slang/slang-emit-cpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ SlangResult CPPSourceEmitter::_calcCPPTextureTypeName(
switch (texType->getAccess())
{
case SLANG_RESOURCE_ACCESS_READ: break;
case SLANG_RESOURCE_ACCESS_WRITE: outName << "RW"; break;
case SLANG_RESOURCE_ACCESS_READ_WRITE: outName << "RW"; break;
case SLANG_RESOURCE_ACCESS_RASTER_ORDERED: outName << "RasterizerOrdered"; break;
case SLANG_RESOURCE_ACCESS_APPEND: outName << "Append"; break;
Expand Down
2 changes: 2 additions & 0 deletions source/slang/slang-emit-cuda.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ SlangResult CUDASourceEmitter::_calcCUDATextureTypeName(
return SLANG_OK;
}
case SLANG_RESOURCE_ACCESS_READ_WRITE:
case SLANG_RESOURCE_ACCESS_RASTER_ORDERED:
case SLANG_RESOURCE_ACCESS_WRITE:
{
outName << "CUsurfObject";
return SLANG_OK;
Expand Down
2 changes: 2 additions & 0 deletions source/slang/slang-emit-glsl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1500,6 +1500,7 @@ void GLSLSourceEmitter::emitImageFormatModifierImpl(IRInst* varDecl, IRType* var
{
switch (resourceType->getAccess())
{
case SLANG_RESOURCE_ACCESS_WRITE:
case SLANG_RESOURCE_ACCESS_READ_WRITE:
case SLANG_RESOURCE_ACCESS_RASTER_ORDERED:
{
Expand Down Expand Up @@ -2939,6 +2940,7 @@ void GLSLSourceEmitter::emitSimpleTypeImpl(IRType* type)
}
switch (texType->getAccess())
{
case SLANG_RESOURCE_ACCESS_WRITE:
case SLANG_RESOURCE_ACCESS_READ_WRITE:
case SLANG_RESOURCE_ACCESS_RASTER_ORDERED:
_emitGLSLTextureOrTextureSamplerType(texType, "image");
Expand Down
2 changes: 2 additions & 0 deletions source/slang/slang-emit-hlsl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,8 @@ void HLSLSourceEmitter::_emitHLSLTextureType(IRTextureTypeBase* texType)

case SLANG_RESOURCE_ACCESS_READ_WRITE: m_writer->emit("RW"); break;

case SLANG_RESOURCE_ACCESS_WRITE: m_writer->emit("RW"); break;

case SLANG_RESOURCE_ACCESS_RASTER_ORDERED: m_writer->emit("RasterizerOrdered"); break;

case SLANG_RESOURCE_ACCESS_APPEND: m_writer->emit("Append"); break;
Expand Down
2 changes: 2 additions & 0 deletions source/slang/slang-emit-metal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ void MetalSourceEmitter::_emitHLSLTextureType(IRTextureTypeBase* texType)
{
case SLANG_RESOURCE_ACCESS_READ: m_writer->emit("access::sample"); break;

case SLANG_RESOURCE_ACCESS_WRITE: m_writer->emit("access::write"); break;

case SLANG_RESOURCE_ACCESS_READ_WRITE:
case SLANG_RESOURCE_ACCESS_APPEND:
case SLANG_RESOURCE_ACCESS_CONSUME:
Expand Down
1 change: 1 addition & 0 deletions source/slang/slang-emit-spirv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2068,6 +2068,7 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
{
case SlangResourceAccess::SLANG_RESOURCE_ACCESS_READ_WRITE:
case SlangResourceAccess::SLANG_RESOURCE_ACCESS_RASTER_ORDERED:
case SlangResourceAccess::SLANG_RESOURCE_ACCESS_WRITE:
sampled = ImageOpConstants::readWriteImage;
break;
case SlangResourceAccess::SLANG_RESOURCE_ACCESS_NONE:
Expand Down
6 changes: 5 additions & 1 deletion source/slang/slang-emit-wgsl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,7 @@ void WGSLSourceEmitter::emitSimpleTypeImpl(IRType* type)
{
switch (texType->getAccess())
{
case SLANG_RESOURCE_ACCESS_WRITE:
case SLANG_RESOURCE_ACCESS_READ_WRITE: m_writer->emit("texture_storage"); break;
default: m_writer->emit("texture"); break;
}
Expand Down Expand Up @@ -442,7 +443,10 @@ void WGSLSourceEmitter::emitSimpleTypeImpl(IRType* type)
m_writer->emit(getWgslImageFormat(texType));
m_writer->emit(", read_write");
break;

case SLANG_RESOURCE_ACCESS_WRITE:
m_writer->emit(getWgslImageFormat(texType));
m_writer->emit(", write");
break;
default:
if (auto vecElemType = as<IRVectorType>(elemType))
emitSimpleType(vecElemType->getElementType());
Expand Down
1 change: 1 addition & 0 deletions source/slang/slang-ir-specialize-resources.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1315,6 +1315,7 @@ bool isIllegalGLSLParameterType(IRType* type)
switch (texType->getAccess())
{
case SLANG_RESOURCE_ACCESS_READ_WRITE:
case SLANG_RESOURCE_ACCESS_WRITE:
case SLANG_RESOURCE_ACCESS_RASTER_ORDERED: return true;
default: break;
}
Expand Down
5 changes: 3 additions & 2 deletions source/slang/slang-ir.h
Original file line number Diff line number Diff line change
Expand Up @@ -1437,8 +1437,9 @@ struct IRResourceTypeBase : IRType
case kCoreModule_ResourceAccessReadWrite: return SLANG_RESOURCE_ACCESS_READ_WRITE;
case kCoreModule_ResourceAccessRasterizerOrdered:
return SLANG_RESOURCE_ACCESS_RASTER_ORDERED;
case kCoreModule_ResourceAccessFeedback: return SLANG_RESOURCE_ACCESS_FEEDBACK;
default: break;
case kCoreModule_ResourceAccessFeedback: return SLANG_RESOURCE_ACCESS_FEEDBACK;
case kCoreModule_ResourceAccessWriteOnly: return SLANG_RESOURCE_ACCESS_WRITE;
default: break;
}
}
return SLANG_RESOURCE_ACCESS_UNKNOWN;
Expand Down
5 changes: 3 additions & 2 deletions source/slang/slang-type-system-shared.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,9 @@ enum class SamplerStateFlavor : uint8_t

const int kCoreModule_ResourceAccessReadOnly = 0;
const int kCoreModule_ResourceAccessReadWrite = 1;
const int kCoreModule_ResourceAccessRasterizerOrdered = 2;
const int kCoreModule_ResourceAccessFeedback = 3;
const int kCoreModule_ResourceAccessWriteOnly = 2;
const int kCoreModule_ResourceAccessRasterizerOrdered = 3;
const int kCoreModule_ResourceAccessFeedback = 4;

const int kCoreModule_ShapeIndex1D = 0;
const int kCoreModule_ShapeIndex2D = 1;
Expand Down
4 changes: 3 additions & 1 deletion source/slang/slang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1984,7 +1984,9 @@ CapabilitySet TargetRequest::getTargetCaps()
case CodeGenTarget::MetalLib:
case CodeGenTarget::MetalLibAssembly: atoms.add(CapabilityName::metal); break;

case CodeGenTarget::WGSL: atoms.add(CapabilityName::wgsl); break;
case CodeGenTarget::WGSLSPIRV:
case CodeGenTarget::WGSLSPIRVAssembly:
case CodeGenTarget::WGSL: atoms.add(CapabilityName::wgsl); break;

default: break;
}
Expand Down
24 changes: 24 additions & 0 deletions tests/wgsl/write-only-texture.slang
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//TEST:REFLECTION(filecheck=REFLECT):-stage compute -entry computeMain -target wgsl -no-codegen
//TEST:SIMPLE(filecheck=SPV): -target spirv
//TEST:SIMPLE(filecheck=CHECK): -target wgsl -entry computeMain -stage compute
//TEST:SIMPLE(filecheck=CHECK-WGSL-SPV): -target wgsl-spirv-asm -entry computeMain -stage compute
//TEST:SIMPLE(filecheck=HLSL): -target hlsl -entry computeMain -profile cs_6_0
//TEST:SIMPLE(filecheck=GLSL): -target glsl -entry computeMain -stage compute

// CHECK: texture_storage_2d<rgba8unorm, write>
// CHECK-WGSL-SPV: OpTypeImage %float 2D {{.}} 0 0 2 Rgba8
// SPV: OpTypeImage %float 2D {{.}} 0 0 2 Rgba8
// HLSL: RWTexture2D
// GLSL: image2D

// REFLECT: "name": "writeOnlyTexture"
// REFLECT: "access": "write"

[format("rgba8")]
WTexture2D writeOnlyTexture;

[shader("compute")]
void computeMain()
{
writeOnlyTexture.Store(int2(0,0), float4(0.2, 0.3, 0.4, 1.0));
}

0 comments on commit 28f20f4

Please sign in to comment.