diff --git a/Editor/PostprocessWindow.cpp b/Editor/PostprocessWindow.cpp index 50005f3da..325ce48e3 100644 --- a/Editor/PostprocessWindow.cpp +++ b/Editor/PostprocessWindow.cpp @@ -142,7 +142,7 @@ void PostprocessWindow::Create(EditorComponent* editor) editor->renderPath->setRaytracedReflectionsEnabled(args.bValue); }); AddWidget(&raytracedReflectionsCheckBox); - raytracedReflectionsCheckBox.SetEnabled(wiRenderer::GetDevice()->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)); + raytracedReflectionsCheckBox.SetEnabled(wiRenderer::GetDevice()->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) && wiRenderer::GetDevice()->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_GEOMETRYINDEX)); screenSpaceShadowsCheckBox.Create("SS Shadows: "); screenSpaceShadowsCheckBox.SetTooltip("Enable screen space contact shadows. This can add small shadows details to shadow maps in screen space."); diff --git a/WickedEngine/wiGraphics.h b/WickedEngine/wiGraphics.h index 0f1fc9aaf..509dd6c14 100644 --- a/WickedEngine/wiGraphics.h +++ b/WickedEngine/wiGraphics.h @@ -358,14 +358,18 @@ namespace wiGraphics GRAPHICSDEVICE_CAPABILITY_UAV_LOAD_FORMAT_COMMON = 1 << 3, // eg: R16G16B16A16_FLOAT, R8G8B8A8_UNORM and more common ones GRAPHICSDEVICE_CAPABILITY_UAV_LOAD_FORMAT_R11G11B10_FLOAT = 1 << 4, GRAPHICSDEVICE_CAPABILITY_RENDERTARGET_AND_VIEWPORT_ARRAYINDEX_WITHOUT_GS = 1 << 5, - GRAPHICSDEVICE_CAPABILITY_RAYTRACING = 1 << 6, + GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE = 1 << 6, GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE = 1 << 7, + GRAPHICSDEVICE_CAPABILITY_RAYTRACING_GEOMETRYINDEX = 1 << 8, GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING = 1 << 9, GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2 = 1 << 10, GRAPHICSDEVICE_CAPABILITY_MESH_SHADER = 1 << 11, GRAPHICSDEVICE_CAPABILITY_BINDLESS_DESCRIPTORS = 1 << 12, }; + // helper query for full raytracing support: +#define GRAPHICSDEVICE_CAPABILITY_RAYTRACING (GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE | GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE | GRAPHICSDEVICE_CAPABILITY_RAYTRACING_GEOMETRYINDEX) + // Descriptor structs: struct Viewport diff --git a/WickedEngine/wiGraphicsDevice_DX12.cpp b/WickedEngine/wiGraphicsDevice_DX12.cpp index c2263fad5..57df4d866 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.cpp +++ b/WickedEngine/wiGraphicsDevice_DX12.cpp @@ -2577,10 +2577,11 @@ using namespace DX12_Internal; hr = device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS5, &features_5, sizeof(features_5)); if (features_5.RaytracingTier >= D3D12_RAYTRACING_TIER_1_0) { - capabilities |= GRAPHICSDEVICE_CAPABILITY_RAYTRACING; + capabilities |= GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE; if (features_5.RaytracingTier >= D3D12_RAYTRACING_TIER_1_1) { capabilities |= GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE; + capabilities |= GRAPHICSDEVICE_CAPABILITY_RAYTRACING_GEOMETRYINDEX; } } @@ -2737,7 +2738,7 @@ using namespace DX12_Internal; nullSRV_texture3d = allocationhandler->descriptors_res.allocate(); device->CreateShaderResourceView(nullptr, &srv_desc, nullSRV_texture3d); } - if(CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if(CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) || CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) { D3D12_SHADER_RESOURCE_VIEW_DESC srv_desc = {}; srv_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; diff --git a/WickedEngine/wiGraphicsDevice_Vulkan.cpp b/WickedEngine/wiGraphicsDevice_Vulkan.cpp index 56595820e..d132a4f00 100644 --- a/WickedEngine/wiGraphicsDevice_Vulkan.cpp +++ b/WickedEngine/wiGraphicsDevice_Vulkan.cpp @@ -1309,7 +1309,7 @@ using namespace Vulkan_Internal; poolSizes[7].descriptorCount = GPU_SAMPLER_HEAP_COUNT * poolSize; count++; - if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) || device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) { poolSizes[8].type = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR; poolSizes[8].descriptorCount = GPU_RESOURCE_HEAP_SRV_COUNT * poolSize; @@ -1988,7 +1988,7 @@ using namespace Vulkan_Internal; VkPipelineStageFlags srcStage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; VkPipelineStageFlags dstStage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; - if (CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if (CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) || CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) { srcStage |= VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR; dstStage |= VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR; @@ -2318,7 +2318,8 @@ using namespace Vulkan_Internal; { assert(acceleration_structure_features.accelerationStructure == VK_TRUE); assert(features_1_2.bufferDeviceAddress == VK_TRUE); - capabilities |= GRAPHICSDEVICE_CAPABILITY_RAYTRACING; + capabilities |= GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE; + capabilities |= GRAPHICSDEVICE_CAPABILITY_RAYTRACING_GEOMETRYINDEX; SHADER_IDENTIFIER_SIZE = raytracing_properties.shaderGroupHandleSize; } if (raytracing_query_features.rayQuery == VK_TRUE) @@ -2326,6 +2327,7 @@ using namespace Vulkan_Internal; assert(acceleration_structure_features.accelerationStructure == VK_TRUE); assert(features_1_2.bufferDeviceAddress == VK_TRUE); capabilities |= GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE; + capabilities |= GRAPHICSDEVICE_CAPABILITY_RAYTRACING_GEOMETRYINDEX; } if (mesh_shader_features.meshShader == VK_TRUE && mesh_shader_features.taskShader == VK_TRUE) { @@ -2705,7 +2707,7 @@ using namespace Vulkan_Internal; { allocationhandler->bindlessSamplers.init(device, VK_DESCRIPTOR_TYPE_SAMPLER, 256); } - if (CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if (CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) || CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) { allocationhandler->bindlessAccelerationStructures.init(device, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 32); } @@ -6800,7 +6802,7 @@ using namespace Vulkan_Internal; barrierdesc.pNext = nullptr; barrierdesc.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT | VK_ACCESS_SHADER_WRITE_BIT; barrierdesc.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_SHADER_READ_BIT; - if (CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if (CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) || CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) { barrierdesc.srcAccessMask |= VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR; barrierdesc.dstAccessMask |= VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR; diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 227c1e6ae..9038ab4c0 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -1922,7 +1922,8 @@ void LoadShaders() device->CreatePipelineState(&desc, &PSO_debug[args.jobIndex]); }); - if(device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if(device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) && + device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_GEOMETRYINDEX)) { wiJobSystem::Execute(ctx, [](wiJobArgs args) { @@ -3528,7 +3529,7 @@ void UpdatePerFrameData( wiJobSystem::Wait(ctx); - if (!device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING) && scene.BVH_invalid) + if (!device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) && !device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE) && scene.BVH_invalid) { scene.BVH.Update(scene); } @@ -3664,7 +3665,7 @@ void UpdatePerFrameData( { frameCB.g_xFrame_Options |= OPTION_BIT_REALISTIC_SKY; } - if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING) && GetRaytracedShadowsEnabled()) + if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE) && GetRaytracedShadowsEnabled()) { frameCB.g_xFrame_Options |= OPTION_BIT_RAYTRACED_SHADOWS; frameCB.g_xFrame_Options |= OPTION_BIT_SHADOW_MASK; @@ -4201,7 +4202,7 @@ void UpdateRenderData( } void UpdateRaytracingAccelerationStructures(const Scene& scene, CommandList cmd) { - if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) || device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) { if (!scene.TLAS.IsValid()) @@ -5141,7 +5142,7 @@ void DrawScene( device->BindResource(PS, &vis.scene->decalAtlas, TEXSLOT_DECALATLAS, cmd); } - if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) || device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) { device->BindResource(PS, &vis.scene->TLAS, TEXSLOT_ACCELERATION_STRUCTURE, cmd); device->BindResource(CS, &vis.scene->TLAS, TEXSLOT_ACCELERATION_STRUCTURE, cmd); @@ -9319,7 +9320,9 @@ void Postprocess_RTReflection( float range ) { - if (!wiRenderer::device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) + if (!wiRenderer::device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE)) + return; + if (!wiRenderer::device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_GEOMETRYINDEX)) return; if (scene.objects.GetCount() <= 0) diff --git a/WickedEngine/wiScene.cpp b/WickedEngine/wiScene.cpp index b908b4bd6..fd5cd19ff 100644 --- a/WickedEngine/wiScene.cpp +++ b/WickedEngine/wiScene.cpp @@ -450,7 +450,7 @@ namespace wiScene bd.CPUAccessFlags = 0; bd.BindFlags = BIND_VERTEX_BUFFER | BIND_SHADER_RESOURCE; bd.MiscFlags = RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS; - if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) || device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) { bd.MiscFlags |= RESOURCE_MISC_RAY_TRACING; } @@ -602,7 +602,7 @@ namespace wiScene } bd.ByteWidth = (uint32_t)(sizeof(Vertex_POS) * vertex_positions.size()); - if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) || device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) { bd.MiscFlags |= RESOURCE_MISC_RAY_TRACING; } @@ -730,7 +730,7 @@ namespace wiScene vertexBuffer_PRE = GPUBuffer(); - if (wiRenderer::GetDevice()->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) || device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) { BLAS_state = BLAS_STATE_NEEDS_REBUILD; @@ -1451,7 +1451,7 @@ namespace wiScene GraphicsDevice* device = wiRenderer::GetDevice(); - if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) || device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) { TLAS_instances.resize(objects.GetCount() * device->GetTopLevelAccelerationStructureInstanceSize()); } @@ -1546,7 +1546,7 @@ namespace wiScene bounds = AABB::Merge(bounds, group_bound); } - if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING)) + if (device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_PIPELINE) || device->CheckCapability(GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE)) { // Recreate top level acceleration structure if the object count changed: if (objects.GetCount() > 0 && objects.GetCount() != TLAS.desc.toplevel.count) diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 5c0856ee6..89e080e00 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates, breaking compatibility changes const int minor = 56; // minor bug fixes, alterations, refactors, updates - const int revision = 41; + const int revision = 42; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);