多重采样纹理的加载在某些英特尔GPU上失败

时间:2017-04-13 18:37:44

标签: windows direct3d hlsl direct3d11

我已经使用模板缓冲区在我的应用中实现了鼠标选择。

这是在鼠标下读取值的像素着色器:

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。

英特尔Haswell GPU(Intel HD 5000,Intel HD 4600)上的代码失败。 Texture2DMS.Load只返回0.任何想法可能出错?

更新:仅适用于8x MSAA。将其降低到4倍即使在受影响的英特尔GPU上也能正常工作。

1 个答案:

答案 0 :(得分:0)

看起来英特尔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;
}

如果此函数返回S_OK,我限制最大值。 MSAA等级为4。