2012-02-18 38 views
1

を実行しているときにブルースクリーン私は次のコードを使用しようとしている:DirectX 11の私のプログラム

drawFrameがある
HRESULT hResult; 
HDC hDC; 
IDXGISurface1 *pSurface = NULL; 
hResult = m_flashTexture->QueryInterface(__uuidof(IDXGISurface1), (void**)&pSurface); 
hResult = pSurface->GetDC(TRUE, &hDC);     
assert(SUCCEEDED(hResult)); 
m_flashPlayer->DrawFrame(hDC); 

を...

void CFlashDXPlayer::DrawFrame(HDC dc) 
{ 
if (m_dirtyFlag) 
{ 
    IViewObject* pViewObject = NULL; 
    m_flashInterface->QueryInterface(IID_IViewObject, (LPVOID*) &pViewObject); 
    if (pViewObject != NULL) 
    { 
     // Combine regions 
     HRGN unionRgn, first, second = NULL; 
     unionRgn = CreateRectRgnIndirect(&m_dirtyRects[0]); 
     if (m_dirtyRects.size() >= 2) 
      second = CreateRectRgn(0, 0, 1, 1); 

     for (std::vector<RECT>::iterator it = m_dirtyRects.begin() + 1; it != m_dirtyRects.end(); ++it) 
     { 
      // Fill combined region 
      first = unionRgn; 
      SetRectRgn(second, it->left, it->top, it->right, it->bottom); 
      unionRgn = CreateRectRgn(0, 0, 1, 1); 

      CombineRgn(unionRgn, first, second, RGN_OR); 
      DeleteObject(first); 
     } 

     if (second) 
      DeleteObject(second); 

     RECT clipRgnRect; GetRgnBox(unionRgn, &clipRgnRect); 
     RECTL clipRect = { 0, 0, m_width, m_height }; 

     // Fill background 
     if (m_transpMode != TMODE_FULL_ALPHA) 
     { 
      // Set clip region 
      SelectClipRgn(dc, unionRgn); 

      COLORREF fillColor = GetBackgroundColor(); 
      HBRUSH fillColorBrush = CreateSolidBrush(fillColor); 
      FillRgn(dc, unionRgn, fillColorBrush); 
      DeleteObject(fillColorBrush); 

      // Draw to main buffer 
      HRESULT hr = pViewObject->Draw(DVASPECT_TRANSPARENT, 1, NULL, NULL, NULL, dc, &clipRect, &clipRect, NULL, 0); 
      assert(SUCCEEDED(hr)); 
     } 
     else 
     { 
      if (m_alphaBlackDC == NULL) 
      { 
       // Create memory buffers 
       BITMAPINFOHEADER bih = {0}; 
       bih.biSize = sizeof(BITMAPINFOHEADER); 
       bih.biBitCount = 32; 
       bih.biCompression = BI_RGB; 
       bih.biPlanes = 1; 
       bih.biWidth = LONG(m_width); 
       bih.biHeight = -LONG(m_height); 

       m_alphaBlackDC = CreateCompatibleDC(dc); 
       m_alphaBlackBitmap = CreateDIBSection(m_alphaBlackDC, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&m_alphaBlackBuffer, 0, 0); 
       SelectObject(m_alphaBlackDC, m_alphaBlackBitmap); 

       m_alphaWhiteDC = CreateCompatibleDC(dc); 
       m_alphaWhiteBitmap = CreateDIBSection(m_alphaWhiteDC, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&m_alphaWhiteBuffer, 0, 0); 
       SelectObject(m_alphaWhiteDC, m_alphaWhiteBitmap); 
      } 

      HRESULT hr; 
      HBRUSH fillColorBrush; 

      // Render frame twice - against white and against black background to calculate alpha 
      SelectClipRgn(m_alphaBlackDC, unionRgn); 

      COLORREF blackColor = 0x00000000; 
      fillColorBrush = CreateSolidBrush(blackColor); 
      FillRgn(m_alphaBlackDC, unionRgn, fillColorBrush); 
      DeleteObject(fillColorBrush); 

      hr = pViewObject->Draw(DVASPECT_TRANSPARENT, 1, NULL, NULL, NULL, m_alphaBlackDC, &clipRect, &clipRect, NULL, 0); 
      assert(SUCCEEDED(hr)); 

      // White background 
      SelectClipRgn(m_alphaWhiteDC, unionRgn); 

      COLORREF whiteColor = 0x00FFFFFF; 
      fillColorBrush = CreateSolidBrush(whiteColor); 
      FillRgn(m_alphaWhiteDC, unionRgn, fillColorBrush); 
      DeleteObject(fillColorBrush); 

      hr = pViewObject->Draw(DVASPECT_TRANSPARENT, 1, NULL, NULL, NULL, m_alphaWhiteDC, &clipRect, &clipRect, NULL, 0); 
      assert(SUCCEEDED(hr)); 

      // Combine alpha 
      for (LONG y = clipRgnRect.top; y < clipRgnRect.bottom; ++y) 
      { 
       int offset = y * m_width * 4 + clipRgnRect.left * 4; 
       for (LONG x = clipRgnRect.left; x < clipRgnRect.right; ++x) 
       { 
        BYTE blackRed = m_alphaBlackBuffer[offset]; 
        BYTE whiteRed = m_alphaWhiteBuffer[offset]; 
        m_alphaBlackBuffer[offset + 3] = 255 - (whiteRed - blackRed); 
        offset += 4; 
       } 
      } 

      // Blit result to target DC 
      BitBlt(dc, clipRgnRect.left, clipRgnRect.top, 
        clipRgnRect.right - clipRgnRect.left, 
        clipRgnRect.bottom - clipRgnRect.top, 
        m_alphaBlackDC, clipRgnRect.left, clipRgnRect.top, SRCCOPY); 
     } 

     DeleteObject(unionRgn); 
     pViewObject->Release(); 
    } 

    m_dirtyFlag = false; 
    m_dirtyRects.clear(); 
    m_dirtyUnionRect.left = m_dirtyUnionRect.top = LONG_MAX; 
    m_dirtyUnionRect.right = m_dirtyUnionRect.bottom = -LONG_MAX; 
} 
} 

また、私は設定されていることを言及する必要があります次を使用してm_flashTextureアップ:私はこのコードを実行するたびに

D3D11_TEXTURE2D_DESC textureDesc;     
ZeroMemory(&textureDesc, sizeof(textureDesc));     
textureDesc.Width = width;     
textureDesc.Height = height;     
textureDesc.MipLevels = 1;     
textureDesc.ArraySize = 1;     
textureDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;     
textureDesc.SampleDesc.Count = 1;     
textureDesc.Usage = D3D11_USAGE_DEFAULT;     
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE |  D3D11_BIND_RENDER_TARGET;     
textureDesc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE; 
HRESULT hr = device->CreateTexture2D(&textureDesc, NULL, &m_flashTexture); 

を(そこに多くのですが、それは他のクラスの束に埋め込まれた部分が、他の何かが役に立つと思ったら教えてください。)flashPlayer-> drawFrame()関数のどこかで引き起こされる死のブルースクリーンが表示されます。私は何がブルースクリーンを引き起こしているのか分かりません。

アイデアはありますか、それとも青い画面が表示されるように見えるものがありますか?

ありがとうございました。

詳細ここでの情報

は、クラッシュダンプ

ADDITIONAL_DEBUG_TEXT: 
Use '!findthebuild' command to search for the target build information. 
If the build information is available, run '!findthebuild -s ; .reload' to set symbol path and load symbols. 

FAULTING_MODULE: fffff80002c01000 nt 

DEBUG_FLR_IMAGE_TIMESTAMP: 4d41a3e1 

READ_ADDRESS: unable to get nt!MmSpecialPoolStart 
unable to get nt!MmSpecialPoolEnd 
unable to get nt!MmPoolCodeStart 
unable to get nt!MmPoolCodeEnd 
fffff8814061c6a0 

FAULTING_IP: 
igdpmd64+15a878 
fffff880`0697c878 8b0408   mov  eax,dword ptr [rax+rcx] 

MM_INTERNAL_CODE: 5 

CUSTOMER_CRASH_COUNT: 1 

DEFAULT_BUCKET_ID: VISTA_DRIVER_FAULT 

BUGCHECK_STR: 0x50 

CURRENT_IRQL: 0 

LAST_CONTROL_TRANSFER: from fffff80002c283bf to fffff80002c7dc40 

STACK_TEXT: 
fffff880`0a7e5878 fffff800`02c283bf : 00000000`00000050 fffff881`4061c6a0 00000000`00000000  fffff880`0a7e59e0 : nt+0x7cc40 
fffff880`0a7e5880 00000000`00000050 : fffff881`4061c6a0 00000000`00000000 fffff880`0a7e59e0  00000000`00000005 : nt+0x273bf 
fffff880`0a7e5888 fffff881`4061c6a0 : 00000000`00000000 fffff880`0a7e59e0 00000000`00000005 00000000`00000000 : 0x50 
fffff880`0a7e5890 00000000`00000000 : fffff880`0a7e59e0 00000000`00000005 00000000`00000000 00000000`00000000 : 0xfffff881`4061c6a0 


STACK_COMMAND: .bugcheck ; kb 

FOLLOWUP_IP: 
igdpmd64+15a878 
fffff880`0697c878 8b0408   mov  eax,dword ptr [rax+rcx] 

SYMBOL_NAME: igdpmd64+15a878 

FOLLOWUP_NAME: MachineOwner 

MODULE_NAME: igdpmd64 

IMAGE_NAME: igdpmd64.sys 

BUCKET_ID: WRONG_SYMBOLS 

Followup: MachineOwner 

からの結果は、これが何を意味するのか、誰を知っていますか?

+1

ビデオドライバを更新しようとしましたか?私はこの分野ではあまり知識がありませんが、間違って使用されたとしても、DirectXだけではブルースクリーンが発生する可能性があるように私には聞こえません。 –

+0

クラッシュに最も近いポイントにデバッガをログしたり歩いたりする方法はありませんか? – Gubatron

+0

うん、私はそれを試みた。そして私はそれが私がdirectxを使った方法ではないと思うことに同意します...あなたはそれがちょうど普通のエラーであると思うでしょう。 –

答えて

0

ユーザスペースアプリケーションを作成してBSoDを引き起こすときはいつでも、カーネルレベルのコードにバグがあります(Windowsカーネル自体、またはいくつかのドライバ、この場合igdpmd64.sys )。簡単に言えば、OSはのいずれの状況においても、ユーザ空間アプリケーションによって何かがクラッシュすることはありません。は決してありません。だから私はこのドライバのアップグレードがあるかどうかを調べます。

しかし、DirectXを間違って使用し、このドライバのバグを引き起こしているコードにバグがある可能性もあります。

確かに、私はクラッシュを引き起こす絶対的に最小限の完全なプログラムを作成しようとします。最低でも、ドライバーの作家に提出することができます。

関連する問題