DeDistortPtr TrackerConfig::getTransform() const { glm::vec2 CameraExtents = getPointParam("/camera/size/"); DeDistortPtr pDD(new DeDistort); pDD->load(CameraExtents, *this); return pDD; }
//! Releases core DirectDraw objects void DestroyDDraw() { DestroyPrimary(); // Release the DDraw object if (g_pDD) { LPDIRECTDRAW7 pDD(g_pDD); // be sure nobody uses old value g_pDD = NULL; Sleep(1); pDD->Release(); } }
DWORD WINAPI thread_vsync(LPVOID lpParameter) { BOOL vblank = false; while(g_video && g_video->running) { while(!vblank && g_video && g_video->running) { YIELD_TO_THREAD(); LPDIRECTDRAW7 pDD(g_pDD); if(pDD) pDD->GetVerticalBlankStatus(&vblank); } LPDIRECTDRAWSURFACE7 pDDSOverlay(g_pDDSOverlay); if(pDDSOverlay) pDDSOverlay->UpdateOverlay(&g_rcSrc, g_pDDSPrimary, &g_rcDst, g_OverlayFlags | DDOVER_REFRESHALL, &g_OverlayFX); do { Sleep(1); LPDIRECTDRAW7 pDD(g_pDD); if(pDD) pDD->GetVerticalBlankStatus(&vblank); } while(vblank && g_video && g_video->running); while(g_video && !g_video->updating && g_video->running) Sleep(10); } return 0; }
BOOL ImageBuffer::Setup( DisplayDevice *dev, int w, int h, MPRSurfaceType front, MPRSurfaceType back, HWND targetWin, BOOL clip, BOOL fullScreen, BOOL bWillCallSwapBuffer ) { ZeroMemory(&m_rcFront, sizeof(m_rcFront)); try { ShiAssert( !IsReady() ); ShiAssert( dev ); // Record the properties of the buffer(s) we're creating device = dev; width = w; height = h; IDirectDraw7Ptr pDD(dev->GetMPRdevice()); DDSURFACEDESC2 ddsd; ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwFlags = DDSD_CAPS; ddsd.dwSize = sizeof(ddsd); switch(front) { case Primary: { switch(back) { case SystemMem: { ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; CheckHR(pDD->CreateSurface(&ddsd, &m_pDDSFront, NULL)); ddsd.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT; ddsd.dwWidth = w; ddsd.dwHeight = h; ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE; CheckHR(pDD->CreateSurface(&ddsd, &m_pDDSBack, NULL)); break; } case VideoMem: { ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; CheckHR(pDD->CreateSurface(&ddsd, &m_pDDSFront, NULL)); ddsd.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT; ddsd.dwWidth = w; ddsd.dwHeight = h; ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; CheckHR(pDD->CreateSurface(&ddsd, &m_pDDSBack, NULL)); break; } case Flip: { if(!fullScreen) { ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; CheckHR(pDD->CreateSurface(&ddsd, &m_pDDSFront, NULL)); ddsd.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT; ddsd.dwWidth = w; ddsd.dwHeight = h; ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; CheckHR(pDD->CreateSurface(&ddsd, &m_pDDSBack, NULL)); } else { // Create the primary surface. ddsd.dwFlags |= DDSD_BACKBUFFERCOUNT; ddsd.ddsCaps.dwCaps |= DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE | DDSCAPS_COMPLEX | DDSCAPS_FLIP; ddsd.dwBackBufferCount = 1; CheckHR(pDD->CreateSurface(&ddsd, &m_pDDSFront, NULL)); // Get the attached backbuffer surface DDSCAPS2 ddscaps; ZeroMemory(&ddscaps, sizeof(ddscaps)); ddscaps.dwCaps = DDSCAPS_BACKBUFFER; CheckHR(m_pDDSFront->GetAttachedSurface(&ddscaps, &m_pDDSBack)); } break; } case None: { ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE; CheckHR(pDD->CreateSurface(&ddsd, &m_pDDSFront, NULL)); CheckHR(m_pDDSFront->QueryInterface(IID_IDirectDrawSurface7, (void **) &m_pDDSBack)); break; } default: { ShiAssert(false); // illegal combination return FALSE; } } // auto adjust front rect when creating the primary surface in windowed mode if(!fullScreen) { GetClientRect(targetWin, &m_rcFront); ClientToScreen(targetWin, (LPPOINT)&m_rcFront); ClientToScreen(targetWin, (LPPOINT)&m_rcFront+1); m_bFrontRectValid = true; } break; } case SystemMem: { switch(back) { case SystemMem: { ShiAssert(false); // not implemented yet break; } case VideoMem: { ShiAssert(false); // not implemented yet break; } case Flip: { ShiAssert(false); // not implemented yet break; } case None: { ddsd.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT; ddsd.dwWidth = w; ddsd.dwHeight = h; ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE; CheckHR(pDD->CreateSurface(&ddsd, &m_pDDSFront, NULL)); CheckHR(m_pDDSFront->QueryInterface(IID_IDirectDrawSurface7, (void **) &m_pDDSBack)); break; } default: { ShiAssert(false); // illegal combination return FALSE; } } break; } case VideoMem: { switch(back) { case SystemMem: { ShiAssert(false); // not implemented yet break; } case VideoMem: { ShiAssert(false); // not implemented yet break; } case Flip: { ShiAssert(false); // not implemented yet break; } case None: { ddsd.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT; ddsd.dwWidth = w; ddsd.dwHeight = h; ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE; HRESULT hr = pDD->CreateSurface(&ddsd, &m_pDDSFront, NULL); if(FAILED(hr)) { if(hr == DDERR_OUTOFVIDEOMEMORY) { MonoPrint("ImageBuffer::Setup - EVICTING MANAGED TEXTURES !!\n"); // if we are out of video memory, evict all managed textures and retry CheckHR(dev->GetDefaultRC()->m_pD3D->EvictManagedTextures()); CheckHR(pDD->CreateSurface(&ddsd, &m_pDDSFront, NULL)); } else throw _com_error(hr); } CheckHR(m_pDDSFront->QueryInterface(IID_IDirectDrawSurface7, (void **) &m_pDDSBack)); break; } default: { ShiAssert(false); // illegal combination return FALSE; } } break; } case LocalVideoMem: case LocalVideoMem3D: { switch(back) { case SystemMem: { ShiAssert(false); // not implemented yet break; } case VideoMem: { ShiAssert(false); // not implemented yet break; } case Flip: { ShiAssert(false); // not implemented yet break; } case None: { ddsd.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT; ddsd.dwWidth = w; ddsd.dwHeight = h; ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM; if(front == LocalVideoMem3D) ddsd.ddsCaps.dwCaps |= DDSCAPS_3DDEVICE; else ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; HRESULT hr = pDD->CreateSurface(&ddsd, &m_pDDSFront, NULL); if(FAILED(hr)) { if(hr == DDERR_OUTOFVIDEOMEMORY) { MonoPrint("ImageBuffer::Setup - EVICTING MANAGED TEXTURES !!\n"); // if we are out of video memory, evict all managed textures and retry CheckHR(dev->GetDefaultRC()->m_pD3D->EvictManagedTextures()); CheckHR(pDD->CreateSurface(&ddsd, &m_pDDSFront, NULL)); } else throw _com_error(hr); } CheckHR(m_pDDSFront->QueryInterface(IID_IDirectDrawSurface7, (void **) &m_pDDSBack)); break; } default: { ShiAssert(false); // illegal combination return FALSE; } } break; } /* case Flip: { switch(back) { case SystemMem: { break; } case VideoMem: { break; } case Flip: { break; } case None: { break; } default: { ShiAssert(false); // illegal combination return FALSE; } } break; } */ case None: // Note: This doesnt create a 3D surface and it lets the driver decide where to put it) { switch(back) { case SystemMem: { ShiAssert(false); // not implemented yet break; } case VideoMem: { ShiAssert(false); // not implemented yet break; } case Flip: { ShiAssert(false); // not implemented yet break; } case None: { ddsd.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT; ddsd.dwWidth = w; ddsd.dwHeight = h; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; CheckHR(pDD->CreateSurface(&ddsd, &m_pDDSFront, NULL)); CheckHR(m_pDDSFront->QueryInterface(IID_IDirectDrawSurface7, (void **) &m_pDDSBack)); break; } default: { ShiAssert(false); // illegal combination return FALSE; } } break; } default: { ShiAssert(false); // illegal combination return FALSE; } } if(clip && m_pDDSFront) { ShiAssert(!fullScreen); IDirectDrawClipperPtr pDDCLP; CheckHR(pDD->CreateClipper(0, &pDDCLP, NULL)); CheckHR(pDDCLP->SetHWnd( 0, targetWin)); CheckHR(m_pDDSFront->SetClipper(pDDCLP)); } // Compute the color format conversion parameters m_ddsdFront.dwSize = sizeof(DDSURFACEDESC2); CheckHR(m_pDDSFront->GetSurfaceDesc(&m_ddsdFront)); m_ddsdBack.dwSize = sizeof(DDSURFACEDESC2); CheckHR(m_pDDSBack->GetSurfaceDesc(&m_ddsdBack)); /* #ifdef _DEBUG if(back == None) // MonoPrint("ImageBuffer::Setup - %dx%d front (%s) created in %s memory\n", // m_ddsdFront.dwWidth, m_ddsdFront.dwHeight, arrType2String[front], // m_ddsdFront.ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY ? "SYSTEM" : // (m_ddsdFront.ddsCaps.dwCaps & DDSCAPS_LOCALVIDMEM ? "VIDEO" : "AGP")); else /* MonoPrint("ImageBuffer::Setup - %dx%d front (%s) created in %s memory, back (%s) created in %s memory\n", m_ddsdFront.dwWidth, m_ddsdFront.dwHeight, arrType2String[front], m_ddsdFront.ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY ? "SYSTEM" : (m_ddsdFront.ddsCaps.dwCaps & DDSCAPS_LOCALVIDMEM ? "VIDEO" : "AGP"), arrType2String[back], m_ddsdBack.ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY ? "SYSTEM" : (m_ddsdBack.ddsCaps.dwCaps & DDSCAPS_LOCALVIDMEM ? "VIDEO" : "AGP")); #endif */ // Set blt target surface depending on wether we will page flip or not if(bWillCallSwapBuffer) m_pBltTarget = m_pDDSBack; else m_pBltTarget = m_pDDSFront; ComputeColorShifts(); // Everything worked, so finish up and return m_bReady = TRUE; return TRUE; } catch(_com_error e) { MonoPrint("ImageBuffer::Setup - Error 0x%X\n", e.Error()); return FALSE; } }