2017-04-13 5 views
0

Ich habe die Mausauswahl in meiner App mithilfe eines Stencil-Puffers implementiert.Laden von Multisample-Textur schlägt auf einigen Intel-GPUs fehl

Hier ist der Pixel-Shader, der Wert unter der Maus liest:

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); 
} 

Der Code funktioniert auf nVidia und AMD GPUs arbeitet auf Intel Iris 550.

Der Code schlägt auf Intel Haswell GPUs (Intel HD 5000, Intel HD 4600). Texture2DMS.Load gibt nur 0 zurück. Irgendwelche Ideen, was könnte falsch sein?

Update: geschieht nur mit 8x MSAA. Das Verringern auf 4x funktioniert auch auf den betroffenen Intel GPUs.

+0

Haben Sie bestätigt, dass der Treiber die Unterstützung für '' D3D11_FORMAT_SUPPORT_MULTISAMPLE_LOAD'' mit '' CheckFormatSupport'' und 8x MSAA mit '' CheckMultisampleQualityLevels'' für dieses Format meldet? –

+0

@ChuckWalbourn ja, ruft meine App sie beide beim Start, und deaktiviert MSAA/reduzieren Sie das Niveau. – Soonts

Antwort

0

Sieht aus, als gäbe es einen Fehler in Intel GPU-Treiber oder Hardware.

Hier ist eine Abhilfe:

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; 
} 

Wenn diese Funktion S_OK zurückgibt, I max begrenzen. MSAA level to 4.