| // |
| // Copyright 2015 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. |
| // |
| |
| // PbufferSurfaceGLX.cpp: GLX implementation of egl::Surface for PBuffers |
| |
| #include "libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h" |
| |
| #include "common/debug.h" |
| #include "libANGLE/renderer/gl/glx/DisplayGLX.h" |
| #include "libANGLE/renderer/gl/glx/FunctionsGLX.h" |
| |
| namespace rx |
| { |
| |
| PbufferSurfaceGLX::PbufferSurfaceGLX(const egl::SurfaceState &state, |
| EGLint width, |
| EGLint height, |
| bool largest, |
| const FunctionsGLX &glx, |
| glx::FBConfig fbConfig) |
| : SurfaceGLX(state), |
| mWidth(width), |
| mHeight(height), |
| mLargest(largest), |
| mGLX(glx), |
| mFBConfig(fbConfig), |
| mPbuffer(0) |
| {} |
| |
| PbufferSurfaceGLX::~PbufferSurfaceGLX() |
| { |
| if (mPbuffer) |
| { |
| mGLX.destroyPbuffer(mPbuffer); |
| } |
| } |
| |
| egl::Error PbufferSurfaceGLX::initialize(const egl::Display *display) |
| { |
| // Avoid creating 0-sized PBuffers as it fails on the Intel Mesa driver |
| // as commented on https://bugs.freedesktop.org/show_bug.cgi?id=38869 so we |
| // use (w, 1) or (1, h) instead. |
| int width = std::max(1, static_cast<int>(mWidth)); |
| int height = std::max(1, static_cast<int>(mHeight)); |
| |
| const int attribs[] = { |
| GLX_PBUFFER_WIDTH, width, GLX_PBUFFER_HEIGHT, height, GLX_LARGEST_PBUFFER, mLargest, None}; |
| |
| mPbuffer = mGLX.createPbuffer(mFBConfig, attribs); |
| if (!mPbuffer) |
| { |
| return egl::EglBadAlloc() << "Failed to create a native GLX pbuffer."; |
| } |
| |
| if (mLargest) |
| { |
| mGLX.queryDrawable(mPbuffer, GLX_WIDTH, &mWidth); |
| mGLX.queryDrawable(mPbuffer, GLX_HEIGHT, &mHeight); |
| } |
| |
| return egl::NoError(); |
| } |
| |
| egl::Error PbufferSurfaceGLX::makeCurrent(const gl::Context *context) |
| { |
| return egl::NoError(); |
| } |
| |
| egl::Error PbufferSurfaceGLX::swap(const gl::Context *context) |
| { |
| return egl::NoError(); |
| } |
| |
| egl::Error PbufferSurfaceGLX::postSubBuffer(const gl::Context *context, |
| EGLint x, |
| EGLint y, |
| EGLint width, |
| EGLint height) |
| { |
| return egl::NoError(); |
| } |
| |
| egl::Error PbufferSurfaceGLX::querySurfacePointerANGLE(EGLint attribute, void **value) |
| { |
| UNIMPLEMENTED(); |
| return egl::NoError(); |
| } |
| |
| egl::Error PbufferSurfaceGLX::bindTexImage(const gl::Context *context, |
| gl::Texture *texture, |
| EGLint buffer) |
| { |
| UNIMPLEMENTED(); |
| return egl::NoError(); |
| } |
| |
| egl::Error PbufferSurfaceGLX::releaseTexImage(const gl::Context *context, EGLint buffer) |
| { |
| UNIMPLEMENTED(); |
| return egl::NoError(); |
| } |
| |
| void PbufferSurfaceGLX::setSwapInterval(EGLint interval) {} |
| |
| EGLint PbufferSurfaceGLX::getWidth() const |
| { |
| return mWidth; |
| } |
| |
| EGLint PbufferSurfaceGLX::getHeight() const |
| { |
| return mHeight; |
| } |
| |
| EGLint PbufferSurfaceGLX::isPostSubBufferSupported() const |
| { |
| UNIMPLEMENTED(); |
| return EGL_FALSE; |
| } |
| |
| EGLint PbufferSurfaceGLX::getSwapBehavior() const |
| { |
| return EGL_BUFFER_PRESERVED; |
| } |
| |
| egl::Error PbufferSurfaceGLX::checkForResize() |
| { |
| // The size of pbuffers never change |
| return egl::NoError(); |
| } |
| |
| glx::Drawable PbufferSurfaceGLX::getDrawable() const |
| { |
| return mPbuffer; |
| } |
| |
| } // namespace rx |