diff options
Diffstat (limited to 'src/3rdparty/angle/src/libEGL')
-rw-r--r-- | src/3rdparty/angle/src/libEGL/Config.cpp | 117 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/Config.h | 15 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/Display.cpp | 874 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/Display.h | 94 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/ShaderCache.h | 116 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/Surface.cpp | 432 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/Surface.h | 34 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/libEGL.cpp | 258 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/main.cpp | 3 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/main.h | 3 |
10 files changed, 336 insertions, 1610 deletions
diff --git a/src/3rdparty/angle/src/libEGL/Config.cpp b/src/3rdparty/angle/src/libEGL/Config.cpp index 89bc8d89f4..5488cb6f4f 100644 --- a/src/3rdparty/angle/src/libEGL/Config.cpp +++ b/src/3rdparty/angle/src/libEGL/Config.cpp @@ -13,76 +13,30 @@ #include <algorithm> #include <vector> +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> + #include "common/debug.h" using namespace std; namespace egl { -Config::Config(D3DDISPLAYMODE displayMode, EGLint minInterval, EGLint maxInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample, EGLint texWidth, EGLint texHeight) - : mDisplayMode(displayMode), mRenderTargetFormat(renderTargetFormat), mDepthStencilFormat(depthStencilFormat), mMultiSample(multiSample) -{ - set(displayMode, minInterval, maxInterval, renderTargetFormat, depthStencilFormat, multiSample, texWidth, texHeight); -} - -void Config::setDefaults() -{ - mBufferSize = 0; - mRedSize = 0; - mGreenSize = 0; - mBlueSize = 0; - mLuminanceSize = 0; - mAlphaSize = 0; - mAlphaMaskSize = 0; - mBindToTextureRGB = EGL_DONT_CARE; - mBindToTextureRGBA = EGL_DONT_CARE; - mColorBufferType = EGL_RGB_BUFFER; - mConfigCaveat = EGL_DONT_CARE; - mConfigID = EGL_DONT_CARE; - mConformant = 0; - mDepthSize = 0; - mLevel = 0; - mMatchNativePixmap = EGL_NONE; - mMaxPBufferWidth = 0; - mMaxPBufferHeight = 0; - mMaxPBufferPixels = 0; - mMaxSwapInterval = EGL_DONT_CARE; - mMinSwapInterval = EGL_DONT_CARE; - mNativeRenderable = EGL_DONT_CARE; - mNativeVisualID = 0; - mNativeVisualType = EGL_DONT_CARE; - mRenderableType = EGL_OPENGL_ES_BIT; - mSampleBuffers = 0; - mSamples = 0; - mStencilSize = 0; - mSurfaceType = EGL_WINDOW_BIT; - mTransparentType = EGL_NONE; - mTransparentRedValue = EGL_DONT_CARE; - mTransparentGreenValue = EGL_DONT_CARE; - mTransparentBlueValue = EGL_DONT_CARE; -} - -void Config::set(D3DDISPLAYMODE displayMode, EGLint minInterval, EGLint maxInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample, EGLint texWidth, EGLint texHeight) +Config::Config(rx::ConfigDesc desc, EGLint minInterval, EGLint maxInterval, EGLint texWidth, EGLint texHeight) + : mRenderTargetFormat(desc.renderTargetFormat), mDepthStencilFormat(desc.depthStencilFormat), mMultiSample(desc.multiSample) { mBindToTextureRGB = EGL_FALSE; mBindToTextureRGBA = EGL_FALSE; - switch (renderTargetFormat) + switch (desc.renderTargetFormat) { - case D3DFMT_A1R5G5B5: + case GL_RGB5_A1: mBufferSize = 16; mRedSize = 5; mGreenSize = 5; mBlueSize = 5; mAlphaSize = 1; break; - case D3DFMT_A2R10G10B10: - mBufferSize = 32; - mRedSize = 10; - mGreenSize = 10; - mBlueSize = 10; - mAlphaSize = 2; - break; - case D3DFMT_A8R8G8B8: + case GL_RGBA8_OES: mBufferSize = 32; mRedSize = 8; mGreenSize = 8; @@ -90,14 +44,14 @@ void Config::set(D3DDISPLAYMODE displayMode, EGLint minInterval, EGLint maxInter mAlphaSize = 8; mBindToTextureRGBA = true; break; - case D3DFMT_R5G6B5: + case GL_RGB565: mBufferSize = 16; mRedSize = 5; mGreenSize = 6; mBlueSize = 5; mAlphaSize = 0; break; - case D3DFMT_X8R8G8B8: + case GL_RGB8_OES: mBufferSize = 32; mRedSize = 8; mGreenSize = 8; @@ -105,6 +59,14 @@ void Config::set(D3DDISPLAYMODE displayMode, EGLint minInterval, EGLint maxInter mAlphaSize = 0; mBindToTextureRGB = true; break; + case GL_BGRA8_EXT: + mBufferSize = 32; + mRedSize = 8; + mGreenSize = 8; + mBlueSize = 8; + mAlphaSize = 8; + mBindToTextureRGBA = true; + break; default: UNREACHABLE(); // Other formats should not be valid } @@ -112,52 +74,32 @@ void Config::set(D3DDISPLAYMODE displayMode, EGLint minInterval, EGLint maxInter mLuminanceSize = 0; mAlphaMaskSize = 0; mColorBufferType = EGL_RGB_BUFFER; - mConfigCaveat = (displayMode.Format == renderTargetFormat) ? EGL_NONE : EGL_SLOW_CONFIG; + mConfigCaveat = (desc.fastConfig) ? EGL_NONE : EGL_SLOW_CONFIG; mConfigID = 0; mConformant = EGL_OPENGL_ES2_BIT; - switch (depthStencilFormat) + switch (desc.depthStencilFormat) { - case D3DFMT_UNKNOWN: + case GL_NONE: mDepthSize = 0; mStencilSize = 0; break; -// case D3DFMT_D16_LOCKABLE: -// mDepthSize = 16; -// mStencilSize = 0; -// break; - case D3DFMT_D32: + case GL_DEPTH_COMPONENT32_OES: mDepthSize = 32; mStencilSize = 0; break; - case D3DFMT_D15S1: - mDepthSize = 15; - mStencilSize = 1; - break; - case D3DFMT_D24S8: + case GL_DEPTH24_STENCIL8_OES: mDepthSize = 24; mStencilSize = 8; break; - case D3DFMT_D24X8: + case GL_DEPTH_COMPONENT24_OES: mDepthSize = 24; mStencilSize = 0; break; - case D3DFMT_D24X4S4: - mDepthSize = 24; - mStencilSize = 4; - break; - case D3DFMT_D16: + case GL_DEPTH_COMPONENT16: mDepthSize = 16; mStencilSize = 0; break; -// case D3DFMT_D32F_LOCKABLE: -// mDepthSize = 32; -// mStencilSize = 0; -// break; -// case D3DFMT_D24FS8: -// mDepthSize = 24; -// mStencilSize = 8; -// break; default: UNREACHABLE(); } @@ -173,8 +115,8 @@ void Config::set(D3DDISPLAYMODE displayMode, EGLint minInterval, EGLint maxInter mNativeVisualID = 0; mNativeVisualType = 0; mRenderableType = EGL_OPENGL_ES2_BIT; - mSampleBuffers = multiSample ? 1 : 0; - mSamples = multiSample; + mSampleBuffers = desc.multiSample ? 1 : 0; + mSamples = desc.multiSample; mSurfaceType = EGL_PBUFFER_BIT | EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT; mTransparentType = EGL_NONE; mTransparentRedValue = 0; @@ -288,10 +230,9 @@ ConfigSet::ConfigSet() { } -void ConfigSet::add(D3DDISPLAYMODE displayMode, EGLint minSwapInterval, EGLint maxSwapInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample, EGLint texWidth, EGLint texHeight) +void ConfigSet::add(rx::ConfigDesc desc, EGLint minSwapInterval, EGLint maxSwapInterval, EGLint texWidth, EGLint texHeight) { - Config config(displayMode, minSwapInterval, maxSwapInterval, renderTargetFormat, depthStencilFormat, multiSample, texWidth, texHeight); - + Config config(desc, minSwapInterval, maxSwapInterval, texWidth, texHeight); mSet.insert(config); } diff --git a/src/3rdparty/angle/src/libEGL/Config.h b/src/3rdparty/angle/src/libEGL/Config.h index 95626ed1ad..680337b700 100644 --- a/src/3rdparty/angle/src/libEGL/Config.h +++ b/src/3rdparty/angle/src/libEGL/Config.h @@ -13,10 +13,10 @@ #define EGLAPI #include <EGL/egl.h> -#include <d3d9.h> #include <set> +#include "libGLESv2/renderer/Renderer.h" #include "common/angleutils.h" namespace egl @@ -26,16 +26,13 @@ class Display; class Config { public: - Config(D3DDISPLAYMODE displayMode, EGLint minSwapInterval, EGLint maxSwapInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample, EGLint texWidth, EGLint texHeight); + Config(rx::ConfigDesc desc, EGLint minSwapInterval, EGLint maxSwapInterval, EGLint texWidth, EGLint texHeight); - void setDefaults(); - void set(D3DDISPLAYMODE displayMode, EGLint minSwapInterval, EGLint maxSwapInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample, EGLint texWidth, EGLint texHeight); EGLConfig getHandle() const; - const D3DDISPLAYMODE mDisplayMode; - const D3DFORMAT mRenderTargetFormat; - const D3DFORMAT mDepthStencilFormat; - const EGLint mMultiSample; + const GLenum mRenderTargetFormat; + const GLenum mDepthStencilFormat; + const GLint mMultiSample; EGLint mBufferSize; // Depth of the color buffer EGLint mRedSize; // Bits of Red in the color buffer @@ -99,7 +96,7 @@ class ConfigSet public: ConfigSet(); - void add(D3DDISPLAYMODE displayMode, EGLint minSwapInterval, EGLint maxSwapInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample, EGLint texWidth, EGLint texHeight); + void add(rx::ConfigDesc desc, EGLint minSwapInterval, EGLint maxSwapInterval, EGLint texWidth, EGLint texHeight); size_t size() const; bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig); const egl::Config *get(EGLConfig configHandle); diff --git a/src/3rdparty/angle/src/libEGL/Display.cpp b/src/3rdparty/angle/src/libEGL/Display.cpp index a2dee6d964..d5d0f0f831 100644 --- a/src/3rdparty/angle/src/libEGL/Display.cpp +++ b/src/3rdparty/angle/src/libEGL/Display.cpp @@ -16,20 +16,12 @@ #include "common/debug.h" #include "libGLESv2/mathutil.h" -#include "libGLESv2/utilities.h" +#include "libGLESv2/main.h" +#include "libGLESv2/Context.h" +#include "libGLESv2/renderer/SwapChain.h" #include "libEGL/main.h" - -// Can also be enabled by defining FORCE_REF_RAST in the project's predefined macros -#define REF_RAST 0 - -// The "Debug This Pixel..." feature in PIX often fails when using the -// D3D9Ex interfaces. In order to get debug pixel to work on a Vista/Win 7 -// machine, define "ANGLE_ENABLE_D3D9EX=0" in your project file. -#if !defined(ANGLE_ENABLE_D3D9EX) -// Enables use of the IDirect3D9Ex interface, when available -#define ANGLE_ENABLE_D3D9EX 1 -#endif // !defined(ANGLE_ENABLE_D3D9EX) +#include "libEGL/Surface.h" namespace egl { @@ -69,27 +61,10 @@ egl::Display *Display::getDisplay(EGLNativeDisplayType displayId) Display::Display(EGLNativeDisplayType displayId, HDC deviceContext, bool software) : mDc(deviceContext) { - mD3d9Module = NULL; - - mD3d9 = NULL; - mD3d9Ex = NULL; - mDevice = NULL; - mDeviceEx = NULL; - mDeviceWindow = NULL; - - mAdapter = D3DADAPTER_DEFAULT; - - #if REF_RAST == 1 || defined(FORCE_REF_RAST) - mDeviceType = D3DDEVTYPE_REF; - #else - mDeviceType = D3DDEVTYPE_HAL; - #endif - - mMinSwapInterval = 1; - mMaxSwapInterval = 1; + mSoftwareDevice = software; mDisplayId = displayId; - mDeviceLost = false; + mRenderer = NULL; } Display::~Display() @@ -100,7 +75,7 @@ Display::~Display() if (thisDisplay != displays.end()) { - displays.erase(thisDisplay); + displays.erase(thisDisplay); } } @@ -111,197 +86,48 @@ bool Display::initialize() return true; } - if (mSoftwareDevice) - { - mD3d9Module = GetModuleHandle(TEXT("swiftshader_d3d9.dll")); - } - else - { - mD3d9Module = GetModuleHandle(TEXT("d3d9.dll")); - } - if (mD3d9Module == NULL) + mRenderer = glCreateRenderer(this, mDc, mSoftwareDevice); + + if (!mRenderer) { terminate(); - return false; - } - - typedef HRESULT (WINAPI *Direct3DCreate9ExFunc)(UINT, IDirect3D9Ex**); - Direct3DCreate9ExFunc Direct3DCreate9ExPtr = reinterpret_cast<Direct3DCreate9ExFunc>(GetProcAddress(mD3d9Module, "Direct3DCreate9Ex")); - - // Use Direct3D9Ex if available. Among other things, this version is less - // inclined to report a lost context, for example when the user switches - // desktop. Direct3D9Ex is available in Windows Vista and later if suitable drivers are available. - if (ANGLE_ENABLE_D3D9EX && Direct3DCreate9ExPtr && SUCCEEDED(Direct3DCreate9ExPtr(D3D_SDK_VERSION, &mD3d9Ex))) - { - ASSERT(mD3d9Ex); - mD3d9Ex->QueryInterface(IID_IDirect3D9, reinterpret_cast<void**>(&mD3d9)); - ASSERT(mD3d9); - } - else - { - mD3d9 = Direct3DCreate9(D3D_SDK_VERSION); + return error(EGL_NOT_INITIALIZED, false); } - if (mD3d9) - { - if (mDc != NULL) - { - // UNIMPLEMENTED(); // FIXME: Determine which adapter index the device context corresponds to - } - - HRESULT result; - - // Give up on getting device caps after about one second. - for (int i = 0; i < 10; ++i) - { - result = mD3d9->GetDeviceCaps(mAdapter, mDeviceType, &mDeviceCaps); - - if (SUCCEEDED(result)) - { - break; - } - else if (result == D3DERR_NOTAVAILABLE) - { - Sleep(100); // Give the driver some time to initialize/recover - } - else if (FAILED(result)) // D3DERR_OUTOFVIDEOMEMORY, E_OUTOFMEMORY, D3DERR_INVALIDDEVICE, or another error we can't recover from - { - terminate(); - return error(EGL_BAD_ALLOC, false); - } - } - - if (mDeviceCaps.PixelShaderVersion < D3DPS_VERSION(2, 0)) - { - terminate(); - return error(EGL_NOT_INITIALIZED, false); - } - - // When DirectX9 is running with an older DirectX8 driver, a StretchRect from a regular texture to a render target texture is not supported. - // This is required by Texture2D::convertToRenderTarget. - if ((mDeviceCaps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES) == 0) - { - terminate(); - return error(EGL_NOT_INITIALIZED, false); - } - - mMinSwapInterval = 4; - mMaxSwapInterval = 0; - - if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_IMMEDIATE) {mMinSwapInterval = std::min(mMinSwapInterval, 0); mMaxSwapInterval = std::max(mMaxSwapInterval, 0);} - if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_ONE) {mMinSwapInterval = std::min(mMinSwapInterval, 1); mMaxSwapInterval = std::max(mMaxSwapInterval, 1);} - if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_TWO) {mMinSwapInterval = std::min(mMinSwapInterval, 2); mMaxSwapInterval = std::max(mMaxSwapInterval, 2);} - if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_THREE) {mMinSwapInterval = std::min(mMinSwapInterval, 3); mMaxSwapInterval = std::max(mMaxSwapInterval, 3);} - if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_FOUR) {mMinSwapInterval = std::min(mMinSwapInterval, 4); mMaxSwapInterval = std::max(mMaxSwapInterval, 4);} - - mD3d9->GetAdapterIdentifier(mAdapter, 0, &mAdapterIdentifier); + EGLint minSwapInterval = mRenderer->getMinSwapInterval(); + EGLint maxSwapInterval = mRenderer->getMaxSwapInterval(); + EGLint maxTextureWidth = mRenderer->getMaxTextureWidth(); + EGLint maxTextureHeight = mRenderer->getMaxTextureHeight(); - // ATI cards on XP have problems with non-power-of-two textures. - mSupportsNonPower2Textures = !(mDeviceCaps.TextureCaps & D3DPTEXTURECAPS_POW2) && - !(mDeviceCaps.TextureCaps & D3DPTEXTURECAPS_CUBEMAP_POW2) && - !(mDeviceCaps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL) && - !(getComparableOSVersion() < versionWindowsVista && mAdapterIdentifier.VendorId == VENDOR_ID_AMD); - - const D3DFORMAT renderTargetFormats[] = - { - D3DFMT_A1R5G5B5, - // D3DFMT_A2R10G10B10, // The color_ramp conformance test uses ReadPixels with UNSIGNED_BYTE causing it to think that rendering skipped a colour value. - D3DFMT_A8R8G8B8, - D3DFMT_R5G6B5, - // D3DFMT_X1R5G5B5, // Has no compatible OpenGL ES renderbuffer format - D3DFMT_X8R8G8B8 - }; - - const D3DFORMAT depthStencilFormats[] = - { - D3DFMT_UNKNOWN, - // D3DFMT_D16_LOCKABLE, - D3DFMT_D32, - // D3DFMT_D15S1, - D3DFMT_D24S8, - D3DFMT_D24X8, - // D3DFMT_D24X4S4, - D3DFMT_D16, - // D3DFMT_D32F_LOCKABLE, - // D3DFMT_D24FS8 - }; - - D3DDISPLAYMODE currentDisplayMode; - mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode); - - ConfigSet configSet; - - for (int formatIndex = 0; formatIndex < sizeof(renderTargetFormats) / sizeof(D3DFORMAT); formatIndex++) - { - D3DFORMAT renderTargetFormat = renderTargetFormats[formatIndex]; + rx::ConfigDesc *descList; + int numConfigs = mRenderer->generateConfigs(&descList); + ConfigSet configSet; - HRESULT result = mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, renderTargetFormat); + for (int i = 0; i < numConfigs; ++i) + configSet.add(descList[i], minSwapInterval, maxSwapInterval, + maxTextureWidth, maxTextureHeight); - if (SUCCEEDED(result)) - { - for (int depthStencilIndex = 0; depthStencilIndex < sizeof(depthStencilFormats) / sizeof(D3DFORMAT); depthStencilIndex++) - { - D3DFORMAT depthStencilFormat = depthStencilFormats[depthStencilIndex]; - HRESULT result = D3D_OK; - - if(depthStencilFormat != D3DFMT_UNKNOWN) - { - result = mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, depthStencilFormat); - } - - if (SUCCEEDED(result)) - { - if(depthStencilFormat != D3DFMT_UNKNOWN) - { - result = mD3d9->CheckDepthStencilMatch(mAdapter, mDeviceType, currentDisplayMode.Format, renderTargetFormat, depthStencilFormat); - } - - if (SUCCEEDED(result)) - { - // FIXME: enumerate multi-sampling - - configSet.add(currentDisplayMode, mMinSwapInterval, mMaxSwapInterval, renderTargetFormat, depthStencilFormat, 0, - mDeviceCaps.MaxTextureWidth, mDeviceCaps.MaxTextureHeight); - } - } - } - } - } - - // Give the sorted configs a unique ID and store them internally - EGLint index = 1; - for (ConfigSet::Iterator config = configSet.mSet.begin(); config != configSet.mSet.end(); config++) - { - Config configuration = *config; - configuration.mConfigID = index; - index++; - - mConfigSet.mSet.insert(configuration); - } - } - - if (!isInitialized()) + // Give the sorted configs a unique ID and store them internally + EGLint index = 1; + for (ConfigSet::Iterator config = configSet.mSet.begin(); config != configSet.mSet.end(); config++) { - terminate(); + Config configuration = *config; + configuration.mConfigID = index; + index++; - return false; + mConfigSet.mSet.insert(configuration); } - initExtensionString(); - - static const TCHAR windowName[] = TEXT("AngleHiddenWindow"); - static const TCHAR className[] = TEXT("STATIC"); - - mDeviceWindow = CreateWindowEx(WS_EX_NOACTIVATE, className, windowName, WS_DISABLED | WS_POPUP, 0, 0, 1, 1, HWND_MESSAGE, NULL, GetModuleHandle(NULL), NULL); + mRenderer->deleteConfigs(descList); + descList = NULL; - if (!createDevice()) + if (!isInitialized()) { terminate(); return false; } - mVertexShaderCache.initialize(mDevice); - mPixelShaderCache.initialize(mDevice); + initExtensionString(); return true; } @@ -318,79 +144,8 @@ void Display::terminate() destroyContext(*mContextSet.begin()); } - while (!mEventQueryPool.empty()) - { - mEventQueryPool.back()->Release(); - mEventQueryPool.pop_back(); - } - - mVertexShaderCache.clear(); - mPixelShaderCache.clear(); - - if (mDevice) - { - // If the device is lost, reset it first to prevent leaving the driver in an unstable state - if (testDeviceLost()) - { - resetDevice(); - } - - mDevice->Release(); - mDevice = NULL; - } - - if (mDeviceEx) - { - mDeviceEx->Release(); - mDeviceEx = NULL; - } - - if (mD3d9) - { - mD3d9->Release(); - mD3d9 = NULL; - } - - if (mDeviceWindow) - { - DestroyWindow(mDeviceWindow); - mDeviceWindow = NULL; - } - - if (mD3d9Ex) - { - mD3d9Ex->Release(); - mD3d9Ex = NULL; - } - - if (mD3d9Module) - { - mD3d9Module = NULL; - } -} - -void Display::startScene() -{ - if (!mSceneStarted) - { - long result = mDevice->BeginScene(); - if (SUCCEEDED(result)) { - // This is defensive checking against the device being - // lost at unexpected times. - mSceneStarted = true; - } - } -} - -void Display::endScene() -{ - if (mSceneStarted) - { - // EndScene can fail if the device was lost, for example due - // to a TDR during a draw call. - mDevice->EndScene(); - mSceneStarted = false; - } + glDestroyRenderer(mRenderer); + mRenderer = NULL; } bool Display::getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig) @@ -443,107 +198,7 @@ bool Display::getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value) return true; } -bool Display::createDevice() -{ - D3DPRESENT_PARAMETERS presentParameters = getDefaultPresentParameters(); - DWORD behaviorFlags = D3DCREATE_FPU_PRESERVE | D3DCREATE_NOWINDOWCHANGES; - - HRESULT result = mD3d9->CreateDevice(mAdapter, mDeviceType, mDeviceWindow, behaviorFlags | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, &presentParameters, &mDevice); - - if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DEVICELOST) - { - return error(EGL_BAD_ALLOC, false); - } - - if (FAILED(result)) - { - result = mD3d9->CreateDevice(mAdapter, mDeviceType, mDeviceWindow, behaviorFlags | D3DCREATE_SOFTWARE_VERTEXPROCESSING, &presentParameters, &mDevice); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_NOTAVAILABLE || result == D3DERR_DEVICELOST); - return error(EGL_BAD_ALLOC, false); - } - } - - if (mD3d9Ex) - { - result = mDevice->QueryInterface(IID_IDirect3DDevice9Ex, (void**) &mDeviceEx); - ASSERT(SUCCEEDED(result)); - } - - initializeDevice(); - - return true; -} - -// do any one-time device initialization -// NOTE: this is also needed after a device lost/reset -// to reset the scene status and ensure the default states are reset. -void Display::initializeDevice() -{ - // Permanent non-default states - mDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE); - mDevice->SetRenderState(D3DRS_LASTPIXEL, FALSE); - - if (mDeviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0)) - { - mDevice->SetRenderState(D3DRS_POINTSIZE_MAX, (DWORD&)mDeviceCaps.MaxPointSize); - } - else - { - mDevice->SetRenderState(D3DRS_POINTSIZE_MAX, 0x3F800000); // 1.0f - } - - mSceneStarted = false; -} - -bool Display::resetDevice() -{ - D3DPRESENT_PARAMETERS presentParameters = getDefaultPresentParameters(); - - HRESULT result = D3D_OK; - bool lost = testDeviceLost(); - int attempts = 3; - - while (lost && attempts > 0) - { - if (mDeviceEx) - { - Sleep(500); // Give the graphics driver some CPU time - result = mDeviceEx->ResetEx(&presentParameters, NULL); - } - else - { - result = mDevice->TestCooperativeLevel(); - - while (result == D3DERR_DEVICELOST) - { - Sleep(100); // Give the graphics driver some CPU time - result = mDevice->TestCooperativeLevel(); - } - - if (result == D3DERR_DEVICENOTRESET) - { - result = mDevice->Reset(&presentParameters); - } - } - - lost = testDeviceLost(); - attempts --; - } - - if (FAILED(result)) - { - ERR("Reset/ResetEx failed multiple times: 0x%08X", result); - return error(EGL_BAD_ALLOC, false); - } - - // reset device defaults - initializeDevice(); - return true; -} EGLSurface Display::createWindowSurface(HWND window, EGLConfig config, const EGLint *attribList) { @@ -587,7 +242,7 @@ EGLSurface Display::createWindowSurface(HWND window, EGLConfig config, const EGL return error(EGL_BAD_ALLOC, EGL_NO_SURFACE); } - if (testDeviceLost()) + if (mRenderer->testDeviceLost(false)) { if (!restoreLostDevice()) return EGL_NO_SURFACE; @@ -678,7 +333,7 @@ EGLSurface Display::createOffscreenSurface(EGLConfig config, HANDLE shareHandle, return error(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); } - if (textureFormat != EGL_NO_TEXTURE && !getNonPower2TextureSupport() && (!gl::isPow2(width) || !gl::isPow2(height))) + if (textureFormat != EGL_NO_TEXTURE && !mRenderer->getNonPower2TextureSupport() && (!gl::isPow2(width) || !gl::isPow2(height))) { return error(EGL_BAD_MATCH, EGL_NO_SURFACE); } @@ -700,7 +355,7 @@ EGLSurface Display::createOffscreenSurface(EGLConfig config, HANDLE shareHandle, return error(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); } - if (testDeviceLost()) + if (mRenderer->testDeviceLost(false)) { if (!restoreLostDevice()) return EGL_NO_SURFACE; @@ -721,24 +376,18 @@ EGLSurface Display::createOffscreenSurface(EGLConfig config, HANDLE shareHandle, EGLContext Display::createContext(EGLConfig configHandle, const gl::Context *shareContext, bool notifyResets, bool robustAccess) { - if (!mDevice) + if (!mRenderer) { - if (!createDevice()) - { - return NULL; - } + return NULL; } - else if (testDeviceLost()) // Lost device + else if (mRenderer->testDeviceLost(false)) // Lost device { if (!restoreLostDevice()) return NULL; } - const egl::Config *config = mConfigSet.get(configHandle); - - gl::Context *context = glCreateContext(config, shareContext, notifyResets, robustAccess); + gl::Context *context = glCreateContext(shareContext, mRenderer, notifyResets, robustAccess); mContextSet.insert(context); - mDeviceLost = false; return context; } @@ -757,18 +406,9 @@ bool Display::restoreLostDevice() (*surface)->release(); } - while (!mEventQueryPool.empty()) - { - mEventQueryPool.back()->Release(); - mEventQueryPool.pop_back(); - } - - mVertexShaderCache.clear(); - mPixelShaderCache.clear(); - - if (!resetDevice()) + if (!mRenderer->resetDevice()) { - return false; + return error(EGL_BAD_ALLOC, false); } // Restore any surfaces that may have been lost @@ -799,18 +439,20 @@ void Display::notifyDeviceLost() { (*context)->markContextLost(); } - mDeviceLost = true; - error(EGL_CONTEXT_LOST); + egl::error(EGL_CONTEXT_LOST); } -bool Display::isDeviceLost() +void Display::recreateSwapChains() { - return mDeviceLost; + for (SurfaceSet::iterator surface = mSurfaceSet.begin(); surface != mSurfaceSet.end(); surface++) + { + (*surface)->getSwapChain()->recreate(); + } } bool Display::isInitialized() const { - return mD3d9 != NULL && mConfigSet.size() > 0; + return mRenderer != NULL && mConfigSet.size() > 0; } bool Display::isValidConfig(EGLConfig config) @@ -841,352 +483,10 @@ bool Display::hasExistingWindowSurface(HWND window) return false; } -EGLint Display::getMinSwapInterval() -{ - return mMinSwapInterval; -} - -EGLint Display::getMaxSwapInterval() -{ - return mMaxSwapInterval; -} - -IDirect3DDevice9 *Display::getDevice() -{ - if (!mDevice) - { - if (!createDevice()) - { - return NULL; - } - } - - return mDevice; -} - -D3DCAPS9 Display::getDeviceCaps() -{ - return mDeviceCaps; -} - -D3DADAPTER_IDENTIFIER9 *Display::getAdapterIdentifier() -{ - return &mAdapterIdentifier; -} - -bool Display::testDeviceLost() -{ - if (mDeviceEx) - { - return FAILED(mDeviceEx->CheckDeviceState(NULL)); - } - else if (mDevice) - { - return FAILED(mDevice->TestCooperativeLevel()); - } - - return false; // No device yet, so no reset required -} - -bool Display::testDeviceResettable() -{ - HRESULT status = D3D_OK; - - if (mDeviceEx) - { - status = mDeviceEx->CheckDeviceState(NULL); - } - else if (mDevice) - { - status = mDevice->TestCooperativeLevel(); - } - - switch (status) - { - case D3DERR_DEVICENOTRESET: - case D3DERR_DEVICEHUNG: - return true; - default: - return false; - } -} - -void Display::sync(bool block) -{ - HRESULT result; - - IDirect3DQuery9* query = allocateEventQuery(); - if (!query) - { - return; - } - - result = query->Issue(D3DISSUE_END); - ASSERT(SUCCEEDED(result)); - - do - { - result = query->GetData(NULL, 0, D3DGETDATA_FLUSH); - - if(block && result == S_FALSE) - { - // Keep polling, but allow other threads to do something useful first - Sleep(0); - // explicitly check for device loss - // some drivers seem to return S_FALSE even if the device is lost - // instead of D3DERR_DEVICELOST like they should - if (testDeviceLost()) - { - result = D3DERR_DEVICELOST; - } - } - } - while(block && result == S_FALSE); - - freeEventQuery(query); - - if (isDeviceLostError(result)) - { - notifyDeviceLost(); - } -} - -IDirect3DQuery9* Display::allocateEventQuery() -{ - IDirect3DQuery9 *query = NULL; - - if (mEventQueryPool.empty()) - { - HRESULT result = mDevice->CreateQuery(D3DQUERYTYPE_EVENT, &query); - ASSERT(SUCCEEDED(result)); - } - else - { - query = mEventQueryPool.back(); - mEventQueryPool.pop_back(); - } - - return query; -} - -void Display::freeEventQuery(IDirect3DQuery9* query) -{ - if (mEventQueryPool.size() > 1000) - { - query->Release(); - } - else - { - mEventQueryPool.push_back(query); - } -} - -void Display::getMultiSampleSupport(D3DFORMAT format, bool *multiSampleArray) -{ - for (int multiSampleIndex = 0; multiSampleIndex <= D3DMULTISAMPLE_16_SAMPLES; multiSampleIndex++) - { - HRESULT result = mD3d9->CheckDeviceMultiSampleType(mAdapter, mDeviceType, format, - TRUE, (D3DMULTISAMPLE_TYPE)multiSampleIndex, NULL); - - multiSampleArray[multiSampleIndex] = SUCCEEDED(result); - } -} - -bool Display::getDXT1TextureSupport() -{ - D3DDISPLAYMODE currentDisplayMode; - mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode); - - return SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, 0, D3DRTYPE_TEXTURE, D3DFMT_DXT1)); -} - -bool Display::getDXT3TextureSupport() -{ - D3DDISPLAYMODE currentDisplayMode; - mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode); - - return SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, 0, D3DRTYPE_TEXTURE, D3DFMT_DXT3)); -} - -bool Display::getDXT5TextureSupport() -{ - D3DDISPLAYMODE currentDisplayMode; - mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode); - - return SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, 0, D3DRTYPE_TEXTURE, D3DFMT_DXT5)); -} - -// we use INTZ for depth textures in Direct3D9 -// we also want NULL texture support to ensure the we can make depth-only FBOs -// see http://aras-p.info/texts/D3D9GPUHacks.html -bool Display::getDepthTextureSupport() const -{ - D3DDISPLAYMODE currentDisplayMode; - mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode); - - bool intz = SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, - D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_INTZ)); - bool null = SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, - D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, D3DFMT_NULL)); - - return intz && null; -} - -bool Display::getFloat32TextureSupport(bool *filtering, bool *renderable) -{ - D3DDISPLAYMODE currentDisplayMode; - mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode); - - *filtering = SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_QUERY_FILTER, - D3DRTYPE_TEXTURE, D3DFMT_A32B32G32R32F)) && - SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_QUERY_FILTER, - D3DRTYPE_CUBETEXTURE, D3DFMT_A32B32G32R32F)); - - *renderable = SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_RENDERTARGET, - D3DRTYPE_TEXTURE, D3DFMT_A32B32G32R32F))&& - SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_RENDERTARGET, - D3DRTYPE_CUBETEXTURE, D3DFMT_A32B32G32R32F)); - - if (!*filtering && !*renderable) - { - return SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, 0, - D3DRTYPE_TEXTURE, D3DFMT_A32B32G32R32F)) && - SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, 0, - D3DRTYPE_CUBETEXTURE, D3DFMT_A32B32G32R32F)); - } - else - { - return true; - } -} - -bool Display::getFloat16TextureSupport(bool *filtering, bool *renderable) -{ - D3DDISPLAYMODE currentDisplayMode; - mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode); - - *filtering = SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_QUERY_FILTER, - D3DRTYPE_TEXTURE, D3DFMT_A16B16G16R16F)) && - SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_QUERY_FILTER, - D3DRTYPE_CUBETEXTURE, D3DFMT_A16B16G16R16F)); - - *renderable = SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_RENDERTARGET, - D3DRTYPE_TEXTURE, D3DFMT_A16B16G16R16F)) && - SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_RENDERTARGET, - D3DRTYPE_CUBETEXTURE, D3DFMT_A16B16G16R16F)); - - if (!*filtering && !*renderable) - { - return SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, 0, - D3DRTYPE_TEXTURE, D3DFMT_A16B16G16R16F)) && - SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, 0, - D3DRTYPE_CUBETEXTURE, D3DFMT_A16B16G16R16F)); - } - else - { - return true; - } -} - -bool Display::getLuminanceTextureSupport() -{ - D3DDISPLAYMODE currentDisplayMode; - mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode); - - return SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, 0, D3DRTYPE_TEXTURE, D3DFMT_L8)); -} - -bool Display::getLuminanceAlphaTextureSupport() -{ - D3DDISPLAYMODE currentDisplayMode; - mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode); - - return SUCCEEDED(mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, 0, D3DRTYPE_TEXTURE, D3DFMT_A8L8)); -} - -float Display::getTextureFilterAnisotropySupport() const -{ - // Must support a minimum of 2:1 anisotropy for max anisotropy to be considered supported, per the spec - if ((mDeviceCaps.RasterCaps & D3DPRASTERCAPS_ANISOTROPY) && (mDeviceCaps.MaxAnisotropy >= 2)) - { - return mDeviceCaps.MaxAnisotropy; - } - return 1.0f; -} - -D3DPOOL Display::getBufferPool(DWORD usage) const -{ - if (mD3d9Ex != NULL) - { - return D3DPOOL_DEFAULT; - } - else - { - if (!(usage & D3DUSAGE_DYNAMIC)) - { - return D3DPOOL_MANAGED; - } - } - - return D3DPOOL_DEFAULT; -} - -D3DPOOL Display::getTexturePool(DWORD usage) const -{ - if (mD3d9Ex != NULL) - { - return D3DPOOL_DEFAULT; - } - else - { - if (!(usage & (D3DUSAGE_DEPTHSTENCIL | D3DUSAGE_RENDERTARGET))) - { - return D3DPOOL_MANAGED; - } - } - - return D3DPOOL_DEFAULT; -} - -bool Display::getEventQuerySupport() -{ - IDirect3DQuery9 *query = allocateEventQuery(); - if (query) - { - freeEventQuery(query); - return true; - } - else - { - return false; - } -} - -D3DPRESENT_PARAMETERS Display::getDefaultPresentParameters() -{ - D3DPRESENT_PARAMETERS presentParameters = {0}; - - // The default swap chain is never actually used. Surface will create a new swap chain with the proper parameters. - presentParameters.AutoDepthStencilFormat = D3DFMT_UNKNOWN; - presentParameters.BackBufferCount = 1; - presentParameters.BackBufferFormat = D3DFMT_UNKNOWN; - presentParameters.BackBufferWidth = 1; - presentParameters.BackBufferHeight = 1; - presentParameters.EnableAutoDepthStencil = FALSE; - presentParameters.Flags = 0; - presentParameters.hDeviceWindow = mDeviceWindow; - presentParameters.MultiSampleQuality = 0; - presentParameters.MultiSampleType = D3DMULTISAMPLE_NONE; - presentParameters.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; - presentParameters.SwapEffect = D3DSWAPEFFECT_DISCARD; - presentParameters.Windowed = TRUE; - - return presentParameters; -} - void Display::initExtensionString() { HMODULE swiftShader = GetModuleHandle(TEXT("swiftshader_d3d9.dll")); + bool shareHandleSupported = mRenderer->getShareHandleSupport(); mExtensionString = ""; @@ -1194,7 +494,7 @@ void Display::initExtensionString() mExtensionString += "EGL_EXT_create_context_robustness "; // ANGLE-specific extensions - if (shareHandleSupported()) + if (shareHandleSupported) { mExtensionString += "EGL_ANGLE_d3d_share_handle_client_buffer "; } @@ -1206,12 +506,15 @@ void Display::initExtensionString() mExtensionString += "EGL_ANGLE_software_display "; } - if (shareHandleSupported()) + if (shareHandleSupported) { mExtensionString += "EGL_ANGLE_surface_d3d_texture_2d_share_handle "; } - mExtensionString += "EGL_NV_post_sub_buffer"; + if (mRenderer->getPostSubBufferSupport()) + { + mExtensionString += "EGL_NV_post_sub_buffer"; + } std::string::size_type end = mExtensionString.find_last_not_of(' '); if (end != std::string::npos) @@ -1225,68 +528,5 @@ const char *Display::getExtensionString() const return mExtensionString.c_str(); } -bool Display::shareHandleSupported() const -{ - // PIX doesn't seem to support using share handles, so disable them. - return isD3d9ExDevice() && !gl::perfActive(); -} - -IDirect3DVertexShader9 *Display::createVertexShader(const DWORD *function, size_t length) -{ - return mVertexShaderCache.create(function, length); -} - -IDirect3DPixelShader9 *Display::createPixelShader(const DWORD *function, size_t length) -{ - return mPixelShaderCache.create(function, length); -} - -// Only Direct3D 10 ready devices support all the necessary vertex texture formats. -// We test this using D3D9 by checking support for the R16F format. -bool Display::getVertexTextureSupport() const -{ - if (!isInitialized() || mDeviceCaps.PixelShaderVersion < D3DPS_VERSION(3, 0)) - { - return false; - } - - D3DDISPLAYMODE currentDisplayMode; - mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode); - - HRESULT result = mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_QUERY_VERTEXTEXTURE, D3DRTYPE_TEXTURE, D3DFMT_R16F); - - return SUCCEEDED(result); -} - -bool Display::getNonPower2TextureSupport() const -{ - return mSupportsNonPower2Textures; -} - -bool Display::getOcclusionQuerySupport() const -{ - if (!isInitialized()) - { - return false; - } - - IDirect3DQuery9 *query = NULL; - HRESULT result = mDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, &query); - - if (SUCCEEDED(result) && query) - { - query->Release(); - return true; - } - else - { - return false; - } -} - -bool Display::getInstancingSupport() const -{ - return mDeviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0); -} } diff --git a/src/3rdparty/angle/src/libEGL/Display.h b/src/3rdparty/angle/src/libEGL/Display.h index 23b57b74c6..8c71e51b7a 100644 --- a/src/3rdparty/angle/src/libEGL/Display.h +++ b/src/3rdparty/angle/src/libEGL/Display.h @@ -11,36 +11,22 @@ #ifndef LIBEGL_DISPLAY_H_ #define LIBEGL_DISPLAY_H_ -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include <windows.h> -#include <d3d9.h> +#include "common/system.h" #include <set> #include <vector> -#include "libGLESv2/Context.h" - #include "libEGL/Config.h" -#include "libEGL/ShaderCache.h" -#include "libEGL/Surface.h" - -const int versionWindowsVista = MAKEWORD(0x00, 0x06); -const int versionWindows7 = MAKEWORD(0x01, 0x06); -// Return the version of the operating system in a format suitable for ordering -// comparison. -inline int getComparableOSVersion() +namespace gl { - DWORD version = GetVersion(); - int majorVersion = LOBYTE(LOWORD(version)); - int minorVersion = HIBYTE(LOWORD(version)); - return MAKEWORD(minorVersion, majorVersion); +class Context; } namespace egl { +class Surface; + class Display { public: @@ -49,9 +35,6 @@ class Display bool initialize(); void terminate(); - virtual void startScene(); - virtual void endScene(); - static egl::Display *getDisplay(EGLNativeDisplayType displayId); bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig); @@ -70,81 +53,25 @@ class Display bool isValidSurface(egl::Surface *surface); bool hasExistingWindowSurface(HWND window); - EGLint getMinSwapInterval(); - EGLint getMaxSwapInterval(); - - virtual IDirect3DDevice9 *getDevice(); - virtual D3DCAPS9 getDeviceCaps(); - virtual D3DADAPTER_IDENTIFIER9 *getAdapterIdentifier(); - virtual bool testDeviceLost(); - virtual bool testDeviceResettable(); - virtual void sync(bool block); - virtual IDirect3DQuery9* allocateEventQuery(); - virtual void freeEventQuery(IDirect3DQuery9* query); - virtual void getMultiSampleSupport(D3DFORMAT format, bool *multiSampleArray); - virtual bool getDXT1TextureSupport(); - virtual bool getDXT3TextureSupport(); - virtual bool getDXT5TextureSupport(); - virtual bool getEventQuerySupport(); - virtual bool getFloat32TextureSupport(bool *filtering, bool *renderable); - virtual bool getFloat16TextureSupport(bool *filtering, bool *renderable); - virtual bool getLuminanceTextureSupport(); - virtual bool getLuminanceAlphaTextureSupport(); - virtual bool getVertexTextureSupport() const; - virtual bool getNonPower2TextureSupport() const; - virtual bool getDepthTextureSupport() const; - virtual bool getOcclusionQuerySupport() const; - virtual bool getInstancingSupport() const; - virtual float getTextureFilterAnisotropySupport() const; - virtual D3DPOOL getBufferPool(DWORD usage) const; - virtual D3DPOOL getTexturePool(DWORD usage) const; + rx::Renderer *getRenderer() { return mRenderer; }; + // exported methods must be virtual virtual void notifyDeviceLost(); - bool isDeviceLost(); + virtual void recreateSwapChains(); - bool isD3d9ExDevice() const { return mD3d9Ex != NULL; } const char *getExtensionString() const; - bool shareHandleSupported() const; - - virtual IDirect3DVertexShader9 *createVertexShader(const DWORD *function, size_t length); - virtual IDirect3DPixelShader9 *createPixelShader(const DWORD *function, size_t length); private: DISALLOW_COPY_AND_ASSIGN(Display); Display(EGLNativeDisplayType displayId, HDC deviceContext, bool software); - D3DPRESENT_PARAMETERS getDefaultPresentParameters(); - bool restoreLostDevice(); EGLNativeDisplayType mDisplayId; const HDC mDc; - HMODULE mD3d9Module; - - UINT mAdapter; - D3DDEVTYPE mDeviceType; - IDirect3D9 *mD3d9; // Always valid after successful initialization. - IDirect3D9Ex *mD3d9Ex; // Might be null if D3D9Ex is not supported. - IDirect3DDevice9 *mDevice; - IDirect3DDevice9Ex *mDeviceEx; // Might be null if D3D9Ex is not supported. - - // A pool of event queries that are currently unused. - std::vector<IDirect3DQuery9*> mEventQueryPool; - - VertexShaderCache mVertexShaderCache; - PixelShaderCache mPixelShaderCache; - - D3DCAPS9 mDeviceCaps; - D3DADAPTER_IDENTIFIER9 mAdapterIdentifier; - HWND mDeviceWindow; - - bool mSceneStarted; - EGLint mMaxSwapInterval; - EGLint mMinSwapInterval; bool mSoftwareDevice; - bool mSupportsNonPower2Textures; typedef std::set<Surface*> SurfaceSet; SurfaceSet mSurfaceSet; @@ -153,11 +80,8 @@ class Display typedef std::set<gl::Context*> ContextSet; ContextSet mContextSet; - bool mDeviceLost; - bool createDevice(); - void initializeDevice(); - bool resetDevice(); + rx::Renderer *mRenderer; void initExtensionString(); std::string mExtensionString; diff --git a/src/3rdparty/angle/src/libEGL/ShaderCache.h b/src/3rdparty/angle/src/libEGL/ShaderCache.h deleted file mode 100644 index cfe523ba09..0000000000 --- a/src/3rdparty/angle/src/libEGL/ShaderCache.h +++ /dev/null @@ -1,116 +0,0 @@ -// -// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// - -// Display.h: Defines egl::ShaderCache, a cache of Direct3D shader objects -// keyed by their byte code. - -#ifndef LIBEGL_SHADER_CACHE_H_ -#define LIBEGL_SHADER_CACHE_H_ - -#include <d3d9.h> - -#ifdef _MSC_VER -#include <hash_map> -#else -#include <unordered_map> -#endif - -namespace egl -{ -template <typename ShaderObject> -class ShaderCache -{ - public: - ShaderCache() : mDevice(NULL) - { - } - - ~ShaderCache() - { - // Call clear while the device is still valid. - ASSERT(mMap.empty()); - } - - void initialize(IDirect3DDevice9* device) - { - mDevice = device; - } - - ShaderObject *create(const DWORD *function, size_t length) - { - std::string key(reinterpret_cast<const char*>(function), length); - typename Map::iterator it = mMap.find(key); - if (it != mMap.end()) - { - it->second->AddRef(); - return it->second; - } - - ShaderObject *shader; - HRESULT result = createShader(function, &shader); - if (FAILED(result)) - { - return NULL; - } - - // Random eviction policy. - if (mMap.size() >= kMaxMapSize) - { - mMap.begin()->second->Release(); - mMap.erase(mMap.begin()); - } - - shader->AddRef(); - mMap[key] = shader; - - return shader; - } - - void clear() - { - for (typename Map::iterator it = mMap.begin(); it != mMap.end(); ++it) - { - it->second->Release(); - } - - mMap.clear(); - } - - private: - DISALLOW_COPY_AND_ASSIGN(ShaderCache); - - const static size_t kMaxMapSize = 100; - - HRESULT createShader(const DWORD *function, IDirect3DVertexShader9 **shader) - { - return mDevice->CreateVertexShader(function, shader); - } - - HRESULT createShader(const DWORD *function, IDirect3DPixelShader9 **shader) - { - return mDevice->CreatePixelShader(function, shader); - } - -#ifndef HASH_MAP -# ifdef _MSC_VER -# define HASH_MAP stdext::hash_map -# else -# define HASH_MAP std::unordered_map -# endif -#endif - - typedef HASH_MAP<std::string, ShaderObject*> Map; - Map mMap; - - IDirect3DDevice9 *mDevice; -}; - -typedef ShaderCache<IDirect3DVertexShader9> VertexShaderCache; -typedef ShaderCache<IDirect3DPixelShader9> PixelShaderCache; - -} - -#endif // LIBEGL_SHADER_CACHE_H_ diff --git a/src/3rdparty/angle/src/libEGL/Surface.cpp b/src/3rdparty/angle/src/libEGL/Surface.cpp index d9e1887e85..5a62142b45 100644 --- a/src/3rdparty/angle/src/libEGL/Surface.cpp +++ b/src/3rdparty/angle/src/libEGL/Surface.cpp @@ -1,5 +1,5 @@ // -// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. +// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // @@ -14,6 +14,8 @@ #include "common/debug.h" #include "libGLESv2/Texture.h" +#include "libGLESv2/renderer/SwapChain.h" +#include "libGLESv2/main.h" #include "libEGL/main.h" #include "libEGL/Display.h" @@ -23,14 +25,11 @@ namespace egl { -Surface::Surface(Display *display, const Config *config, HWND window, EGLint postSubBufferSupported) +Surface::Surface(Display *display, const Config *config, HWND window, EGLint postSubBufferSupported) : mDisplay(display), mConfig(config), mWindow(window), mPostSubBufferSupported(postSubBufferSupported) { + mRenderer = mDisplay->getRenderer(); mSwapChain = NULL; - mBackBuffer = NULL; - mDepthStencil = NULL; - mRenderTarget = NULL; - mOffscreenTexture = NULL; mShareHandle = NULL; mTexture = NULL; mTextureFormat = EGL_NO_TEXTURE; @@ -40,6 +39,8 @@ Surface::Surface(Display *display, const Config *config, HWND window, EGLint pos mRenderBuffer = EGL_BACK_BUFFER; mSwapBehavior = EGL_BUFFER_PRESERVED; mSwapInterval = -1; + mWidth = -1; + mHeight = -1; setSwapInterval(1); subclassWindow(); @@ -48,11 +49,8 @@ Surface::Surface(Display *display, const Config *config, HWND window, EGLint pos Surface::Surface(Display *display, const Config *config, HANDLE shareHandle, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureType) : mDisplay(display), mWindow(NULL), mConfig(config), mShareHandle(shareHandle), mWidth(width), mHeight(height), mPostSubBufferSupported(EGL_FALSE) { + mRenderer = mDisplay->getRenderer(); mSwapChain = NULL; - mBackBuffer = NULL; - mDepthStencil = NULL; - mRenderTarget = NULL; - mOffscreenTexture = NULL; mWindowSubclassed = false; mTexture = NULL; mTextureFormat = textureFormat; @@ -76,8 +74,6 @@ bool Surface::initialize() typedef HRESULT (STDAPICALLTYPE *PtrDwmIsCompositionEnabled)(BOOL*); typedef HRESULT (STDAPICALLTYPE *PtrDwmSetPresentParameters)(HWND, DWM_PRESENT_PARAMETERS *); - ASSERT(!mSwapChain && !mOffscreenTexture && !mDepthStencil); - if (!resetSwapChain()) return false; @@ -118,260 +114,106 @@ bool Surface::initialize() void Surface::release() { - if (mSwapChain) - { - mSwapChain->Release(); - mSwapChain = NULL; - } - - if (mBackBuffer) - { - mBackBuffer->Release(); - mBackBuffer = NULL; - } - - if (mDepthStencil) - { - mDepthStencil->Release(); - mDepthStencil = NULL; - } - - if (mRenderTarget) - { - mRenderTarget->Release(); - mRenderTarget = NULL; - } - - if (mOffscreenTexture) - { - mOffscreenTexture->Release(); - mOffscreenTexture = NULL; - } + delete mSwapChain; + mSwapChain = NULL; if (mTexture) { mTexture->releaseTexImage(); mTexture = NULL; } - - mShareHandle = NULL; } bool Surface::resetSwapChain() { - if (!mWindow) - { - return resetSwapChain(mWidth, mHeight); - } - - RECT windowRect; - if (!GetClientRect(getWindowHandle(), &windowRect)) - { - ASSERT(false); + ASSERT(!mSwapChain); - ERR("Could not retrieve the window dimensions"); - return false; - } - - return resetSwapChain(windowRect.right - windowRect.left, windowRect.bottom - windowRect.top); -} + int width; + int height; -bool Surface::resetSwapChain(int backbufferWidth, int backbufferHeight) -{ - IDirect3DDevice9 *device = mDisplay->getDevice(); - - if (device == NULL) + if (mWindow) { - return false; - } - - // Evict all non-render target textures to system memory and release all resources - // before reallocating them to free up as much video memory as possible. - device->EvictManagedResources(); - - HRESULT result; + RECT windowRect; + if (!GetClientRect(getWindowHandle(), &windowRect)) + { + ASSERT(false); - // Release specific resources to free up memory for the new render target, while the - // old render target still exists for the purpose of preserving its contents. - if (mSwapChain) - { - mSwapChain->Release(); - mSwapChain = NULL; - } + ERR("Could not retrieve the window dimensions"); + return error(EGL_BAD_SURFACE, false); + } - if (mBackBuffer) - { - mBackBuffer->Release(); - mBackBuffer = NULL; + width = windowRect.right - windowRect.left; + height = windowRect.bottom - windowRect.top; } - - if (mOffscreenTexture) + else { - mOffscreenTexture->Release(); - mOffscreenTexture = NULL; + // non-window surface - size is determined at creation + width = mWidth; + height = mHeight; } - if (mDepthStencil) + mSwapChain = mRenderer->createSwapChain(mWindow, mShareHandle, + mConfig->mRenderTargetFormat, + mConfig->mDepthStencilFormat); + if (!mSwapChain) { - mDepthStencil->Release(); - mDepthStencil = NULL; + return error(EGL_BAD_ALLOC, false); } - HANDLE *pShareHandle = NULL; - if (!mWindow && mDisplay->shareHandleSupported()) + if (!resetSwapChain(width, height)) { - pShareHandle = &mShareHandle; + delete mSwapChain; + mSwapChain = NULL; + return false; } - // CreateTexture will fail on zero dimensions, so just release old target - if (!backbufferWidth || !backbufferHeight) - { - if (mRenderTarget) - { - mRenderTarget->Release(); - mRenderTarget = NULL; - } + return true; +} - mWidth = backbufferWidth; - mHeight = backbufferHeight; - mPresentIntervalDirty = false; +bool Surface::resizeSwapChain(int backbufferWidth, int backbufferHeight) +{ + ASSERT(backbufferWidth >= 0 && backbufferHeight >= 0); + ASSERT(mSwapChain); - return true; - } + EGLint status = mSwapChain->resize(backbufferWidth, backbufferHeight); - result = device->CreateTexture(backbufferWidth, backbufferHeight, 1, D3DUSAGE_RENDERTARGET, - mConfig->mRenderTargetFormat, D3DPOOL_DEFAULT, &mOffscreenTexture, pShareHandle); - if (FAILED(result)) + if (status == EGL_CONTEXT_LOST) { - ERR("Could not create offscreen texture: %08lX", result); - release(); - - if(isDeviceLostError(result)) - { - mDisplay->notifyDeviceLost(); - return false; - } - else - { - return error(EGL_BAD_ALLOC, false); - } + mDisplay->notifyDeviceLost(); + return false; } - - IDirect3DSurface9 *oldRenderTarget = mRenderTarget; - - result = mOffscreenTexture->GetSurfaceLevel(0, &mRenderTarget); - ASSERT(SUCCEEDED(result)); - - if (oldRenderTarget) + else if (status != EGL_SUCCESS) { - RECT rect = - { - 0, 0, - mWidth, mHeight - }; - - if (rect.right > static_cast<LONG>(backbufferWidth)) - { - rect.right = backbufferWidth; - } + return error(status, false); + } - if (rect.bottom > static_cast<LONG>(backbufferHeight)) - { - rect.bottom = backbufferHeight; - } + mWidth = backbufferWidth; + mHeight = backbufferHeight; - mDisplay->endScene(); + return true; +} - result = device->StretchRect(oldRenderTarget, &rect, mRenderTarget, &rect, D3DTEXF_NONE); - ASSERT(SUCCEEDED(result)); +bool Surface::resetSwapChain(int backbufferWidth, int backbufferHeight) +{ + ASSERT(backbufferWidth >= 0 && backbufferHeight >= 0); + ASSERT(mSwapChain); - oldRenderTarget->Release(); - } + EGLint status = mSwapChain->reset(backbufferWidth, backbufferHeight, mSwapInterval); - if (mWindow) + if (status == EGL_CONTEXT_LOST) { - D3DPRESENT_PARAMETERS presentParameters = {0}; - presentParameters.AutoDepthStencilFormat = mConfig->mDepthStencilFormat; - presentParameters.BackBufferCount = 1; - presentParameters.BackBufferFormat = mConfig->mRenderTargetFormat; - presentParameters.EnableAutoDepthStencil = FALSE; - presentParameters.Flags = 0; - presentParameters.hDeviceWindow = getWindowHandle(); - presentParameters.MultiSampleQuality = 0; // FIXME: Unimplemented - presentParameters.MultiSampleType = D3DMULTISAMPLE_NONE; // FIXME: Unimplemented - presentParameters.PresentationInterval = mPresentInterval; - presentParameters.SwapEffect = D3DSWAPEFFECT_DISCARD; - presentParameters.Windowed = TRUE; - presentParameters.BackBufferWidth = backbufferWidth; - presentParameters.BackBufferHeight = backbufferHeight; - - // http://crbug.com/140239 - // http://crbug.com/143434 - // - // Some AMD/Intel switchable systems / drivers appear to round swap chain surfaces to a multiple of 64 pixels in width - // when using the integrated Intel. This rounds the width up rather than down. - // - // Some non-switchable AMD GPUs / drivers do not respect the source rectangle to Present. Therefore, when the vendor ID - // is not Intel, the back buffer width must be exactly the same width as the window or horizontal scaling will occur. - D3DADAPTER_IDENTIFIER9* adapterIdentifier = mDisplay->getAdapterIdentifier(); - if (adapterIdentifier->VendorId == VENDOR_ID_INTEL) - { - presentParameters.BackBufferWidth = (presentParameters.BackBufferWidth + 63) / 64 * 64; - } - - result = device->CreateAdditionalSwapChain(&presentParameters, &mSwapChain); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_INVALIDCALL || result == D3DERR_DEVICELOST); - - ERR("Could not create additional swap chains or offscreen surfaces: %08lX", result); - release(); - - if(isDeviceLostError(result)) - { - mDisplay->notifyDeviceLost(); - return false; - } - else - { - return error(EGL_BAD_ALLOC, false); - } - } - - result = mSwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &mBackBuffer); - ASSERT(SUCCEEDED(result)); - InvalidateRect(mWindow, NULL, FALSE); + mRenderer->notifyDeviceLost(); + return false; } - - if (mConfig->mDepthStencilFormat != D3DFMT_UNKNOWN) + else if (status != EGL_SUCCESS) { - result = device->CreateDepthStencilSurface(backbufferWidth, backbufferHeight, mConfig->mDepthStencilFormat, D3DMULTISAMPLE_NONE, - 0, FALSE, &mDepthStencil, NULL); - - if (FAILED(result)) - { - ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_INVALIDCALL); - - ERR("Could not create depthstencil surface for new swap chain: 0x%08X", result); - release(); - - if(isDeviceLostError(result)) - { - mDisplay->notifyDeviceLost(); - return false; - } - else - { - return error(EGL_BAD_ALLOC, false); - } - } + return error(status, false); } mWidth = backbufferWidth; mHeight = backbufferHeight; + mSwapIntervalDirty = false; - mPresentIntervalDirty = false; return true; } @@ -397,86 +239,18 @@ bool Surface::swapRect(EGLint x, EGLint y, EGLint width, EGLint height) return true; } - IDirect3DDevice9 *device = mDisplay->getDevice(); - - // Disable all pipeline operations - device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); - device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - device->SetRenderState(D3DRS_STENCILENABLE, FALSE); - device->SetRenderState(D3DRS_CLIPPLANEENABLE, 0); - device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED); - device->SetRenderState(D3DRS_SRGBWRITEENABLE, FALSE); - device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); - device->SetPixelShader(NULL); - device->SetVertexShader(NULL); - - device->SetRenderTarget(0, mBackBuffer); - device->SetDepthStencilSurface(NULL); - - device->SetTexture(0, mOffscreenTexture); - device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); - device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); - device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); - device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); - device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); - device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); - device->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1); - - D3DVIEWPORT9 viewport = {0, 0, mWidth, mHeight, 0.0f, 1.0f}; - device->SetViewport(&viewport); - - float x1 = x - 0.5f; - float y1 = (mHeight - y - height) - 0.5f; - float x2 = (x + width) - 0.5f; - float y2 = (mHeight - y) - 0.5f; - - float u1 = x / float(mWidth); - float v1 = y / float(mHeight); - float u2 = (x + width) / float(mWidth); - float v2 = (y + height) / float(mHeight); - - float quad[4][6] = {{x1, y1, 0.0f, 1.0f, u1, v2}, - {x2, y1, 0.0f, 1.0f, u2, v2}, - {x2, y2, 0.0f, 1.0f, u2, v1}, - {x1, y2, 0.0f, 1.0f, u1, v1}}; // x, y, z, rhw, u, v - - mDisplay->startScene(); - device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, quad, 6 * sizeof(float)); - mDisplay->endScene(); - - device->SetTexture(0, NULL); - - RECT rect = - { - x, mHeight - y - height, - x + width, mHeight - y - }; - - HRESULT result = mSwapChain->Present(&rect, &rect, NULL, NULL, 0); - - gl::Context *context = static_cast<gl::Context*>(glGetCurrentContext()); - if (context) - { - context->markAllStateDirty(); - } + EGLint status = mSwapChain->swapRect(x, y, width, height); - if (isDeviceLostError(result)) + if (status == EGL_CONTEXT_LOST) { - mDisplay->notifyDeviceLost(); + mRenderer->notifyDeviceLost(); return false; } - - if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DRIVERINTERNALERROR) + else if (status != EGL_SUCCESS) { - return error(EGL_BAD_ALLOC, false); + return error(status, false); } - ASSERT(SUCCEEDED(result)); - checkForOutOfDateSwapChain(); return true; @@ -572,9 +346,17 @@ bool Surface::checkForOutOfDateSwapChain() int clientHeight = client.bottom - client.top; bool sizeDirty = clientWidth != getWidth() || clientHeight != getHeight(); - if (sizeDirty || mPresentIntervalDirty) + if (mSwapIntervalDirty) { resetSwapChain(clientWidth, clientHeight); + } + else if (sizeDirty) + { + resizeSwapChain(clientWidth, clientHeight); + } + + if (mSwapIntervalDirty || sizeDirty) + { if (static_cast<egl::Surface*>(getCurrentDrawSurface()) == this) { glMakeCurrent(glGetCurrentContext(), static_cast<egl::Display*>(getCurrentDisplay()), this); @@ -582,22 +364,8 @@ bool Surface::checkForOutOfDateSwapChain() return true; } - return false; -} - -DWORD Surface::convertInterval(EGLint interval) -{ - switch(interval) - { - case 0: return D3DPRESENT_INTERVAL_IMMEDIATE; - case 1: return D3DPRESENT_INTERVAL_ONE; - case 2: return D3DPRESENT_INTERVAL_TWO; - case 3: return D3DPRESENT_INTERVAL_THREE; - case 4: return D3DPRESENT_INTERVAL_FOUR; - default: UNREACHABLE(); - } - return D3DPRESENT_INTERVAL_DEFAULT; + return false; } bool Surface::swap() @@ -631,38 +399,9 @@ EGLint Surface::isPostSubBufferSupported() const return mPostSubBufferSupported; } -// Increments refcount on surface. -// caller must Release() the returned surface -IDirect3DSurface9 *Surface::getRenderTarget() -{ - if (mRenderTarget) - { - mRenderTarget->AddRef(); - } - - return mRenderTarget; -} - -// Increments refcount on surface. -// caller must Release() the returned surface -IDirect3DSurface9 *Surface::getDepthStencil() -{ - if (mDepthStencil) - { - mDepthStencil->AddRef(); - } - - return mDepthStencil; -} - -IDirect3DTexture9 *Surface::getOffscreenTexture() +rx::SwapChain *Surface::getSwapChain() const { - if (mOffscreenTexture) - { - mOffscreenTexture->AddRef(); - } - - return mOffscreenTexture; + return mSwapChain; } void Surface::setSwapInterval(EGLint interval) @@ -673,11 +412,10 @@ void Surface::setSwapInterval(EGLint interval) } mSwapInterval = interval; - mSwapInterval = std::max(mSwapInterval, mDisplay->getMinSwapInterval()); - mSwapInterval = std::min(mSwapInterval, mDisplay->getMaxSwapInterval()); + mSwapInterval = std::max(mSwapInterval, mRenderer->getMinSwapInterval()); + mSwapInterval = std::min(mSwapInterval, mRenderer->getMaxSwapInterval()); - mPresentInterval = convertInterval(mSwapInterval); - mPresentIntervalDirty = true; + mSwapIntervalDirty = true; } EGLenum Surface::getTextureFormat() const @@ -700,7 +438,7 @@ gl::Texture2D *Surface::getBoundTexture() const return mTexture; } -D3DFORMAT Surface::getFormat() const +EGLenum Surface::getFormat() const { return mConfig->mRenderTargetFormat; } diff --git a/src/3rdparty/angle/src/libEGL/Surface.h b/src/3rdparty/angle/src/libEGL/Surface.h index 40bd7028ab..938b800cdd 100644 --- a/src/3rdparty/angle/src/libEGL/Surface.h +++ b/src/3rdparty/angle/src/libEGL/Surface.h @@ -1,5 +1,5 @@ // -// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. +// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // @@ -8,12 +8,11 @@ // such as the client area of a window, including any back buffers. // Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3. -#ifndef INCLUDE_SURFACE_H_ -#define INCLUDE_SURFACE_H_ +#ifndef LIBEGL_SURFACE_H_ +#define LIBEGL_SURFACE_H_ #define EGLAPI #include <EGL/egl.h> -#include <d3d9.h> #include "common/angleutils.h" @@ -21,6 +20,11 @@ namespace gl { class Texture2D; } +namespace rx +{ +class Renderer; +class SwapChain; +} namespace egl { @@ -48,18 +52,14 @@ class Surface virtual EGLint isPostSubBufferSupported() const; - virtual IDirect3DSurface9 *getRenderTarget(); - virtual IDirect3DSurface9 *getDepthStencil(); - virtual IDirect3DTexture9 *getOffscreenTexture(); - - HANDLE getShareHandle() { return mShareHandle; } + virtual rx::SwapChain *getSwapChain() const; void setSwapInterval(EGLint interval); bool checkForOutOfDateSwapChain(); // Returns true if swapchain changed due to resize or interval update virtual EGLenum getTextureFormat() const; virtual EGLenum getTextureTarget() const; - virtual D3DFORMAT getFormat() const; + virtual EGLenum getFormat() const; virtual void setBoundTexture(gl::Texture2D *texture); virtual gl::Texture2D *getBoundTexture() const; @@ -68,19 +68,16 @@ private: DISALLOW_COPY_AND_ASSIGN(Surface); Display *const mDisplay; - IDirect3DSwapChain9 *mSwapChain; - IDirect3DSurface9 *mBackBuffer; - IDirect3DSurface9 *mDepthStencil; - IDirect3DSurface9* mRenderTarget; - IDirect3DTexture9* mOffscreenTexture; + rx::Renderer *mRenderer; HANDLE mShareHandle; + rx::SwapChain *mSwapChain; void subclassWindow(); void unsubclassWindow(); + bool resizeSwapChain(int backbufferWidth, int backbufferHeight); bool resetSwapChain(int backbufferWidth, int backbufferHeight); bool swapRect(EGLint x, EGLint y, EGLint width, EGLint height); - static DWORD convertInterval(EGLint interval); const HWND mWindow; // Window that the surface is created for. bool mWindowSubclassed; // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking @@ -103,10 +100,9 @@ private: EGLint mSwapInterval; EGLint mPostSubBufferSupported; - DWORD mPresentInterval; - bool mPresentIntervalDirty; + bool mSwapIntervalDirty; gl::Texture2D *mTexture; }; } -#endif // INCLUDE_SURFACE_H_ +#endif // LIBEGL_SURFACE_H_ diff --git a/src/3rdparty/angle/src/libEGL/libEGL.cpp b/src/3rdparty/angle/src/libEGL/libEGL.cpp index 25df1c8c24..7fca456cf5 100644 --- a/src/3rdparty/angle/src/libEGL/libEGL.cpp +++ b/src/3rdparty/angle/src/libEGL/libEGL.cpp @@ -12,21 +12,23 @@ #include "common/version.h" #include "libGLESv2/Context.h" #include "libGLESv2/Texture.h" +#include "libGLESv2/main.h" +#include "libGLESv2/renderer/SwapChain.h" #include "libEGL/main.h" #include "libEGL/Display.h" - +#include "libEGL/Surface.h" bool validateDisplay(egl::Display *display) { if (display == EGL_NO_DISPLAY) { - return error(EGL_BAD_DISPLAY, false); + return egl::error(EGL_BAD_DISPLAY, false); } if (!display->isInitialized()) { - return error(EGL_NOT_INITIALIZED, false); + return egl::error(EGL_NOT_INITIALIZED, false); } return true; @@ -41,7 +43,7 @@ bool validateConfig(egl::Display *display, EGLConfig config) if (!display->isValidConfig(config)) { - return error(EGL_BAD_CONFIG, false); + return egl::error(EGL_BAD_CONFIG, false); } return true; @@ -56,7 +58,7 @@ bool validateContext(egl::Display *display, gl::Context *context) if (!display->isValidContext(context)) { - return error(EGL_BAD_CONTEXT, false); + return egl::error(EGL_BAD_CONTEXT, false); } return true; @@ -71,7 +73,7 @@ bool validateSurface(egl::Display *display, egl::Surface *surface) if (!display->isValidSurface(surface)) { - return error(EGL_BAD_SURFACE, false); + return egl::error(EGL_BAD_SURFACE, false); } return true; @@ -103,7 +105,7 @@ EGLDisplay __stdcall eglGetDisplay(EGLNativeDisplayType display_id) } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_NO_DISPLAY); + return egl::error(EGL_BAD_ALLOC, EGL_NO_DISPLAY); } } @@ -116,24 +118,24 @@ EGLBoolean __stdcall eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) { if (dpy == EGL_NO_DISPLAY) { - return error(EGL_BAD_DISPLAY, EGL_FALSE); + return egl::error(EGL_BAD_DISPLAY, EGL_FALSE); } egl::Display *display = static_cast<egl::Display*>(dpy); if (!display->initialize()) { - return error(EGL_NOT_INITIALIZED, EGL_FALSE); + return egl::error(EGL_NOT_INITIALIZED, EGL_FALSE); } if (major) *major = 1; if (minor) *minor = 4; - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -145,18 +147,18 @@ EGLBoolean __stdcall eglTerminate(EGLDisplay dpy) { if (dpy == EGL_NO_DISPLAY) { - return error(EGL_BAD_DISPLAY, EGL_FALSE); + return egl::error(EGL_BAD_DISPLAY, EGL_FALSE); } egl::Display *display = static_cast<egl::Display*>(dpy); display->terminate(); - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -176,20 +178,20 @@ const char *__stdcall eglQueryString(EGLDisplay dpy, EGLint name) switch (name) { case EGL_CLIENT_APIS: - return success("OpenGL_ES"); + return egl::success("OpenGL_ES"); case EGL_EXTENSIONS: return display->getExtensionString(); case EGL_VENDOR: - return success("Google Inc."); + return egl::success("Google Inc."); case EGL_VERSION: - return success("1.4 (ANGLE " VERSION_STRING ")"); + return egl::success("1.4 (ANGLE " VERSION_STRING ")"); } - return error(EGL_BAD_PARAMETER, (const char*)NULL); + return egl::error(EGL_BAD_PARAMETER, (const char*)NULL); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, (const char*)NULL); + return egl::error(EGL_BAD_ALLOC, (const char*)NULL); } } @@ -210,21 +212,21 @@ EGLBoolean __stdcall eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint co if (!num_config) { - return error(EGL_BAD_PARAMETER, EGL_FALSE); + return egl::error(EGL_BAD_PARAMETER, EGL_FALSE); } const EGLint attribList[] = {EGL_NONE}; if (!display->getConfigs(configs, attribList, config_size, num_config)) { - return error(EGL_BAD_ATTRIBUTE, EGL_FALSE); + return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE); } - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -245,7 +247,7 @@ EGLBoolean __stdcall eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, if (!num_config) { - return error(EGL_BAD_PARAMETER, EGL_FALSE); + return egl::error(EGL_BAD_PARAMETER, EGL_FALSE); } const EGLint attribList[] = {EGL_NONE}; @@ -257,11 +259,11 @@ EGLBoolean __stdcall eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, display->getConfigs(configs, attrib_list, config_size, num_config); - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -281,14 +283,14 @@ EGLBoolean __stdcall eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint if (!display->getConfigAttrib(config, attribute, value)) { - return error(EGL_BAD_ATTRIBUTE, EGL_FALSE); + return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE); } - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -310,14 +312,14 @@ EGLSurface __stdcall eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EG if (!IsWindow(window)) { - return error(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); + return egl::error(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); } return display->createWindowSurface(window, config, attrib_list); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_NO_SURFACE); + return egl::error(EGL_BAD_ALLOC, EGL_NO_SURFACE); } } @@ -339,7 +341,7 @@ EGLSurface __stdcall eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, c } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_NO_SURFACE); + return egl::error(EGL_BAD_ALLOC, EGL_NO_SURFACE); } } @@ -359,11 +361,11 @@ EGLSurface __stdcall eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EG UNIMPLEMENTED(); // FIXME - return success(EGL_NO_SURFACE); + return egl::success(EGL_NO_SURFACE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_NO_SURFACE); + return egl::error(EGL_BAD_ALLOC, EGL_NO_SURFACE); } } @@ -383,16 +385,16 @@ EGLBoolean __stdcall eglDestroySurface(EGLDisplay dpy, EGLSurface surface) if (surface == EGL_NO_SURFACE) { - return error(EGL_BAD_SURFACE, EGL_FALSE); + return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } display->destroySurface((egl::Surface*)surface); - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -413,7 +415,7 @@ EGLBoolean __stdcall eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint if (surface == EGL_NO_SURFACE) { - return error(EGL_BAD_SURFACE, EGL_FALSE); + return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } switch (attribute) @@ -470,14 +472,14 @@ EGLBoolean __stdcall eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint *value = eglSurface->isPostSubBufferSupported(); break; default: - return error(EGL_BAD_ATTRIBUTE, EGL_FALSE); + return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE); } - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -498,23 +500,26 @@ EGLBoolean __stdcall eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surf if (surface == EGL_NO_SURFACE) { - return error(EGL_BAD_SURFACE, EGL_FALSE); + return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } switch (attribute) { case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE: - *value = (void*) eglSurface->getShareHandle(); + { + rx::SwapChain *swapchain = eglSurface->getSwapChain(); + *value = (void*) (swapchain ? swapchain->getShareHandle() : NULL); + } break; default: - return error(EGL_BAD_ATTRIBUTE, EGL_FALSE); + return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE); } - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -528,20 +533,20 @@ EGLBoolean __stdcall eglBindAPI(EGLenum api) { case EGL_OPENGL_API: case EGL_OPENVG_API: - return error(EGL_BAD_PARAMETER, EGL_FALSE); // Not supported by this implementation + return egl::error(EGL_BAD_PARAMETER, EGL_FALSE); // Not supported by this implementation case EGL_OPENGL_ES_API: break; default: - return error(EGL_BAD_PARAMETER, EGL_FALSE); + return egl::error(EGL_BAD_PARAMETER, EGL_FALSE); } egl::setCurrentAPI(api); - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -553,11 +558,11 @@ EGLenum __stdcall eglQueryAPI(void) { EGLenum API = egl::getCurrentAPI(); - return success(API); + return egl::success(API); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -569,11 +574,11 @@ EGLBoolean __stdcall eglWaitClient(void) { UNIMPLEMENTED(); // FIXME - return success(0); + return egl::success(0); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -585,11 +590,11 @@ EGLBoolean __stdcall eglReleaseThread(void) { eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_CONTEXT, EGL_NO_SURFACE, EGL_NO_SURFACE); - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -610,14 +615,14 @@ EGLSurface __stdcall eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum bu if (buftype != EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE || !buffer) { - return error(EGL_BAD_PARAMETER, EGL_NO_SURFACE); + return egl::error(EGL_BAD_PARAMETER, EGL_NO_SURFACE); } return display->createOffscreenSurface(config, (HANDLE)buffer, attrib_list); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_NO_SURFACE); + return egl::error(EGL_BAD_ALLOC, EGL_NO_SURFACE); } } @@ -638,11 +643,11 @@ EGLBoolean __stdcall eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint UNIMPLEMENTED(); // FIXME - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -662,34 +667,34 @@ EGLBoolean __stdcall eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint if (buffer != EGL_BACK_BUFFER) { - return error(EGL_BAD_PARAMETER, EGL_FALSE); + return egl::error(EGL_BAD_PARAMETER, EGL_FALSE); } if (surface == EGL_NO_SURFACE || eglSurface->getWindowHandle()) { - return error(EGL_BAD_SURFACE, EGL_FALSE); + return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } if (eglSurface->getBoundTexture()) { - return error(EGL_BAD_ACCESS, EGL_FALSE); + return egl::error(EGL_BAD_ACCESS, EGL_FALSE); } if (eglSurface->getTextureFormat() == EGL_NO_TEXTURE) { - return error(EGL_BAD_MATCH, EGL_FALSE); + return egl::error(EGL_BAD_MATCH, EGL_FALSE); } if (!glBindTexImage(eglSurface)) { - return error(EGL_BAD_MATCH, EGL_FALSE); + return egl::error(EGL_BAD_MATCH, EGL_FALSE); } - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -709,17 +714,17 @@ EGLBoolean __stdcall eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLi if (buffer != EGL_BACK_BUFFER) { - return error(EGL_BAD_PARAMETER, EGL_FALSE); + return egl::error(EGL_BAD_PARAMETER, EGL_FALSE); } if (surface == EGL_NO_SURFACE || eglSurface->getWindowHandle()) { - return error(EGL_BAD_SURFACE, EGL_FALSE); + return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } if (eglSurface->getTextureFormat() == EGL_NO_TEXTURE) { - return error(EGL_BAD_MATCH, EGL_FALSE); + return egl::error(EGL_BAD_MATCH, EGL_FALSE); } gl::Texture2D *texture = eglSurface->getBoundTexture(); @@ -729,11 +734,11 @@ EGLBoolean __stdcall eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLi texture->releaseTexImage(); } - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -754,16 +759,16 @@ EGLBoolean __stdcall eglSwapInterval(EGLDisplay dpy, EGLint interval) if (draw_surface == NULL) { - return error(EGL_BAD_SURFACE, EGL_FALSE); + return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } draw_surface->setSwapInterval(interval); - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -791,32 +796,32 @@ EGLContext __stdcall eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLConte case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT: if (attribute[1] == EGL_TRUE) { - return error(EGL_BAD_CONFIG, EGL_NO_CONTEXT); // Unimplemented + return egl::error(EGL_BAD_CONFIG, EGL_NO_CONTEXT); // Unimplemented // robust_access = true; } else if (attribute[1] != EGL_FALSE) - return error(EGL_BAD_ATTRIBUTE, EGL_NO_CONTEXT); + return egl::error(EGL_BAD_ATTRIBUTE, EGL_NO_CONTEXT); break; case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT: if (attribute[1] == EGL_LOSE_CONTEXT_ON_RESET_EXT) reset_notification = true; else if (attribute[1] != EGL_NO_RESET_NOTIFICATION_EXT) - return error(EGL_BAD_ATTRIBUTE, EGL_NO_CONTEXT); + return egl::error(EGL_BAD_ATTRIBUTE, EGL_NO_CONTEXT); break; default: - return error(EGL_BAD_ATTRIBUTE, EGL_NO_CONTEXT); + return egl::error(EGL_BAD_ATTRIBUTE, EGL_NO_CONTEXT); } } } if (client_version != 2) { - return error(EGL_BAD_CONFIG, EGL_NO_CONTEXT); + return egl::error(EGL_BAD_CONFIG, EGL_NO_CONTEXT); } if (share_context && static_cast<gl::Context*>(share_context)->isResetNotificationEnabled() != reset_notification) { - return error(EGL_BAD_MATCH, EGL_NO_CONTEXT); + return egl::error(EGL_BAD_MATCH, EGL_NO_CONTEXT); } egl::Display *display = static_cast<egl::Display*>(dpy); @@ -829,13 +834,13 @@ EGLContext __stdcall eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLConte EGLContext context = display->createContext(config, static_cast<gl::Context*>(share_context), reset_notification, robust_access); if (context) - return success(context); + return egl::success(context); else - return error(EGL_CONTEXT_LOST, EGL_NO_CONTEXT); + return egl::error(EGL_CONTEXT_LOST, EGL_NO_CONTEXT); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_NO_CONTEXT); + return egl::error(EGL_BAD_ALLOC, EGL_NO_CONTEXT); } } @@ -855,16 +860,16 @@ EGLBoolean __stdcall eglDestroyContext(EGLDisplay dpy, EGLContext ctx) if (ctx == EGL_NO_CONTEXT) { - return error(EGL_BAD_CONTEXT, EGL_FALSE); + return egl::error(EGL_BAD_CONTEXT, EGL_FALSE); } display->destroyContext(context); - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -877,22 +882,21 @@ EGLBoolean __stdcall eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface { egl::Display *display = static_cast<egl::Display*>(dpy); gl::Context *context = static_cast<gl::Context*>(ctx); - IDirect3DDevice9 *device = display->getDevice(); - if (!device || display->testDeviceLost()) + if (ctx != EGL_NO_CONTEXT && !validateContext(display, context)) { - display->notifyDeviceLost(); return EGL_FALSE; } - if (display->isDeviceLost()) + rx::Renderer *renderer = display->getRenderer(); + if (renderer->testDeviceLost(true)) { - return error(EGL_CONTEXT_LOST, EGL_FALSE); + return EGL_FALSE; } - if (ctx != EGL_NO_CONTEXT && !validateContext(display, context)) + if (renderer->isDeviceLost()) { - return EGL_FALSE; + return egl::error(EGL_CONTEXT_LOST, EGL_FALSE); } if ((draw != EGL_NO_SURFACE && !validateSurface(display, static_cast<egl::Surface*>(draw))) || @@ -912,11 +916,11 @@ EGLBoolean __stdcall eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface glMakeCurrent(context, display, static_cast<egl::Surface*>(draw)); - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -928,11 +932,11 @@ EGLContext __stdcall eglGetCurrentContext(void) { EGLContext context = glGetCurrentContext(); - return success(context); + return egl::success(context); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_NO_CONTEXT); + return egl::error(EGL_BAD_ALLOC, EGL_NO_CONTEXT); } } @@ -945,21 +949,21 @@ EGLSurface __stdcall eglGetCurrentSurface(EGLint readdraw) if (readdraw == EGL_READ) { EGLSurface read = egl::getCurrentReadSurface(); - return success(read); + return egl::success(read); } else if (readdraw == EGL_DRAW) { EGLSurface draw = egl::getCurrentDrawSurface(); - return success(draw); + return egl::success(draw); } else { - return error(EGL_BAD_PARAMETER, EGL_NO_SURFACE); + return egl::error(EGL_BAD_PARAMETER, EGL_NO_SURFACE); } } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_NO_SURFACE); + return egl::error(EGL_BAD_ALLOC, EGL_NO_SURFACE); } } @@ -971,11 +975,11 @@ EGLDisplay __stdcall eglGetCurrentDisplay(void) { EGLDisplay dpy = egl::getCurrentDisplay(); - return success(dpy); + return egl::success(dpy); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_NO_DISPLAY); + return egl::error(EGL_BAD_ALLOC, EGL_NO_DISPLAY); } } @@ -996,11 +1000,11 @@ EGLBoolean __stdcall eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attr UNIMPLEMENTED(); // FIXME - return success(0); + return egl::success(0); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -1012,11 +1016,11 @@ EGLBoolean __stdcall eglWaitGL(void) { UNIMPLEMENTED(); // FIXME - return success(0); + return egl::success(0); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -1028,11 +1032,11 @@ EGLBoolean __stdcall eglWaitNative(EGLint engine) { UNIMPLEMENTED(); // FIXME - return success(0); + return egl::success(0); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -1050,24 +1054,24 @@ EGLBoolean __stdcall eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) return EGL_FALSE; } - if (display->isDeviceLost()) + if (display->getRenderer()->isDeviceLost()) { - return error(EGL_CONTEXT_LOST, EGL_FALSE); + return egl::error(EGL_CONTEXT_LOST, EGL_FALSE); } if (surface == EGL_NO_SURFACE) { - return error(EGL_BAD_SURFACE, EGL_FALSE); + return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } if (eglSurface->swap()) { - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } return EGL_FALSE; @@ -1087,18 +1091,18 @@ EGLBoolean __stdcall eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativ return EGL_FALSE; } - if (display->isDeviceLost()) + if (display->getRenderer()->isDeviceLost()) { - return error(EGL_CONTEXT_LOST, EGL_FALSE); + return egl::error(EGL_CONTEXT_LOST, EGL_FALSE); } UNIMPLEMENTED(); // FIXME - return success(0); + return egl::success(0); } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } } @@ -1110,7 +1114,7 @@ EGLBoolean __stdcall eglPostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLi { if (x < 0 || y < 0 || width < 0 || height < 0) { - return error(EGL_BAD_PARAMETER, EGL_FALSE); + return egl::error(EGL_BAD_PARAMETER, EGL_FALSE); } egl::Display *display = static_cast<egl::Display*>(dpy); @@ -1121,24 +1125,24 @@ EGLBoolean __stdcall eglPostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLi return EGL_FALSE; } - if (display->isDeviceLost()) + if (display->getRenderer()->isDeviceLost()) { - return error(EGL_CONTEXT_LOST, EGL_FALSE); + return egl::error(EGL_CONTEXT_LOST, EGL_FALSE); } if (surface == EGL_NO_SURFACE) { - return error(EGL_BAD_SURFACE, EGL_FALSE); + return egl::error(EGL_BAD_SURFACE, EGL_FALSE); } if (eglSurface->postSubBuffer(x, y, width, height)) { - return success(EGL_TRUE); + return egl::success(EGL_TRUE); } } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, EGL_FALSE); + return egl::error(EGL_BAD_ALLOC, EGL_FALSE); } return EGL_FALSE; @@ -1163,7 +1167,7 @@ __eglMustCastToProperFunctionPointerType __stdcall eglGetProcAddress(const char {"", NULL}, }; - for (int ext = 0; ext < sizeof(eglExtensions) / sizeof(Extension); ext++) + for (unsigned int ext = 0; ext < ArraySize(eglExtensions); ext++) { if (strcmp(procname, eglExtensions[ext].name) == 0) { @@ -1175,7 +1179,7 @@ __eglMustCastToProperFunctionPointerType __stdcall eglGetProcAddress(const char } catch(std::bad_alloc&) { - return error(EGL_BAD_ALLOC, (__eglMustCastToProperFunctionPointerType)NULL); + return egl::error(EGL_BAD_ALLOC, (__eglMustCastToProperFunctionPointerType)NULL); } } } diff --git a/src/3rdparty/angle/src/libEGL/main.cpp b/src/3rdparty/angle/src/libEGL/main.cpp index 614bcf67ad..7ba77f08d1 100644 --- a/src/3rdparty/angle/src/libEGL/main.cpp +++ b/src/3rdparty/angle/src/libEGL/main.cpp @@ -155,9 +155,10 @@ EGLSurface getCurrentReadSurface() { return current()->readSurface; } -} void error(EGLint errorCode) { egl::setCurrentError(errorCode); } + +} diff --git a/src/3rdparty/angle/src/libEGL/main.h b/src/3rdparty/angle/src/libEGL/main.h index d09d9e6bc3..77da8f0f8e 100644 --- a/src/3rdparty/angle/src/libEGL/main.h +++ b/src/3rdparty/angle/src/libEGL/main.h @@ -38,7 +38,6 @@ EGLSurface getCurrentDrawSurface(); void setCurrentReadSurface(EGLSurface surface); EGLSurface getCurrentReadSurface(); -} void error(EGLint errorCode); @@ -58,4 +57,6 @@ const T &success(const T &returnValue) return returnValue; } +} + #endif // LIBEGL_MAIN_H_ |