在某些 Intel GPU 上从多重采样纹理加载失败
Load from multisampled texture fails on some Intel GPUs
我已经使用模板缓冲区在我的应用程序中实现了鼠标拾取。
这是读取鼠标下值的像素着色器:
Texture2DMS<uint2> depthStencilTexture : register( t0 );
cbuffer ReadDepthInput : register( b2 )
{
int2 readPosition;
}
// Produces vector3( x, y, stencilValue )
float4 main() : SV_Target0
{
uint2 res = depthStencilTexture.Load( readPosition, 1 );
float stencil = res.y;
// Scale the result from integers to 0..1
stencil /= 255.0f;
return float4( float( readPosition.x ) / 65535.0f, float( readPosition.y ) / 65535.0f, stencil, 0 );
}
代码适用于 nVidia 和 AMD GPU,适用于 Intel Iris 550。
代码在 Intel Haswell GPU(Intel HD 5000、Intel HD 4600)上失败。 Texture2DMS.Load 只是 returns 0。有什么想法可能是错误的吗?
更新: 仅发生在 8x MSAA 上。即使在那些受影响的 Intel GPU 上,将它降低到 4 倍也能正常工作。
看起来 Intel GPU 驱动程序或硬件中存在错误。
解决方法如下:
HRESULT isIntelHaswellGPU( ID3D11Device* device )
{
CComQIPtr<IDXGIDevice> dxgiDev = device;
if( !dxgiDev )
return E_NOINTERFACE;
CComPtr<IDXGIAdapter> adapter;
CHECK( dxgiDev->GetAdapter( &adapter ) );
DXGI_ADAPTER_DESC desc;
CHECK( adapter->GetDesc( &desc ) );
if( desc.VendorId != 0x8086 )
return S_FALSE; // nVidia or AMD GPU
// https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units#Seventh_generation
// https://github.com/GameTechDev/gpudetect/blob/master/DeviceId.cpp
const UINT maskedDeviceId = ( desc.DeviceId & 0xFF00 );
if( maskedDeviceId == 0x0400 || maskedDeviceId == 0x0A00 || maskedDeviceId == 0x0D00 )
return S_OK; // Detected Intel Haswell GPU
return S_FALSE;
}
如果这个函数returnsS_OK,我限制最大值。 MSAA 级别为 4。
我已经使用模板缓冲区在我的应用程序中实现了鼠标拾取。
这是读取鼠标下值的像素着色器:
Texture2DMS<uint2> depthStencilTexture : register( t0 );
cbuffer ReadDepthInput : register( b2 )
{
int2 readPosition;
}
// Produces vector3( x, y, stencilValue )
float4 main() : SV_Target0
{
uint2 res = depthStencilTexture.Load( readPosition, 1 );
float stencil = res.y;
// Scale the result from integers to 0..1
stencil /= 255.0f;
return float4( float( readPosition.x ) / 65535.0f, float( readPosition.y ) / 65535.0f, stencil, 0 );
}
代码适用于 nVidia 和 AMD GPU,适用于 Intel Iris 550。
代码在 Intel Haswell GPU(Intel HD 5000、Intel HD 4600)上失败。 Texture2DMS.Load 只是 returns 0。有什么想法可能是错误的吗?
更新: 仅发生在 8x MSAA 上。即使在那些受影响的 Intel GPU 上,将它降低到 4 倍也能正常工作。
看起来 Intel GPU 驱动程序或硬件中存在错误。
解决方法如下:
HRESULT isIntelHaswellGPU( ID3D11Device* device )
{
CComQIPtr<IDXGIDevice> dxgiDev = device;
if( !dxgiDev )
return E_NOINTERFACE;
CComPtr<IDXGIAdapter> adapter;
CHECK( dxgiDev->GetAdapter( &adapter ) );
DXGI_ADAPTER_DESC desc;
CHECK( adapter->GetDesc( &desc ) );
if( desc.VendorId != 0x8086 )
return S_FALSE; // nVidia or AMD GPU
// https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units#Seventh_generation
// https://github.com/GameTechDev/gpudetect/blob/master/DeviceId.cpp
const UINT maskedDeviceId = ( desc.DeviceId & 0xFF00 );
if( maskedDeviceId == 0x0400 || maskedDeviceId == 0x0A00 || maskedDeviceId == 0x0D00 )
return S_OK; // Detected Intel Haswell GPU
return S_FALSE;
}
如果这个函数returnsS_OK,我限制最大值。 MSAA 级别为 4。