2017-04-13 36 views
0

我在应用程序中使用模板缓冲区实现了鼠标拾取功能。某些英特尔GPU上的多采样纹理加载失败

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

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,适用于英特尔虹膜英特尔的Haswell的GPU 550

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

更新:只有8x MSAA才会发生。即使在受影响的英特尔GPU上,将其降至4倍也可以。

+0

您是否确认该驱动程序使用“CheckFormatSupport”和8x MSAA对该格式使用“CheckMultisampleQualityLevels”支持“D3D11_FORMAT_SUPPORT_MULTISAMPLE_LOAD”? –

+0

@ChuckWalbourn是的,我的应用程序在启动时调用它们,并禁用MSAA /降低级别。 – Soonts

回答

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.