diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2019-03-18 18:19:26 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-03-18 18:19:26 -0400 |
| commit | 71885de27c973a73b7d020f5ebbe86e16b86d7e4 (patch) | |
| tree | 1d4ab43ac820fdb88611ce587f7613e13a58c6d2 /source | |
| parent | 70048715cec251a23871747e342e5cf938c97255 (diff) | |
First pass support for half on vk (#912)
* Look at getting half to work on vk.
* Alter half test so can always produce consistent test results.
* First pass working half on vk.
* Improve comments for vulkan extensions around half.
* Upgraded vulkan headers to v1.1.103
https://github.com/KhronosGroup/Vulkan-Headers
* * Add getFeatures on Render interface
* Vulkan renderer determines at startup if it can support half
* Parse render-features on render-test
* Small changes to half-calc.slang test.
* Structured buffer half access works as expected for Vk, but isn't for dx12, so disable for now.
* Require the half feature for renderers for the half-structured-buffer.slang test.
* * Added ToolReturnCode to be more rigerous about how a return code is passed back from a tool
* Added support for a tool being able to pass back an 'ignored' result.
* Used enum codes to indicate meanings
* Made spawnAndWait return a ToolReturnCode
* Ignore tests that don't have required render-feature
* Fix macro line continuation usage.
* Check dx12 has half support.
* Checking for half on dx12 - if CheckFeatureSupport fails, don't fail renderer initialization.
* Fix typo.
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/emit.cpp | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index d2de479b4..84585f248 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -47,6 +47,8 @@ struct ExtensionUsageTracker StringBuilder glslExtensionRequireLines; ProfileVersion profileVersion = ProfileVersion::GLSL_110; + + bool hasHalfExtension = false; }; void requireGLSLExtension( @@ -76,6 +78,21 @@ void requireGLSLVersionImpl( } } +void requireGLSLHalfExtension(ExtensionUsageTracker* tracker) +{ + if (!tracker->hasHalfExtension) + { + // https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_shader_16bit_storage.txt + requireGLSLExtension(tracker, "GL_EXT_shader_16bit_storage"); + + // https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_shader_explicit_arithmetic_types.txt + // Use GL_KHX_shader_explicit_arithmetic_types because that is what appears defined in glslang + requireGLSLExtension(tracker, "GL_KHX_shader_explicit_arithmetic_types"); + + tracker->hasHalfExtension = true; + } +} + // Shared state for an entire emit session struct SharedEmitContext @@ -810,7 +827,12 @@ struct EmitVisitor case kIROp_BoolType: Emit("b"); break; - case kIROp_HalfType: Emit("f16"); break; + case kIROp_HalfType: + { + _requireHalf(); + Emit("f16"); + break; + } case kIROp_DoubleType: Emit("d"); break; case kIROp_VectorType: @@ -1197,6 +1219,14 @@ struct EmitVisitor } } + void _requireHalf() + { + if (getTarget(context) == CodeGenTarget::GLSL) + { + requireGLSLHalfExtension(&context->shared->extensionUsageTracker); + } + } + void emitSimpleTypeImpl(IRType* type) { switch (type->op) @@ -1217,7 +1247,19 @@ struct EmitVisitor case kIROp_UIntType: Emit("uint"); return; case kIROp_UInt64Type: Emit("uint64_t"); return; - case kIROp_HalfType: Emit("half"); return; + case kIROp_HalfType: + { + _requireHalf(); + if (getTarget(context) == CodeGenTarget::GLSL) + { + Emit("float16_t"); + } + else + { + Emit("half"); + } + return; + } case kIROp_FloatType: Emit("float"); return; case kIROp_DoubleType: Emit("double"); return; |
