コード例 #1
0
ファイル: main.cpp プロジェクト: Tloz/mkxp
static bool
setupOptionalGLExtensions(RGSSThreadData* threadData)
{
	if (!GLEW_ARB_framebuffer_object)
	{
		if (!GLEW_EXT_framebuffer_object && !GLEW_EXT_framebuffer_blit)
		{
			rgssThreadError(threadData, "GL extensions \"GL_ARB_framebuffer_object\" or compatible extensiosns GL_EXT_framebuffer_object and GL_EXT_framebuffer_blit are not present");
			return false;
		}
		else
		{
			/* setup compat */
			/* From EXT_framebuffer_object */
			glGenRenderbuffers        = glGenRenderbuffersEXT;
			glDeleteRenderbuffers     = glDeleteRenderbuffersEXT;
			glBindRenderbuffer        = glBindRenderbufferEXT;
			glRenderbufferStorage     = glRenderbufferStorageEXT;

			glGenFramebuffers         = glGenFramebuffersEXT;
			glDeleteFramebuffers      = glDeleteFramebuffersEXT;
			glBindFramebuffer         = glBindFramebufferEXT;
			glFramebufferTexture2D    = glFramebufferTexture2DEXT;
			glFramebufferRenderbuffer = glFramebufferRenderbufferEXT;

			/* From EXT_framebuffer_blit */
			glBlitFramebuffer         = glBlitFramebufferEXT;
		}
	}
	if (!GLEW_ARB_timer_query && GLEW_EXT_timer_query)
	{
		glGetQueryObjecti64v  = glGetQueryObjecti64vEXT;
		glGetQueryObjectui64v = glGetQueryObjectui64vEXT;
	}
	if (!GLEW_ARB_vertex_array_object )
	{
		if (!GLEW_APPLE_vertex_array_object)
		{
			rgssThreadError(threadData, "GL extensions \"GL_ARB_vertex_array_object\" or compatible extensiosn GL_APPLE_vertex_array_object are not present");
			return false;
		}
		else
		{
			/* setup compat */
			glBindVertexArray    = glBindVertexArrayAPPLE;
			/* the cast is because apple's uses const GLuint* and ARB doesn't */
			glGenVertexArrays    = (PFNGLGENVERTEXARRAYSPROC)glGenVertexArraysAPPLE;
			glDeleteVertexArrays = glDeleteVertexArraysAPPLE;
		}
	}

	return true;
}
コード例 #2
0
ファイル: main.cpp プロジェクト: Ancurio/mkxp-abs
int rgssThreadFun(void *userdata)
{
	RGSSThreadData *threadData = static_cast<RGSSThreadData*>(userdata);
	const Config &conf = threadData->config;
	SDL_Window *win = threadData->window;
	SDL_GLContext glCtx;

	/* Setup GL context */
	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

	if (conf.debugMode)
		SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);

	glCtx = SDL_GL_CreateContext(win);

	if (!glCtx)
	{
		rgssThreadError(threadData, std::string("Error creating context: ") + SDL_GetError());
		return 0;
	}

	try
	{
		initGLFunctions();
	}
	catch (const Exception &exc)
	{
		rgssThreadError(threadData, exc.msg);
		SDL_GL_DeleteContext(glCtx);

		return 0;
	}

	if (!conf.enableBlitting)
		gl.BlitFramebuffer = 0;

	gl.ClearColor(0, 0, 0, 1);
	gl.Clear(GL_COLOR_BUFFER_BIT);
	SDL_GL_SwapWindow(win);

	printGLInfo();

	bool vsync = conf.vsync || conf.syncToRefreshrate;
	SDL_GL_SetSwapInterval(vsync ? 1 : 0);

	GLDebugLogger dLogger;

	/* Setup AL context */
	ALCcontext *alcCtx = alcCreateContext(threadData->alcDev, 0);

	if (!alcCtx)
	{
		rgssThreadError(threadData, "Error creating OpenAL context");
		SDL_GL_DeleteContext(glCtx);

		return 0;
	}

	alcMakeContextCurrent(alcCtx);

	try
	{
		SharedState::initInstance(threadData);
	}
	catch (const Exception &exc)
	{
		rgssThreadError(threadData, exc.msg);
		alcDestroyContext(alcCtx);
		SDL_GL_DeleteContext(glCtx);

		return 0;
	}

	/* Start script execution */
	scriptBinding->execute();

	threadData->rqTermAck.set();
	threadData->ethread->requestTerminate();

	SharedState::finiInstance();

	alcDestroyContext(alcCtx);
	SDL_GL_DeleteContext(glCtx);

	return 0;
}
コード例 #3
0
ファイル: main.cpp プロジェクト: Tloz/mkxp
int rgssThreadFun(void *userdata)
{
	RGSSThreadData *threadData = static_cast<RGSSThreadData*>(userdata);
	SDL_Window *win = threadData->window;
	SDL_GLContext glCtx;

	/* Setup GL context */
	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

	if (threadData->config.debugMode)
		SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);

	glCtx = SDL_GL_CreateContext(win);

	if (!glCtx)
	{
		rgssThreadError(threadData, std::string("Error creating context: ") + SDL_GetError());
		return 0;
	}

	if (glewInit() != GLEW_OK)
	{
		rgssThreadError(threadData, "Error initializing glew");
		SDL_GL_DeleteContext(glCtx);

		return 0;
	}

	glClearColor(0, 0, 0, 1);
	glClear(GL_COLOR_BUFFER_BIT);
	SDL_GL_SwapWindow(win);

	printGLInfo();

	/* Check for required GL version */
	if (!GLEW_VERSION_2_0)
	{
		rgssThreadError(threadData, "At least OpenGL 2.0 is required");
		SDL_GL_DeleteContext(glCtx);

		return 0;
	}

	/* Setup optional GL extensions */
	if (!setupOptionalGLExtensions(threadData))
	{
		SDL_GL_DeleteContext(glCtx);
		return 0;
	}

	SDL_GL_SetSwapInterval(threadData->config.vsync ? 1 : 0);

	DebugLogger dLogger;

	/* Setup AL context */
	ALCdevice *alcDev = alcOpenDevice(0);

	if (!alcDev)
	{
		rgssThreadError(threadData, "Error opening OpenAL device");
		SDL_GL_DeleteContext(glCtx);

		return 0;
	}

	ALCcontext *alcCtx = alcCreateContext(alcDev, 0);

	if (!alcCtx)
	{
		rgssThreadError(threadData, "Error creating OpenAL context");
		alcCloseDevice(alcDev);
		SDL_GL_DeleteContext(glCtx);

		return 0;
	}

	alcMakeContextCurrent(alcCtx);

	try
	{
		SharedState::initInstance(threadData);
	}
	catch (const Exception &exc)
	{
		rgssThreadError(threadData, exc.msg);
		alcDestroyContext(alcCtx);
		alcCloseDevice(alcDev);
		SDL_GL_DeleteContext(glCtx);

		return 0;
	}

	/* Start script execution */
	scriptBinding->execute();

	threadData->rqTermAck = true;
	threadData->ethread->requestTerminate();

	SharedState::finiInstance();

	alcDestroyContext(alcCtx);
	alcCloseDevice(alcDev);

	SDL_GL_DeleteContext(glCtx);

	return 0;
}