⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dglcontext.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
	hResult = IDirect3DDevice3_AddViewport(lpCtx->lpDev3, lpCtx->lpViewport3);	if (FAILED(hResult)) {		ddlogError(DDLOG_CRITICAL_OR_WARN, "AddViewport failed", hResult);		goto return_with_error;	}	// Initialise the viewport	// Note screen coordinates are used for viewport clipping since D3D	// transform operations are not used in the GLD CAD driver. (DaveM)	inv_aspect = (float)lpCtx->dwHeight/(float)lpCtx->dwWidth;	lpCtx->d3dViewport.dwSize = sizeof(lpCtx->d3dViewport);	lpCtx->d3dViewport.dwX = 0;	lpCtx->d3dViewport.dwY = 0;	lpCtx->d3dViewport.dwWidth = lpCtx->dwWidth;	lpCtx->d3dViewport.dwHeight = lpCtx->dwHeight;	lpCtx->d3dViewport.dvClipX = 0; // -1.0f;	lpCtx->d3dViewport.dvClipY = 0; // inv_aspect;	lpCtx->d3dViewport.dvClipWidth = lpCtx->dwWidth; // 2.0f;	lpCtx->d3dViewport.dvClipHeight = lpCtx->dwHeight; // 2.0f * inv_aspect;	lpCtx->d3dViewport.dvMinZ = 0.0f;	lpCtx->d3dViewport.dvMaxZ = 1.0f;	TRY(IDirect3DViewport3_SetViewport2(lpCtx->lpViewport3, &lpCtx->d3dViewport), "dglCreateContext: SetViewport2");	hResult = IDirect3DDevice3_SetCurrentViewport(lpCtx->lpDev3, lpCtx->lpViewport3);	if (FAILED(hResult)) {		ddlogError(DDLOG_CRITICAL_OR_WARN, "SetCurrentViewport failed", hResult);		goto return_with_error;	}	lpCtx->dwBPP = lpPFD->cColorBits;	lpCtx->iZBufferPF = lpCtx->lpPF->iZBufferPF;	// Set last texture to NULL	for (i=0; i<MAX_TEXTURE_UNITS; i++) {		lpCtx->ColorOp[i] = D3DTOP_DISABLE;		lpCtx->AlphaOp[i] = D3DTOP_DISABLE;		lpCtx->tObj[i] = NULL;	}	// Default to perspective correct texture mapping	dglSetRenderState(lpCtx, D3DRENDERSTATE_TEXTUREPERSPECTIVE, TRUE, "TexturePersp");	// Set the default culling mode	lpCtx->cullmode = D3DCULL_NONE;	dglSetRenderState(lpCtx, D3DRENDERSTATE_CULLMODE, D3DCULL_NONE, "CullMode");	// Disable specular	dglSetRenderState(lpCtx, D3DRENDERSTATE_SPECULARENABLE, FALSE, "SpecularEnable");	// Disable subpixel correction//	dglSetRenderState(lpCtx, D3DRENDERSTATE_SUBPIXEL, FALSE, "SubpixelEnable");	// Disable dithering	dglSetRenderState(lpCtx, D3DRENDERSTATE_DITHERENABLE, FALSE, "DitherEnable");	// Initialise the primitive caches//	lpCtx->dwNextLineVert	= 0;//	lpCtx->dwNextTriVert	= 0;	// Init the global texture palette	lpCtx->lpGlobalPalette = NULL;	// Init the HW/SW usage counters//	lpCtx->dwHWUsageCount = lpCtx->dwSWUsageCount = 0L;	//	// Create two D3D vertex buffers.	// One will hold the pre-transformed data with the other one	// being used to hold the post-transformed & clipped verts.	//#if 0  // never used (DaveM)	vbufdesc.dwSize = sizeof(D3DVERTEXBUFFERDESC);	vbufdesc.dwCaps = D3DVBCAPS_WRITEONLY;	if (glb.bHardware == FALSE)		vbufdesc.dwCaps = D3DVBCAPS_SYSTEMMEMORY;	vbufdesc.dwNumVertices = 32768; // For the time being	// Source vertex buffer	vbufdesc.dwFVF = DGL_LVERTEX;	hResult = IDirect3D3_CreateVertexBuffer(lpCtx->lpD3D3, &vbufdesc, &lpCtx->m_vbuf, 0, NULL);	if (FAILED(hResult)) {		ddlogError(DDLOG_CRITICAL_OR_WARN, "CreateVertexBuffer(src) failed", hResult);		goto return_with_error;	}	// Destination vertex buffer	vbufdesc.dwFVF = (glb.bMultitexture == FALSE) ? D3DFVF_TLVERTEX : (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX2);	hResult = IDirect3D3_CreateVertexBuffer(lpCtx->lpD3D3, &vbufdesc, &lpCtx->m_pvbuf, 0, NULL);	if(FAILED(hResult)) {		ddlogError(DDLOG_CRITICAL_OR_WARN, "CreateVertexBuffer(dst) failed", hResult);		goto return_with_error;	}#endif#endif _USE_GLD3_WGL	//	//	Now create the Mesa context	//	// Create the Mesa visual	if (lpPFD->cDepthBits)		dwDepthBits = 16;	if (lpPFD->cStencilBits)		dwStencilBits = 8;	if (lpPFD->cAlphaBits) {		dwAlphaBits = 8;		bAlphaSW = GL_TRUE;	}	if (lpPFD->dwFlags & PFD_DOUBLEBUFFER)		bDouble = GL_TRUE;//	lpCtx->EmulateSingle =//		(lpPFD->dwFlags & PFD_DOUBLEBUFFER) ? FALSE : TRUE;#ifdef _USE_GLD3_WGL	lpCtx->glVis = _mesa_create_visual(		GL_TRUE,		// RGB mode		bDouble,    /* double buffer */		GL_FALSE,			// stereo		lpPFD->cRedBits,		lpPFD->cGreenBits,		lpPFD->cBlueBits,		dwAlphaBits,		0,				// index bits		dwDepthBits,		dwStencilBits,		lpPFD->cAccumRedBits,	// accum bits		lpPFD->cAccumGreenBits,	// accum bits		lpPFD->cAccumBlueBits,	// accum bits		lpPFD->cAccumAlphaBits,	// accum alpha bits		1				// num samples		);#else // _USE_GLD3_WGL	lpCtx->glVis = (*mesaFuncs.gl_create_visual)(		GL_TRUE,			// RGB mode		bAlphaSW,			// Is an alpha buffer required?		bDouble,			// Is an double-buffering required?		GL_FALSE,			// stereo		dwDepthBits,		// depth_size		dwStencilBits,		// stencil_size		lpPFD->cAccumBits,	// accum_size		0,					// colour-index bits		lpPFD->cRedBits,	// Red bit count		lpPFD->cGreenBits,	// Green bit count		lpPFD->cBlueBits,	// Blue bit count		dwAlphaBits			// Alpha bit count		);#endif // _USE_GLD3_WGL	if (lpCtx->glVis == NULL) {		ddlogMessage(DDLOG_CRITICAL_OR_WARN, "gl_create_visual failed\n");		goto return_with_error;	}#ifdef _USE_GLD3_WGL	lpCtx->glCtx = _mesa_create_context(lpCtx->glVis, NULL, (void *)lpCtx, GL_TRUE);#else	// Create the Mesa context	lpCtx->glCtx = (*mesaFuncs.gl_create_context)(					lpCtx->glVis,	// Mesa visual					NULL,			// share list context					(void *)lpCtx,	// Pointer to our driver context					GL_TRUE			// Direct context flag				   );#endif // _USE_GLD3_WGL	if (lpCtx->glCtx == NULL) {		ddlogMessage(DDLOG_CRITICAL_OR_WARN, "gl_create_context failed\n");		goto return_with_error;	}	// Create the Mesa framebuffer#ifdef _USE_GLD3_WGL	lpCtx->glBuffer = _mesa_create_framebuffer(		lpCtx->glVis,		lpCtx->glVis->depthBits > 0,		lpCtx->glVis->stencilBits > 0,		lpCtx->glVis->accumRedBits > 0,		GL_FALSE //swalpha		);#else	lpCtx->glBuffer = (*mesaFuncs.gl_create_framebuffer)(lpCtx->glVis);#endif // _USE_GLD3_WGL	if (lpCtx->glBuffer == NULL) {		ddlogMessage(DDLOG_CRITICAL_OR_WARN, "gl_create_framebuffer failed\n");		goto return_with_error;	}#ifdef _USE_GLD3_WGL	// Init Mesa internals	_swrast_CreateContext( lpCtx->glCtx );	_vbo_CreateContext( lpCtx->glCtx );	_tnl_CreateContext( lpCtx->glCtx );	_swsetup_CreateContext( lpCtx->glCtx );	_gldDriver.InitialiseMesa(lpCtx);		lpCtx->glCtx->imports.warning	= _gld_mesa_warning;	lpCtx->glCtx->imports.fatal		= _gld_mesa_fatal;#else	// Tell Mesa how many texture stages we have	glb.wMaxSimultaneousTextures = lpCtx->D3DDevDesc.wMaxSimultaneousTextures;	// Only use as many Units as the spec requires	if (glb.wMaxSimultaneousTextures > MAX_TEXTURE_UNITS)		glb.wMaxSimultaneousTextures = MAX_TEXTURE_UNITS;	lpCtx->glCtx->Const.MaxTextureUnits = glb.wMaxSimultaneousTextures;	ddlogPrintf(DDLOG_INFO, "Texture stages   : %d", glb.wMaxSimultaneousTextures);	// Set the max texture size.	// NOTE: clamped to a max of 1024 for extra performance!	lpCtx->dwMaxTextureSize = (lpCtx->D3DDevDesc.dwMaxTextureWidth <= 1024) ? lpCtx->D3DDevDesc.dwMaxTextureWidth : 1024;// Texture resize takes place elsewhere. KH// NOTE: This was added to workaround an issue with the Intel app.#if 0	lpCtx->glCtx->Const.MaxTextureSize = lpCtx->dwMaxTextureSize;#else	lpCtx->glCtx->Const.MaxTextureSize = 1024;#endif	// Setup the Display Driver pointers	dglSetupDDPointers(lpCtx->glCtx);	// Initialise all the Direct3D renderstates	dglInitStateD3D(lpCtx->glCtx);#if 0	// Signal a reload of texture state on next glBegin	lpCtx->m_texHandleValid = FALSE;	lpCtx->m_mtex = FALSE;	lpCtx->m_texturing = FALSE;#else	// Set default texture unit state//	dglSetTexture(lpCtx, 0, NULL);//	dglSetTexture(lpCtx, 1, NULL);#endif	//	// Set the global texture palette to default values.	//	// Clear the entire palette	ZeroMemory(ppe, sizeof(PALETTEENTRY) * 256);	// Fill the palette with a default colour.	// A garish colour is used to catch bugs. Here Magenta is used.	for (i=0; i < 256; i++) {		ppe[i].peRed	= 255;		ppe[i].peGreen	= 0;		ppe[i].peBlue	= 255;	}	RELEASE(lpCtx->lpGlobalPalette);	if (glb.bDirectDrawPersistant && glb.bPersistantBuffers && glb.lpGlobalPalette)		hResult = IDirectDrawPalette_AddRef(lpCtx->lpGlobalPalette = glb.lpGlobalPalette);	else		hResult = IDirectDraw4_CreatePalette(				lpCtx->lpDD4,				DDPCAPS_INITIALIZE | DDPCAPS_8BIT | DDPCAPS_ALLOW256,				ppe,				&(lpCtx->lpGlobalPalette),				NULL);	if (FAILED(hResult)) {		ddlogError(DDLOG_ERROR, "Default CreatePalette failed\n", hResult);		lpCtx->lpGlobalPalette = NULL;		goto return_with_error;	}	if (glb.bDirectDrawPersistant && glb.bPersistantBuffers && !glb.lpGlobalPalette)		IDirectDrawPalette_AddRef(glb.lpGlobalPalette = lpCtx->lpGlobalPalette);#endif // _USE_GLD3_WGL	// ** If we have made it to here then we can enable rendering **	lpCtx->bCanRender = TRUE;//	ddlogMessage(DDLOG_SYSTEM, "dglCreateContextBuffers succeded\n");#ifdef GLD_THREADS	// Release serialized access	if (glb.bMultiThreaded)		LeaveCriticalSection(&CriticalSection);#endif	return TRUE;return_with_error:	// Clean up before returning.	// This is critical for secondary devices.	lpCtx->bCanRender = FALSE;#ifdef _USE_GLD3_WGL	// Destroy the Mesa context	if (lpCtx->glBuffer)		_mesa_destroy_framebuffer(lpCtx->glBuffer);	if (lpCtx->glCtx)		_mesa_destroy_context(lpCtx->glCtx);	if (lpCtx->glVis)		_mesa_destroy_visual(lpCtx->glVis);	// Destroy driver data	_gldDriver.DestroyDrawable(lpCtx);#else	// Destroy the Mesa context	if (lpCtx->glBuffer)		(*mesaFuncs.gl_destroy_framebuffer)(lpCtx->glBuffer);	if (lpCtx->glCtx)		(*mesaFuncs.gl_destroy_context)(lpCtx->glCtx);	if (lpCtx->glVis)		(*mesaFuncs.gl_destroy_visual)(lpCtx->glVis);	RELEASE(lpCtx->m_pvbuf); // Release D3D vertex buffer	RELEASE(lpCtx->m_vbuf); // Release D3D vertex buffer	if (lpCtx->lpViewport3) {		if (lpCtx->lpDev3) IDirect3DDevice3_DeleteViewport(lpCtx->lpDev3, lpCtx->lpViewport3);		RELEASE(lpCtx->lpViewport3);		lpCtx->lpViewport3 = NULL;	}	RELEASE(lpCtx->lpDev3);	if (lpCtx->lpDepth4) {		if (lpCtx->lpBack4)			IDirectDrawSurface4_DeleteAttachedSurface(lpCtx->lpBack4, 0L, lpCtx->lpDepth4);		else			IDirectDrawSurface4_DeleteAttachedSurface(lpCtx->lpFront4, 0L, lpCtx->lpDepth4);		RELEASE(lpCtx->lpDepth4);		lpCtx->lpDepth4 = NULL;	}	RELEASE(lpCtx->lpBack4);	RELEASE(lpCtx->lpFront4);	else	if (lpCtx->bFullscreen) {		IDirectDraw4_RestoreDisplayMode(lpCtx->lpDD4);		IDirectDraw4_SetCooperativeLevel(lpCtx->lpDD4, NULL, DDSCL_NORMAL);	}	RELEASE(lpCtx->lpD3D3);	RELEASE(lpCtx->lpDD4);	RELEASE(lpCtx->lpDD1);#endif // _USE_GLD3_WGL	lpCtx->bAllocated = FALSE;#ifdef GLD_THREADS	// Release serialized access	if (glb.bMultiThreaded)		LeaveCriticalSection(&CriticalSection);#endif	return FALSE;#undef DDLOG_CRITICAL_OR_WARN}// ***********************************************************************HGLRC dglCreateContext(	HDC a,	const DGL_pixelFormat *lpPF){	int i;	HGLRC				hGLRC;	DGL_ctx*			lpCtx;	static BOOL			bWarnOnce = TRUE;	DWORD				dwThreadId = GetCurrentThreadId();    char                szMsg[256];    HWND                hWnd;    LONG                lpfnWndProc;	// Validate license	if (!dglValidate())		return NULL;	// Is context state ready ?	if (!bContextReady)		return NULL;	ddlogPrintf(DDLOG_SYSTEM, "dglCreateContext for HDC=%X, ThreadId=%X", a, dwThreadId);	// Find next free context.	// Also ensure that only one Fullscreen context is created at any one time.	hGLRC = 0; // Default to Not Found	for (i=0; i<DGL_MAX_CONTEXTS; i++) {		if (ctxlist[i].bAllocated) {			if (/*glb.bFullscreen && */ctxlist[i].bFullscreen)				break;		} else {			hGLRC = (HGLRC)(i+1);			break;		}	}	// Bail if no GLRC was found	if (!hGLRC)		return NULL;	// Set the context pointer	lpCtx = dglGetContextAddress(hGLRC);	// Make sure that context is zeroed before we do anything.	// MFC and C++ apps call wglCreateContext() and wglDeleteContext() multiple times,	// even though only one context is ever used by the app, so keep it clean. (DaveM)	ZeroMemory(lpCtx, sizeof(DGL_ctx));	lpCtx->bAllocated = TRUE;	// Flag that buffers need creating on next wglMakeCurrent call.	lpCtx->bHasBeenCurrent = FALSE;	lpCtx->lpPF = (DGL_pixelFormat *)lpPF;	// cache pixel format	lpCtx->bCanRender = FALSE;	// Create all the internal resources here, not in dglMakeCurrent().	// We do a re-size check in dglMakeCurrent in case of re-allocations. (DaveM)	// We now try context allocations twice, first with video memory,	// then again with system memory. This is similar to technique	// used for dglWglResizeBuffers(). (DaveM)	if (lpCtx->bHasBeenCurrent == FALSE) {		if (!dglCreateContextBuffers(a, lpCtx, FALSE)) {			if (glb.bMessageBoxWarnings && bWarnOnce && dwLogging) {				bWarnOnce = FALSE;                switch (nContextError) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -