随着DirectX 12,Mantle和Vulkan等低级图形API的兴起,我想知道它们如何与异构系统架构(HSA)进行交互(如果有的话)?
据我所知,支持HSA需要一些开发人员的参与,但我很好奇是否有任何低级图形API自己处理这个问题,或者开发人员是否仍有责任充分利用它?
HSA对于简化系统内存和视频内存之间的数据共享等功能特别有用,特别是当它们共享相同的物理RAM时.
由于这个问题很可能与当前的事态有关,我对这种概述很好(虽然有关未来路线图的信息会很好),我会接受一个仅涵盖单个图形API的答案(因为我怀疑)许多人,如果有的话,人们都熟悉所有三个加HSA).如果我完全误解了它是如何工作的,那么也可以随意指出它; 我对这两种技术都不是很熟悉,但想知道它们目前是如何相互作用的.
ID3D12Device::SetStablePowerState函数调用仅在系统中打开开发人员模式时可用.如果没有,它会触发设备删除.
是否有一个API来检测开发人员模式是否打开,到目前为止我没有在msdn上发现允许应用程序查询它的任何内容.
我一直在研究使用vulkan来利用集成图形和独立图形功能的计算功能.但是,根据这篇文章,尽管通过兼容的SLI配置提供了多GPU支持,但Vulkan没有异构的多GPU支持.同一篇文章继续声称DX12确实有这种支持,"更进一步".
在我的应用程序中,我想利用两个独立设备的计算功能,这两个设备没有SLI/Xfire兼容性,但也不一定在同一计算工作负载上工作,不需要在每个设备之间共享内存来计算其工作负载.
我是不是可以让两个设备在同一个实例中做两个不同的事情,如果有必要,先通过复制到主机共享内存?这个答案似乎意味着我实际上可以做到这一点,所以我很困惑异构的多GPU实际上对DX12意味着什么,以及它与我在Vulkan中可以做的有什么不同.
我正在编写一个简单的 Direct3D 12 应用程序,为 Vulkan 的发布做准备,它在所有方面都按预期工作,但有一个问题:在有边框的窗口中运行会将帧速率限制为 60fps,即使禁用了垂直同步也是如此。让我困惑的是:同一个程序在全屏窗口中的运行速度接近 4000fps。
使用肮脏的自制分析器,我发现挂起发生在我的代码的这一部分中,它会等到最后一帧完成后才开始处理下一帧。
if (m_fence->GetCompletedValue() < endFenceValue)
{
result = m_fence->SetEventOnCompletion(endFenceValue, m_fenceEvent);
if (result != S_OK) return false;
WaitForSingleObject(m_fenceEvent, INFINITE); //Program stalls here
}
//m_fence is a pointer to an ID3D12Fence object
//endFenceValue is an unsigned long long
//m_fenceEvent is a HANDLE
Run Code Online (Sandbox Code Playgroud)
用于呈现渲染帧的代码很普通:
if (m_vsync)
{
result = m_swapChain->Present(1, 0);
if (result != S_OK) return 0;
}
else
{
result = m_swapChain->Present(0, 0);
if (result != S_OK) return 0;
}
//Increase the fence value …Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习新的 DirectX 12 API。我想在 dx12 之上编写一种渲染引擎,并且在初始化期间我应该创建描述符堆。问题在于,此时我不知道我将来会创建多少资源视图。例如,如果我想包含一些需要渲染到纹理方法的后期处理效果,我必须为我渲染的纹理创建渲染目标视图。不过,这些 RTV 的数量可能会有所不同。那么如何创建足够大的描述符堆以应对各种情况呢?
有什么建议吗?
深度模板缓冲区资源被定义为DXGI_FORMAT_D24_UNORM_S8_UINT格式。
我会假设要在该资源中创建着色器资源视图 (SRV) 需要将视图格式描述为:
DXGI_FORMAT_R24_UNORM_X8_TYPELESS 红色通道访问深度值的地方DXGI_FORMAT_R24G8_TYPELESS 其中红色通道访问深度和绿色通道模板值但是,创建此类 SRV 失败并出现以下错误:
D3D12 ERROR: ID3D12Device::CreateShaderResourceView: 对于资源格式 D24_UNORM_S8_UINT,在制作 D3D 视图时,视图的格式名称不能为 R24_UNORM_X8_TYPELESS。请参阅有关此资源格式的有效视图格式名称集的文档,以确定资源(或其一部分)将如何显示给着色器。[ STATE_CREATION 错误 #28:CREATESHADERRESOURCEVIEW_INVALIDFORMAT]
查看API 文档给我以下信息:
查看资源时,资源视图描述必须指定与资源格式兼容的类型化格式。所以这意味着您不能使用名称中带有 _TYPELESS 的任何格式创建资源视图描述。但是,您可以通过为视图指定类型格式来查看无类型资源。
我真的不明白为什么一个无类型的格式是不允许和哪种格式我应该改用?
我想知道哪种资源类型最适合使用,以便为静态数据保存尽可能多的元素,并且在绘制调用期间不会更改。我能看出常量缓冲区和只读结构化缓冲区之间的唯一区别是常量缓冲区数据必须在其ID3D12Resource对象内部按 256 字节对齐。
lights.hlsl
#define as_many_as_possible 1000
struct light
{
float3 position;
float falloff_start;
float3 direction;
float falloff_end;
float3 color;
float3 strenght;
};
struct light_data
{
light lights [as_many_as_possible];
};
ConstantBuffer<light_data> cb_lights : register(b0);
// Versus
StructuredBuffer<light> sb_lights : register(s0);
Run Code Online (Sandbox Code Playgroud)
如果我的目标是保存尽可能多的灯光数据,那么哪一个更好?
目前通过microsofts示例,值得注意的是,每个命令列表只使用一个cbv_srv_uav堆(+可能在其他采样器堆上).
每个CommandList可以使用多个堆吗?
所以我设置堆和范围
this->mRSVHeap = new urd::DescriptorHeap(
*this->mDevice,
urd::DescriptorHeapType::CBV_SRV_UAV,
1, // shader visible
2); // space for 2 descriptors (2 textures)
this->mConstHeap = new urd::DescriptorHeap(
*this->mDevice,
urd::DescriptorHeapType::CBV_SRV_UAV,
1, // shader visible
1); // space for 1 descriptor
urd::DescriptorRange ranges[3];
ranges[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 2, 0); // first and second descriptor in rsv heap (t0, t1)
ranges[1].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 0); // first descriptor in cbv heap (b0)
ranges[2].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 2); // same texture used as first range (again first descriptor in rsv, accessable by t2) …Run Code Online (Sandbox Code Playgroud) 我非常熟悉基于多个 DirectX 工具包示例构建的 DirectX 12 桌面 x64 应用程序,但现在还支持用于定向和全向阴影、动态反射、硬件实例粒子效果系统、FBX 模型骨骼动画的自定义着色器和景深后处理。
万圣节那天,Windows 更新将我的系统(Intel Core i7[第 8 代]/GeForce GTX1050)升级到 Windows 11。当我运行我的项目时,我收到了一个令人毛骨悚然的惊喜,其形式为以下“源不可用”窗口:
Present()停止调试后,应用程序在调用DeviceResources.cpp时崩溃并生成以下错误:
D3D12 ERROR: ID3D12CommandQueue::Present: Resource state (0x800: D3D12_RESOURCE_STATE_COPY_SOURCE) (promoted from COMMON state) of resource (0x0000011BD5330080:'Render target 0') (subresource: 0) must be in COMMON state when transitioning to use in a different Command List type, because resource state on previous Command List type : D3D12_COMMAND_LIST_TYPE_COPY, is actually incompatible and different from that on the next Command List type : D3D12_COMMAND_LIST_TYPE_DIRECT. …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 DirectX12 中使用CreateHeapand 。PlacedResources然而,对于 CreateHeap 来说,它需要一个D3D12_HEAP_DESC“应用程序应该传递SizeInBytes(的字段D3D12_HEAP_DESC)值,该值是有效对齐的倍数”的地方。然后他们去显示一个对齐D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT #defined as 64KB.,其中说 64KB 是对齐。
Microsoft DirectX12 是否使用 65536 字节作为 64KB 或 64000 字节的定义(因此基本上 1024 或 1000 字节是 Microsoft 的 KB 定义)?我不想浪费任何字节,而且我不知道在哪里可以找到微软这些类型单位的定义。正如维基百科显示1024 KB作为千字节的传统单位,因此微软标准是否是最新的也是一个问题。
directx-12 ×10
directx ×5
c++ ×3
direct3d ×3
vulkan ×2
descriptor ×1
direct3d12 ×1
directxtk ×1
dxgi ×1
gpgpu ×1
graphics ×1
heap ×1
hlsl ×1
mantle ×1
msdn ×1
visual-c++ ×1
vsync ×1
windows-10 ×1
windows-11 ×1