Skip to content

Commit

Permalink
[hdSt, hgi*] Exclude double precision transform overloads from the St…
Browse files Browse the repository at this point in the history
…orm volume

shader when double precision values are not supported (e.g. using Metal). A
new Hgi capability bit, HgiDeviceCapabilitiesBitsShaderDoublePrecision, is
added, which codegen will use to create a shader define if needed.

(Internal change: 2211644)
  • Loading branch information
clach authored and pixar-oss committed Jan 26, 2022
1 parent 53e1363 commit eb43fb5
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 8 deletions.
6 changes: 6 additions & 0 deletions pxr/imaging/hdSt/codeGen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,9 @@ HdSt_CodeGen::Compile(HdStResourceRegistry*const registry)
GetCapabilities()->IsSet(HgiDeviceCapabilitiesBitsShaderDrawParameters);
const bool builtinBarycentricsEnabled = registry->GetHgi()->
GetCapabilities()->IsSet(HgiDeviceCapabilitiesBitsBuiltinBarycentrics);
const bool doublePrecisionEnabled = registry->GetHgi()->
GetCapabilities()->IsSet(
HgiDeviceCapabilitiesBitsShaderDoublePrecision);

if (bindlessBufferEnabled) {
_genHeader << "#extension GL_NV_shader_buffer_load : require\n"
Expand Down Expand Up @@ -575,6 +578,9 @@ HdSt_CodeGen::Compile(HdStResourceRegistry*const registry)
if (_materialTag == HdStMaterialTagTokens->masked) {
_genFS << "#define HD_MATERIAL_TAG_MASKED 1\n";
}
if (doublePrecisionEnabled) {
_genFS << "#define HD_SHADER_SUPPORTS_DOUBLE_PRECISION\n";
}

// ------------------
// Custom Buffer Bindings
Expand Down
4 changes: 4 additions & 0 deletions pxr/imaging/hdSt/shaders/volume.glslfx
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,14 @@ transformPoint(mat4 m, vec3 point)
return result.xyz / result.w;
}

#ifdef HD_SHADER_SUPPORTS_DOUBLE_PRECISION
vec3
transformPoint(dmat4 m, vec3 point)
{
const vec4 result = vec4(m * vec4(point, 1.0));
return result.xyz / result.w;
}
#endif

// Transform a direction by a 4x4 matrix
vec3
Expand All @@ -113,12 +115,14 @@ transformDir(mat4 m, vec3 dir)
return result.xyz;
}

#ifdef HD_SHADER_SUPPORTS_DOUBLE_PRECISION
vec3
transformDir(dmat4 m, vec3 dir)
{
const vec4 result = vec4(m * vec4(dir, 0.0));
return result.xyz;
}
#endif

// Compute time when a ray starting at pos with direction dir
// exits the axis-aligned box with vertices lMin and lMax.
Expand Down
19 changes: 11 additions & 8 deletions pxr/imaging/hgi/enums.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,18 +55,21 @@ using HgiBits = uint32_t;
/// The device supports multiple primitive, indirect drawing</li>
/// <li>HgiDeviceCapabilitiesBitsBindlessTextures:
/// The device can access GPU textures using bindless handles</li>
/// <li>HgiDeviceCapabilitiesBitsShaderDoublePrecision:
/// The device supports double precision types in shaders</li>
/// </ul>
///
enum HgiDeviceCapabilitiesBits : HgiBits
{
HgiDeviceCapabilitiesBitsPresentation = 1 << 0,
HgiDeviceCapabilitiesBitsBindlessBuffers = 1 << 1,
HgiDeviceCapabilitiesBitsConcurrentDispatch = 1 << 2,
HgiDeviceCapabilitiesBitsUnifiedMemory = 1 << 3,
HgiDeviceCapabilitiesBitsBuiltinBarycentrics = 1 << 4,
HgiDeviceCapabilitiesBitsShaderDrawParameters = 1 << 5,
HgiDeviceCapabilitiesBitsMultiDrawIndirect = 1 << 6,
HgiDeviceCapabilitiesBitsBindlessTextures = 1 << 7
HgiDeviceCapabilitiesBitsPresentation = 1 << 0,
HgiDeviceCapabilitiesBitsBindlessBuffers = 1 << 1,
HgiDeviceCapabilitiesBitsConcurrentDispatch = 1 << 2,
HgiDeviceCapabilitiesBitsUnifiedMemory = 1 << 3,
HgiDeviceCapabilitiesBitsBuiltinBarycentrics = 1 << 4,
HgiDeviceCapabilitiesBitsShaderDrawParameters = 1 << 5,
HgiDeviceCapabilitiesBitsMultiDrawIndirect = 1 << 6,
HgiDeviceCapabilitiesBitsBindlessTextures = 1 << 7,
HgiDeviceCapabilitiesBitsShaderDoublePrecision = 1 << 8
};

using HgiDeviceCapabilities = HgiBits;
Expand Down
2 changes: 2 additions & 0 deletions pxr/imaging/hgiGL/capabilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,8 @@ HgiGLCapabilities::_LoadCapabilities()
builtinBarycentricsEnabled);
_SetFlag(HgiDeviceCapabilitiesBitsShaderDrawParameters,
shaderDrawParametersEnabled);
_SetFlag(HgiDeviceCapabilitiesBitsShaderDoublePrecision,
true);

if (TfDebug::IsEnabled(HGI_DEBUG_DEVICE_CAPABILITIES)) {
std::cout
Expand Down
2 changes: 2 additions & 0 deletions pxr/imaging/hgiMetal/capabilities.mm
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@

_SetFlag(HgiDeviceCapabilitiesBitsBuiltinBarycentrics, true);

_SetFlag(HgiDeviceCapabilitiesBitsShaderDoublePrecision, false);

#if defined(ARCH_OS_MACOS)
if (!unifiedMemory) {
defaultStorageMode = MTLResourceStorageModeManaged;
Expand Down

0 comments on commit eb43fb5

Please sign in to comment.