2017-04-13 5 views
0

J'ai implémenté le choix de la souris dans mon application en utilisant un tampon stencil.La charge de la texture multisamplée échoue sur certains GPU Intel

est ici le pixel shader qui lit la valeur sous la souris:

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

Le code fonctionne sur les GPU nVidia et AMD, fonctionne sur Intel Iris 550.

Le code échoue sur les GPU Intel Haswell (Intel HD 5000, Intel HD 4600). Texture2DMS.Load renvoie juste 0. Toutes les idées ce qui pourrait être faux?

Mise à jour: Se produit uniquement avec 8x MSAA. Le réduire à 4x fonctionne bien même sur les GPU Intel concernés.

+0

Avez-vous confirmé que le pilote signale la prise en charge de '' D3D11_FORMAT_SUPPORT_MULTISAMPLE_LOAD'' en utilisant '' CheckFormatSupport'' et 8x MSAA en utilisant '' CheckMultisampleQualityLevels'' pour ce format? –

+0

@ChuckWalbourn oui, mon application les appelle tous les deux au démarrage, et désactive MSAA/réduire le niveau. – Soonts

Répondre

0

On dirait qu'il y a un bug dans le pilote ou le matériel Intel GPU.

Voici une solution de contournement:

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

Si cette fonction retourne S_OK, je limite max. Niveau MSAA à 4.