You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
5.7 KiB
210 lines
5.7 KiB
/*------------------------------------------------------------------------- |
|
* drawElements Quality Program Tester Core |
|
* ---------------------------------------- |
|
* |
|
* Copyright 2014 The Android Open Source Project |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
* |
|
*//*! |
|
* \file |
|
* \brief Win32 GLES3 wrapper platform. |
|
*//*--------------------------------------------------------------------*/ |
|
|
|
#include "tcuWin32GLES3Platform.hpp" |
|
#include "gluRenderConfig.hpp" |
|
#include "gluRenderContext.hpp" |
|
#include "tcuRenderTarget.hpp" |
|
#include "gl3Context.h" |
|
#include "glwInitES30Direct.hpp" |
|
|
|
struct gl3PlatformContext_s |
|
{ |
|
tcu::wgl::Context* context; |
|
|
|
gl3PlatformContext_s (void) |
|
: context(DE_NULL) |
|
{ |
|
} |
|
}; |
|
|
|
gl3FunctionPtr gl3PlatformContext_getProcAddress (gl3PlatformContext* platformCtx, const char* procName) |
|
{ |
|
DE_ASSERT(platformCtx && platformCtx->context); |
|
return platformCtx->context->getGLFunction(procName); |
|
} |
|
|
|
namespace tcu |
|
{ |
|
|
|
enum |
|
{ |
|
DEFAULT_WINDOW_WIDTH = 400, |
|
DEFAULT_WINDOW_HEIGHT = 300 |
|
}; |
|
|
|
// Win32GLES3Context |
|
|
|
class Win32GLES3Context : public glu::RenderContext |
|
{ |
|
public: |
|
Win32GLES3Context (const wgl::Core& wgl, HINSTANCE instance, const glu::RenderConfig& config); |
|
~Win32GLES3Context (void); |
|
|
|
glu::ContextType getType (void) const { return glu::CONTEXTTYPE_ES3; } |
|
const RenderTarget& getRenderTarget (void) const { return m_renderTarget; } |
|
void postIterate (void); |
|
const glw::Functions& getFunctions (void) const { return m_functions; } |
|
|
|
private: |
|
Win32GLES3Context (const Win32GLES3Context& other); |
|
Win32GLES3Context& operator= (const Win32GLES3Context& other); |
|
|
|
RenderTarget m_renderTarget; |
|
Win32Window m_window; |
|
|
|
gl3PlatformContext m_platformCtx; |
|
gl3Context* m_context; |
|
|
|
glw::Functions m_functions; |
|
}; |
|
|
|
typedef const char* (GL_APIENTRY* glGetStringHackFunc) (GLenum str); |
|
|
|
Win32GLES3Context::Win32GLES3Context (const wgl::Core& wgl, HINSTANCE instance, const glu::RenderConfig& config) |
|
: m_renderTarget(config.width != glu::RenderConfig::DONT_CARE ? config.width : DEFAULT_WINDOW_WIDTH, |
|
config.height != glu::RenderConfig::DONT_CARE ? config.height : DEFAULT_WINDOW_HEIGHT, |
|
PixelFormat(8, 8, 8, 8), 24, 8, 0) |
|
, m_window (instance, m_renderTarget.getWidth(), m_renderTarget.getHeight()) |
|
, m_context (DE_NULL) |
|
{ |
|
const HDC deviceCtx = m_window.getDeviceContext(); |
|
const int pixelFormat = wgl::choosePixelFormat(wgl, deviceCtx, config); |
|
|
|
if (pixelFormat < 0) |
|
throw NotSupportedError("No compatible WGL pixel format found"); |
|
|
|
m_platformCtx.context = new wgl::Context(&wgl, m_window.getDeviceContext(), wgl::PROFILE_COMPATIBILITY, 3, 3, pixelFormat); |
|
|
|
try |
|
{ |
|
m_context = gl3Context_create(&m_platformCtx); |
|
if (!m_context) |
|
throw ResourceError("Failed to create GLES3 wrapper context"); |
|
|
|
gl3Context_setCurrentContext(m_context); |
|
glw::initES30Direct(&m_functions); |
|
|
|
m_window.setVisible(config.windowVisibility != glu::RenderConfig::VISIBILITY_HIDDEN); |
|
|
|
{ |
|
const wgl::PixelFormatInfo info = wgl.getPixelFormatInfo(deviceCtx, pixelFormat); |
|
const IVec2 size = m_window.getSize(); |
|
|
|
m_renderTarget = tcu::RenderTarget(size.x(), size.y(), |
|
tcu::PixelFormat(info.redBits, info.greenBits, info.blueBits, info.alphaBits), |
|
info.depthBits, info.stencilBits, |
|
info.sampleBuffers ? info.samples : 0); |
|
} |
|
} |
|
catch (...) |
|
{ |
|
if (m_context) |
|
gl3Context_destroy(m_context); |
|
delete m_platformCtx.context; |
|
throw; |
|
} |
|
} |
|
|
|
Win32GLES3Context::~Win32GLES3Context (void) |
|
{ |
|
if (m_context) |
|
gl3Context_destroy(m_context); |
|
|
|
delete m_platformCtx.context; |
|
} |
|
|
|
void Win32GLES3Context::postIterate (void) |
|
{ |
|
m_platformCtx.context->swapBuffers(); |
|
} |
|
|
|
// Win32GLES3ContextFactory |
|
|
|
class Win32GLES3ContextFactory : public glu::ContextFactory |
|
{ |
|
public: |
|
Win32GLES3ContextFactory (HINSTANCE instance); |
|
~Win32GLES3ContextFactory (void); |
|
|
|
virtual glu::RenderContext* createContext (const glu::RenderConfig& config, const tcu::CommandLine& cmdLine) const; |
|
|
|
private: |
|
const HINSTANCE m_instance; |
|
wgl::Core m_wglCore; |
|
}; |
|
|
|
Win32GLES3ContextFactory::Win32GLES3ContextFactory (HINSTANCE instance) |
|
: glu::ContextFactory ("gles3_wrapper", "GLES3 Wrapper Context") |
|
, m_instance (instance) |
|
, m_wglCore (instance) |
|
{ |
|
} |
|
|
|
Win32GLES3ContextFactory::~Win32GLES3ContextFactory (void) |
|
{ |
|
} |
|
|
|
glu::RenderContext* Win32GLES3ContextFactory::createContext (const glu::RenderConfig& config, const tcu::CommandLine&) const |
|
{ |
|
if (config.type == glu::CONTEXTTYPE_ES3) |
|
return new Win32GLES3Context(m_wglCore, m_instance, config); |
|
else |
|
throw NotSupportedError("Unsupported rendering context type"); |
|
} |
|
|
|
// Win32GLES3Platform |
|
|
|
Win32GLES3Platform::Win32GLES3Platform (void) |
|
{ |
|
const HINSTANCE instance = GetModuleHandle(NULL); |
|
|
|
// Set priority to lower. |
|
SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS); |
|
|
|
m_glContextFactoryRegistry.registerFactory(new Win32GLES3ContextFactory(instance)); |
|
} |
|
|
|
Win32GLES3Platform::~Win32GLES3Platform (void) |
|
{ |
|
} |
|
|
|
bool Win32GLES3Platform::processEvents (void) |
|
{ |
|
MSG msg; |
|
while (PeekMessage(&msg, NULL, 0, 0, TRUE)) |
|
{ |
|
DispatchMessage(&msg); |
|
if (msg.message == WM_QUIT) |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
} // tcu |
|
|
|
// Platform factory |
|
tcu::Platform* createPlatform (void) |
|
{ |
|
return new tcu::Win32GLES3Platform(); |
|
}
|
|
|