在某些 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。