示例#1
0
DeDistortPtr TrackerConfig::getTransform() const
{
    glm::vec2 CameraExtents = getPointParam("/camera/size/");
    DeDistortPtr pDD(new DeDistort);
    pDD->load(CameraExtents, *this);
    return pDD;
}
示例#2
0
//! 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();
    }
}
示例#3
0
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;
	}
}