2

I have written a DirectX11 Application that is running on an Alienware Laptop with a GeForce GT 555m graphics card, so I know the computer supports it.

I have come across this weird thing were my laptop will turn of without any warning if it isn't plugged into power, however the application runs fine if it is plugged into power.

I have tried to replicate this with other DirectX11 Applications, including the Samples that come with DirectX however my application is the only one that does it, but I use very similar code to the Samples. I must be missing something but I don't know what.

This is my code to setup the SwapChain and the RenderTargetView

ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));
swapChainDesc.BufferCount = 1;
swapChainDesc.BufferDesc.Width = width;
swapChainDesc.BufferDesc.Height = height;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;

if(vsync) {
    swapChainDesc.BufferDesc.RefreshRate.Numerator = numerator;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = denominator;
}
else {
    swapChainDesc.BufferDesc.RefreshRate.Numerator = 0;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
}

swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.OutputWindow = hwnd;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;

if(fullscreen) {
    swapChainDesc.Windowed = false;
}
else {
    swapChainDesc.Windowed = true;
}

swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
swapChainDesc.Flags = 0;

D3D_FEATURE_LEVEL featureLevels[4] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3, };
if (FAILED(D3D11CreateDeviceAndSwapChain(0, D3D_DRIVER_TYPE_HARDWARE, 0, 0, featureLevels, 4, D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, &featureLevel, &deviceContext))) {
    if (!device) {
        printf("Insanity Error: Failed To Create Direct3D Device\n");
    }
    if (!swapChain) {
        printf("Insanity Error: Failed To Create Swap Chain\n");
    }
    return false;
}
else {
    switch (featureLevel) {
    case D3D_FEATURE_LEVEL_11_0:
        printf("Insanity Info: Currently Using DirectX 11.0\n");
        break;
    case D3D_FEATURE_LEVEL_10_1:
        printf("Insanity Info: Currently Using DirectX 10.1\n");
        break;
    case D3D_FEATURE_LEVEL_10_0:
        printf("Insanity Info: Currently Using DirectX 10.0\n");
        break;
    case D3D_FEATURE_LEVEL_9_3:
        printf("Insanity Info: Currently Using DirectX 9.3\n");
        break;
    default:
        printf("Insanity Info: Graphics System Unknown\n");
        break;
    }
}
if (FAILED(swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferPtr))) {
    printf("Insanity Error: Faield To Find Back Buffer\n");
    return false;
}
if (FAILED(device->CreateRenderTargetView(backBufferPtr, 0, &renderTargetView))) {
    printf("Insanity Error: Failed To Create Render View Target\n");
    return false;
}
backBufferPtr->Release();
backBufferPtr = 0;

And then this is my code to set up the DepthStencilState and the RasterState

    ZeroMemory(&depthStencilDesc, sizeof(D3D11_DEPTH_STENCIL_DESC));
depthStencilDesc.DepthEnable = false;
depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
depthStencilDesc.StencilEnable = true;
depthStencilDesc.StencilReadMask = 0xFF;
depthStencilDesc.StencilWriteMask = 0xFF;
depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
if (FAILED(device->CreateDepthStencilState(&depthStencilDesc, &depthDisableStencilState))) {
    printf("Insanity Error: Failed To Create Depth State\n");
    return false;
}

deviceContext->OMSetDepthStencilState(depthEnableStencilState, 1);
this->enableDepthTesting = true;

ZeroMemory(&depthStencilViewDesc, sizeof(depthStencilViewDesc));
depthStencilViewDesc.Format = depthBufferDesc.Format;
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
depthStencilViewDesc.Texture2D.MipSlice = 0;
if (FAILED(device->CreateDepthStencilView(depthStencilBuffer, &depthStencilViewDesc, &depthStencilView))) {
    printf("Insanity Error: Failed To Create Depth View\n");
    return false;
}

rasterDesc.AntialiasedLineEnable = false;
rasterDesc.CullMode = D3D11_CULL_NONE;
rasterDesc.DepthBias = 0;
rasterDesc.DepthBiasClamp = 0.0f;
rasterDesc.DepthClipEnable = true;
rasterDesc.FillMode = D3D11_FILL_SOLID;
rasterDesc.FrontCounterClockwise = false;
rasterDesc.MultisampleEnable = false;
rasterDesc.ScissorEnable = true;
rasterDesc.SlopeScaledDepthBias = 0.0f;

if (FAILED(device->CreateRasterizerState(&rasterDesc, &rasterState))) {
    printf("Insanity Error: Failed To Create Rasterizer State\n");
    return false;
}

deviceContext->RSSetState(rasterState);

If any one has any ideas as to what could be going on please help!

scribblesiam
  • 131
  • 1
  • 1
  • 4
  • Is this a laptop with nvdia "optimus" where is has both a build in graphics and a better nvidia card and decides using some ill defined rules which to use? Perhaps it's picking different one when it's powered? – jcoder Nov 13 '12 at 16:11
  • Although I don't see from your code why that would make it crash from a quick look. – jcoder Nov 13 '12 at 16:11
  • How many times have you tested this? Are you sure this isn't a hardware problem, like the battery? – Nick Jan 31 '13 at 16:42
  • The first thing to try is to enable the [DEBUG](http://blogs.msdn.com/b/chuckw/archive/2012/11/30/direct3d-sdk-debug-layer-tricks.aspx) device and see if you get any CORRUPTION or ERROR messages that indicate a problem with the application itself. – Chuck Walbourn Nov 26 '14 at 19:37

1 Answers1

0

Try using the reference device instead of your hardware device and see if the problem recurs. This should help isolate the driver from the code. When you create your device, instead use D3D_DRIVER_TYPE_REFERENCE.

Justin R.
  • 23,435
  • 23
  • 108
  • 157