13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program EGL Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ---------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief glw::FunctionLoader using eglGetProcAddress() and tcu::Library.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluGLFunctionLoader.hpp"
253c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "egluPlatform.hpp"
263c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwLibrary.hpp"
273c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "tcuFunctionLibrary.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace eglu
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
323c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosGLFunctionLoader::GLFunctionLoader (const eglw::Library& egl, const tcu::FunctionLibrary* library)
333c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	: m_egl		(egl)
343c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	, m_library	(library)
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryglw::GenericFuncType GLFunctionLoader::get (const char* name) const
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glw::GenericFuncType func = (glw::GenericFuncType)m_library->getFunction(name);
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!func)
433c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		return (glw::GenericFuncType)m_egl.getProcAddress(name);
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return func;
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
483c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosGLLibraryCache::GLLibraryCache (const Platform& platform, const tcu::CommandLine& cmdLine)
493c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	: m_platform	(platform)
503c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	, m_cmdLine		(cmdLine)
513c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos{
523c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos}
533c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
543c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosGLLibraryCache::~GLLibraryCache (void)
553c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos{
563c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	for (LibraryMap::iterator i = m_libraries.begin(); i != m_libraries.end(); ++i)
573c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		delete i->second;
583c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos}
593c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
603c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosconst tcu::FunctionLibrary* GLLibraryCache::getLibrary (glu::ApiType apiType)
613c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos{
623c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	tcu::FunctionLibrary*	library	= DE_NULL;
633c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const deUint32			key		= apiType.getPacked();
643c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	LibraryMap::iterator	iter	= m_libraries.find(key);
653c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
663c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	if (iter == m_libraries.end())
673c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	{
683c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		library = m_platform.createDefaultGLFunctionLibrary(apiType, m_cmdLine);
693c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		try
703c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{
713c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			m_libraries.insert(std::make_pair(key, library));
723c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		}
733c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		catch (...)
743c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		{
753c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			delete library;
763c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos			throw;
773c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		}
783c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	}
793c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	else
803c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos		library = iter->second;
813c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
823c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	return library;
833c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos}
843c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // eglu
86