Commit 79c7e273 by Nicolas Capens

Implement EGL_LARGEST_PBUFFER.

Bug 23041720 Change-Id: I9f6bed0a3d239a0adde9cc4e90cc368f078f3662 Reviewed-on: https://swiftshader-review.googlesource.com/3902Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent f77786ef
...@@ -305,7 +305,7 @@ EGLSurface Display::createWindowSurface(EGLNativeWindowType window, EGLConfig co ...@@ -305,7 +305,7 @@ EGLSurface Display::createWindowSurface(EGLNativeWindowType window, EGLConfig co
return error(EGL_BAD_ALLOC, EGL_NO_SURFACE); return error(EGL_BAD_ALLOC, EGL_NO_SURFACE);
} }
Surface *surface = new Surface(this, configuration, window); Surface *surface = new WindowSurface(this, configuration, window);
if(!surface->initialize()) if(!surface->initialize())
{ {
...@@ -319,18 +319,19 @@ EGLSurface Display::createWindowSurface(EGLNativeWindowType window, EGLConfig co ...@@ -319,18 +319,19 @@ EGLSurface Display::createWindowSurface(EGLNativeWindowType window, EGLConfig co
return success(surface); return success(surface);
} }
EGLSurface Display::createOffscreenSurface(EGLConfig config, const EGLint *attribList) EGLSurface Display::createPBufferSurface(EGLConfig config, const EGLint *attribList)
{ {
EGLint width = 0, height = 0; EGLint width = 0, height = 0;
EGLenum textureFormat = EGL_NO_TEXTURE; EGLenum textureFormat = EGL_NO_TEXTURE;
EGLenum textureTarget = EGL_NO_TEXTURE; EGLenum textureTarget = EGL_NO_TEXTURE;
EGLBoolean largestPBuffer = EGL_FALSE;
const Config *configuration = mConfigSet.get(config); const Config *configuration = mConfigSet.get(config);
if(attribList) if(attribList)
{ {
while(*attribList != EGL_NONE) while(*attribList != EGL_NONE)
{ {
switch (attribList[0]) switch(attribList[0])
{ {
case EGL_WIDTH: case EGL_WIDTH:
width = attribList[1]; width = attribList[1];
...@@ -339,11 +340,10 @@ EGLSurface Display::createOffscreenSurface(EGLConfig config, const EGLint *attri ...@@ -339,11 +340,10 @@ EGLSurface Display::createOffscreenSurface(EGLConfig config, const EGLint *attri
height = attribList[1]; height = attribList[1];
break; break;
case EGL_LARGEST_PBUFFER: case EGL_LARGEST_PBUFFER:
if(attribList[1] != EGL_FALSE) largestPBuffer = attribList[1];
UNIMPLEMENTED(); // FIXME
break; break;
case EGL_TEXTURE_FORMAT: case EGL_TEXTURE_FORMAT:
switch (attribList[1]) switch(attribList[1])
{ {
case EGL_NO_TEXTURE: case EGL_NO_TEXTURE:
case EGL_TEXTURE_RGB: case EGL_TEXTURE_RGB:
...@@ -355,7 +355,7 @@ EGLSurface Display::createOffscreenSurface(EGLConfig config, const EGLint *attri ...@@ -355,7 +355,7 @@ EGLSurface Display::createOffscreenSurface(EGLConfig config, const EGLint *attri
} }
break; break;
case EGL_TEXTURE_TARGET: case EGL_TEXTURE_TARGET:
switch (attribList[1]) switch(attribList[1])
{ {
case EGL_NO_TEXTURE: case EGL_NO_TEXTURE:
case EGL_TEXTURE_2D: case EGL_TEXTURE_2D:
...@@ -367,7 +367,9 @@ EGLSurface Display::createOffscreenSurface(EGLConfig config, const EGLint *attri ...@@ -367,7 +367,9 @@ EGLSurface Display::createOffscreenSurface(EGLConfig config, const EGLint *attri
break; break;
case EGL_MIPMAP_TEXTURE: case EGL_MIPMAP_TEXTURE:
if(attribList[1] != EGL_FALSE) if(attribList[1] != EGL_FALSE)
{
return error(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); return error(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
}
break; break;
case EGL_VG_COLORSPACE: case EGL_VG_COLORSPACE:
return error(EGL_BAD_MATCH, EGL_NO_SURFACE); return error(EGL_BAD_MATCH, EGL_NO_SURFACE);
...@@ -408,7 +410,7 @@ EGLSurface Display::createOffscreenSurface(EGLConfig config, const EGLint *attri ...@@ -408,7 +410,7 @@ EGLSurface Display::createOffscreenSurface(EGLConfig config, const EGLint *attri
return error(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); return error(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
} }
Surface *surface = new Surface(this, configuration, width, height, textureFormat, textureTarget); Surface *surface = new PBufferSurface(this, configuration, width, height, textureFormat, textureTarget, largestPBuffer);
if(!surface->initialize()) if(!surface->initialize())
{ {
...@@ -543,21 +545,24 @@ bool Display::hasExistingWindowSurface(EGLNativeWindowType window) ...@@ -543,21 +545,24 @@ bool Display::hasExistingWindowSurface(EGLNativeWindowType window)
{ {
for(SurfaceSet::iterator surface = mSurfaceSet.begin(); surface != mSurfaceSet.end(); surface++) for(SurfaceSet::iterator surface = mSurfaceSet.begin(); surface != mSurfaceSet.end(); surface++)
{ {
if((*surface)->isWindowSurface())
{
if((*surface)->getWindowHandle() == window) if((*surface)->getWindowHandle() == window)
{ {
return true; return true;
} }
} }
}
return false; return false;
} }
EGLint Display::getMinSwapInterval() EGLint Display::getMinSwapInterval() const
{ {
return mMinSwapInterval; return mMinSwapInterval;
} }
EGLint Display::getMaxSwapInterval() EGLint Display::getMaxSwapInterval() const
{ {
return mMaxSwapInterval; return mMaxSwapInterval;
} }
......
...@@ -39,7 +39,7 @@ namespace egl ...@@ -39,7 +39,7 @@ namespace egl
bool getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value); bool getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value);
EGLSurface createWindowSurface(EGLNativeWindowType window, EGLConfig config, const EGLint *attribList); EGLSurface createWindowSurface(EGLNativeWindowType window, EGLConfig config, const EGLint *attribList);
EGLSurface createOffscreenSurface(EGLConfig config, const EGLint *attribList); EGLSurface createPBufferSurface(EGLConfig config, const EGLint *attribList);
EGLContext createContext(EGLConfig configHandle, const Context *shareContext, EGLint clientVersion); EGLContext createContext(EGLConfig configHandle, const Context *shareContext, EGLint clientVersion);
void destroySurface(Surface *surface); void destroySurface(Surface *surface);
...@@ -52,8 +52,8 @@ namespace egl ...@@ -52,8 +52,8 @@ namespace egl
bool isValidWindow(EGLNativeWindowType window); bool isValidWindow(EGLNativeWindowType window);
bool hasExistingWindowSurface(EGLNativeWindowType window); bool hasExistingWindowSurface(EGLNativeWindowType window);
EGLint getMinSwapInterval(); EGLint getMinSwapInterval() const;
EGLint getMaxSwapInterval(); EGLint getMaxSwapInterval() const;
EGLNativeDisplayType getNativeDisplay() const; EGLNativeDisplayType getNativeDisplay() const;
const char *getExtensionString() const; const char *getExtensionString() const;
......
...@@ -36,40 +36,21 @@ ...@@ -36,40 +36,21 @@
namespace egl namespace egl
{ {
Surface::Surface(Display *display, const Config *config, EGLNativeWindowType window) Surface::Surface(const Display *display, const Config *config) : display(display), config(config)
: mDisplay(display), mConfig(config), mWindow(window)
{ {
frameBuffer = 0; backBuffer = nullptr;
backBuffer = 0; depthStencil = nullptr;
texture = nullptr;
mDepthStencil = NULL;
mTexture = NULL; width = 0;
mTextureFormat = EGL_NO_TEXTURE; height = 0;
mTextureTarget = EGL_NO_TEXTURE; largestPBuffer = EGL_FALSE;
pixelAspectRatio = (EGLint)(1.0 * EGL_DISPLAY_SCALING); // FIXME: Determine actual pixel aspect ratio
mPixelAspectRatio = (EGLint)(1.0 * EGL_DISPLAY_SCALING); // FIXME: Determine actual pixel aspect ratio renderBuffer = EGL_BACK_BUFFER;
mRenderBuffer = EGL_BACK_BUFFER; swapBehavior = EGL_BUFFER_PRESERVED;
mSwapBehavior = EGL_BUFFER_PRESERVED; textureFormat = EGL_NO_TEXTURE;
mSwapInterval = -1; textureTarget = EGL_NO_TEXTURE;
setSwapInterval(1); swapInterval = -1;
}
Surface::Surface(Display *display, const Config *config, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureType)
: mDisplay(display), mWindow(NULL), mConfig(config), mWidth(width), mHeight(height)
{
frameBuffer = 0;
backBuffer = 0;
mDepthStencil = NULL;
mWindowSubclassed = false;
mTexture = NULL;
mTextureFormat = textureFormat;
mTextureTarget = textureType;
mPixelAspectRatio = (EGLint)(1.0 * EGL_DISPLAY_SCALING); // FIXME: Determine actual pixel aspect ratio
mRenderBuffer = EGL_BACK_BUFFER;
mSwapBehavior = EGL_BUFFER_PRESERVED;
mSwapInterval = -1;
setSwapInterval(1); setSwapInterval(1);
} }
...@@ -80,88 +61,15 @@ Surface::~Surface() ...@@ -80,88 +61,15 @@ Surface::~Surface()
bool Surface::initialize() bool Surface::initialize()
{ {
ASSERT(!frameBuffer && !backBuffer && !mDepthStencil); ASSERT(!backBuffer && !depthStencil);
return reset();
}
void Surface::deleteResources()
{
if(mDepthStencil)
{
mDepthStencil->release();
mDepthStencil = NULL;
}
if(mTexture)
{
mTexture->releaseTexImage();
mTexture = NULL;
}
if(backBuffer)
{
backBuffer->release();
backBuffer = 0;
}
delete frameBuffer;
frameBuffer = 0;
}
bool Surface::reset()
{
if(!mWindow)
{
return reset(mWidth, mHeight);
}
// FIXME: Wrap into an abstract Window class
#if defined(_WIN32)
RECT windowRect;
GetClientRect(mWindow, &windowRect);
return reset(windowRect.right - windowRect.left, windowRect.bottom - windowRect.top);
#elif defined(__ANDROID__)
return reset(ANativeWindow_getWidth(mWindow), ANativeWindow_getHeight(mWindow));
#else
XWindowAttributes windowAttributes;
libX11->XGetWindowAttributes(mDisplay->getNativeDisplay(), mWindow, &windowAttributes);
return reset(windowAttributes.width, windowAttributes.height);
#endif
}
bool Surface::reset(int backBufferWidth, int backBufferHeight)
{
deleteResources();
if(mWindow)
{
if(libGLES_CM) if(libGLES_CM)
{ {
frameBuffer = libGLES_CM->createFrameBuffer(mDisplay->getNativeDisplay(), mWindow, backBufferWidth, backBufferHeight); backBuffer = libGLES_CM->createBackBuffer(width, height, config);
} }
else if(libGLESv2) else if(libGLESv2)
{ {
frameBuffer = libGLESv2->createFrameBuffer(mDisplay->getNativeDisplay(), mWindow, backBufferWidth, backBufferHeight); backBuffer = libGLESv2->createBackBuffer(width, height, config);
}
if(!frameBuffer)
{
ERR("Could not create frame buffer");
deleteResources();
return error(EGL_BAD_ALLOC, false);
}
}
if(libGLES_CM)
{
backBuffer = libGLES_CM->createBackBuffer(backBufferWidth, backBufferHeight, mConfig);
}
else if(libGLESv2)
{
backBuffer = libGLESv2->createBackBuffer(backBufferWidth, backBufferHeight, mConfig);
} }
if(!backBuffer) if(!backBuffer)
...@@ -171,18 +79,18 @@ bool Surface::reset(int backBufferWidth, int backBufferHeight) ...@@ -171,18 +79,18 @@ bool Surface::reset(int backBufferWidth, int backBufferHeight)
return error(EGL_BAD_ALLOC, false); return error(EGL_BAD_ALLOC, false);
} }
if(mConfig->mDepthStencilFormat != sw::FORMAT_NULL) if(config->mDepthStencilFormat != sw::FORMAT_NULL)
{ {
if(libGLES_CM) if(libGLES_CM)
{ {
mDepthStencil = libGLES_CM->createDepthStencil(backBufferWidth, backBufferHeight, mConfig->mDepthStencilFormat, 1, false); depthStencil = libGLES_CM->createDepthStencil(width, height, config->mDepthStencilFormat, 1, false);
} }
else if(libGLESv2) else if(libGLESv2)
{ {
mDepthStencil = libGLESv2->createDepthStencil(backBufferWidth, backBufferHeight, mConfig->mDepthStencilFormat, 1, false); depthStencil = libGLESv2->createDepthStencil(width, height, config->mDepthStencilFormat, 1, false);
} }
if(!mDepthStencil) if(!depthStencil)
{ {
ERR("Could not create depth/stencil buffer for surface"); ERR("Could not create depth/stencil buffer for surface");
deleteResources(); deleteResources();
...@@ -190,26 +98,27 @@ bool Surface::reset(int backBufferWidth, int backBufferHeight) ...@@ -190,26 +98,27 @@ bool Surface::reset(int backBufferWidth, int backBufferHeight)
} }
} }
mWidth = backBufferWidth;
mHeight = backBufferHeight;
return true; return true;
} }
EGLNativeWindowType Surface::getWindowHandle() void Surface::deleteResources()
{ {
return mWindow; if(depthStencil)
} {
depthStencil->release();
depthStencil = nullptr;
}
void Surface::swap() if(texture)
{
if(backBuffer)
{ {
void *source = backBuffer->lockInternal(0, 0, 0, sw::LOCK_READONLY, sw::PUBLIC); texture->releaseTexImage();
frameBuffer->flip(source, backBuffer->Surface::getInternalFormat()); texture = nullptr;
backBuffer->unlockInternal(); }
checkForResize(); if(backBuffer)
{
backBuffer->release();
backBuffer = nullptr;
} }
} }
...@@ -225,96 +134,143 @@ egl::Image *Surface::getRenderTarget() ...@@ -225,96 +134,143 @@ egl::Image *Surface::getRenderTarget()
egl::Image *Surface::getDepthStencil() egl::Image *Surface::getDepthStencil()
{ {
if(mDepthStencil) if(depthStencil)
{ {
mDepthStencil->addRef(); depthStencil->addRef();
} }
return mDepthStencil; return depthStencil;
} }
void Surface::setSwapBehavior(EGLenum swapBehavior) void Surface::setSwapBehavior(EGLenum swapBehavior)
{ {
mSwapBehavior = swapBehavior; swapBehavior = swapBehavior;
} }
void Surface::setSwapInterval(EGLint interval) void Surface::setSwapInterval(EGLint interval)
{ {
if(mSwapInterval == interval) if(swapInterval == interval)
{ {
return; return;
} }
mSwapInterval = interval; swapInterval = interval;
mSwapInterval = std::max(mSwapInterval, mDisplay->getMinSwapInterval()); swapInterval = std::max(swapInterval, display->getMinSwapInterval());
mSwapInterval = std::min(mSwapInterval, mDisplay->getMaxSwapInterval()); swapInterval = std::min(swapInterval, display->getMaxSwapInterval());
} }
EGLint Surface::getConfigID() const EGLint Surface::getConfigID() const
{ {
return mConfig->mConfigID; return config->mConfigID;
} }
EGLenum Surface::getSurfaceType() const EGLenum Surface::getSurfaceType() const
{ {
return mConfig->mSurfaceType; return config->mSurfaceType;
} }
sw::Format Surface::getInternalFormat() const sw::Format Surface::getInternalFormat() const
{ {
return mConfig->mRenderTargetFormat; return config->mRenderTargetFormat;
} }
EGLint Surface::getWidth() const EGLint Surface::getWidth() const
{ {
return mWidth; return width;
} }
EGLint Surface::getHeight() const EGLint Surface::getHeight() const
{ {
return mHeight; return height;
} }
EGLint Surface::getPixelAspectRatio() const EGLint Surface::getPixelAspectRatio() const
{ {
return mPixelAspectRatio; return pixelAspectRatio;
} }
EGLenum Surface::getRenderBuffer() const EGLenum Surface::getRenderBuffer() const
{ {
return mRenderBuffer; return renderBuffer;
} }
EGLenum Surface::getSwapBehavior() const EGLenum Surface::getSwapBehavior() const
{ {
return mSwapBehavior; return swapBehavior;
} }
EGLenum Surface::getTextureFormat() const EGLenum Surface::getTextureFormat() const
{ {
return mTextureFormat; return textureFormat;
} }
EGLenum Surface::getTextureTarget() const EGLenum Surface::getTextureTarget() const
{ {
return mTextureTarget; return textureTarget;
}
EGLBoolean Surface::getLargestPBuffer() const
{
return largestPBuffer;
} }
void Surface::setBoundTexture(egl::Texture *texture) void Surface::setBoundTexture(egl::Texture *texture)
{ {
mTexture = texture; this->texture = texture;
} }
egl::Texture *Surface::getBoundTexture() const egl::Texture *Surface::getBoundTexture() const
{ {
return mTexture; return texture;
} }
bool Surface::checkForResize() WindowSurface::WindowSurface(Display *display, const Config *config, EGLNativeWindowType window)
: Surface(display, config), window(window)
{
frameBuffer = nullptr;
}
bool WindowSurface::initialize()
{
ASSERT(!frameBuffer && !backBuffer && !depthStencil);
#if defined(_WIN32)
RECT windowRect;
GetClientRect(window, &windowRect);
return reset(windowRect.right - windowRect.left, windowRect.bottom - windowRect.top);
#elif defined(__ANDROID__)
return reset(ANativeWindow_getWidth(window), ANativeWindow_getHeight(window));
#else
XWindowAttributes windowAttributes;
libX11->XGetWindowAttributes(display->getNativeDisplay(), window, &windowAttributes);
return reset(windowAttributes.width, windowAttributes.height);
#endif
}
void WindowSurface::swap()
{
if(backBuffer && frameBuffer)
{
void *source = backBuffer->lockInternal(0, 0, 0, sw::LOCK_READONLY, sw::PUBLIC);
frameBuffer->flip(source, backBuffer->Surface::getInternalFormat());
backBuffer->unlockInternal();
checkForResize();
}
}
EGLNativeWindowType WindowSurface::getWindowHandle() const
{
return window;
}
bool WindowSurface::checkForResize()
{ {
#if defined(_WIN32) #if defined(_WIN32)
RECT client; RECT client;
if(!GetClientRect(mWindow, &client)) if(!GetClientRect(window, &client))
{ {
ASSERT(false); ASSERT(false);
return false; return false;
...@@ -323,17 +279,17 @@ bool Surface::checkForResize() ...@@ -323,17 +279,17 @@ bool Surface::checkForResize()
int clientWidth = client.right - client.left; int clientWidth = client.right - client.left;
int clientHeight = client.bottom - client.top; int clientHeight = client.bottom - client.top;
#elif defined(__ANDROID__) #elif defined(__ANDROID__)
int clientWidth = ANativeWindow_getWidth(mWindow); int clientWidth = ANativeWindow_getWidth(window);
int clientHeight = ANativeWindow_getHeight(mWindow); int clientHeight = ANativeWindow_getHeight(window);
#else #else
XWindowAttributes windowAttributes; XWindowAttributes windowAttributes;
libX11->XGetWindowAttributes(mDisplay->getNativeDisplay(), mWindow, &windowAttributes); libX11->XGetWindowAttributes(display->getNativeDisplay(), window, &windowAttributes);
int clientWidth = windowAttributes.width; int clientWidth = windowAttributes.width;
int clientHeight = windowAttributes.height; int clientHeight = windowAttributes.height;
#endif #endif
bool sizeDirty = clientWidth != getWidth() || clientHeight != getHeight(); bool sizeDirty = (clientWidth != width) || (clientHeight != height);
if(sizeDirty) if(sizeDirty)
{ {
...@@ -349,4 +305,62 @@ bool Surface::checkForResize() ...@@ -349,4 +305,62 @@ bool Surface::checkForResize()
return false; return false;
} }
void WindowSurface::deleteResources()
{
delete frameBuffer;
frameBuffer = nullptr;
Surface::deleteResources();
}
bool WindowSurface::reset(int backBufferWidth, int backBufferHeight)
{
width = backBufferWidth;
height = backBufferHeight;
deleteResources();
if(window)
{
if(libGLES_CM)
{
frameBuffer = libGLES_CM->createFrameBuffer(display->getNativeDisplay(), window, width, height);
}
else if(libGLESv2)
{
frameBuffer = libGLESv2->createFrameBuffer(display->getNativeDisplay(), window, width, height);
}
if(!frameBuffer)
{
ERR("Could not create frame buffer");
deleteResources();
return error(EGL_BAD_ALLOC, false);
}
}
return Surface::initialize();
}
PBufferSurface::PBufferSurface(Display *display, const Config *config, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureType, EGLBoolean largestPBuffer)
: Surface(display, config)
{
this->width = width;
this->height = height;
this->largestPBuffer = largestPBuffer;
}
void PBufferSurface::swap()
{
// No effect
}
EGLNativeWindowType PBufferSurface::getWindowHandle() const
{
UNREACHABLE(-1); // Should not be called. Only WindowSurface has a window handle.
return 0;
}
} }
...@@ -31,13 +31,8 @@ class Image; ...@@ -31,13 +31,8 @@ class Image;
class Surface : public gl::Object class Surface : public gl::Object
{ {
public: public:
Surface(Display *display, const egl::Config *config, EGLNativeWindowType window); virtual bool initialize();
Surface(Display *display, const egl::Config *config, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureTarget); virtual void swap() = 0;
bool initialize();
void swap();
EGLNativeWindowType getWindowHandle();
virtual egl::Image *getRenderTarget(); virtual egl::Image *getRenderTarget();
virtual egl::Image *getDepthStencil(); virtual egl::Image *getDepthStencil();
...@@ -56,45 +51,78 @@ public: ...@@ -56,45 +51,78 @@ public:
virtual EGLenum getSwapBehavior() const; virtual EGLenum getSwapBehavior() const;
virtual EGLenum getTextureFormat() const; virtual EGLenum getTextureFormat() const;
virtual EGLenum getTextureTarget() const; virtual EGLenum getTextureTarget() const;
virtual EGLBoolean getLargestPBuffer() const;
virtual EGLNativeWindowType getWindowHandle() const = 0;
virtual void setBoundTexture(egl::Texture *texture); virtual void setBoundTexture(egl::Texture *texture);
virtual egl::Texture *getBoundTexture() const; virtual egl::Texture *getBoundTexture() const;
bool checkForResize(); // Returns true if surface changed due to resize virtual bool isWindowSurface() const { return false; }
virtual bool isPBufferSurface() const { return false; }
protected:
Surface(const Display *display, const Config *config);
private:
virtual ~Surface(); virtual ~Surface();
void deleteResources(); virtual void deleteResources();
bool reset();
Display *const mDisplay; const Display *const display;
egl::Image *mDepthStencil; Image *depthStencil;
sw::FrameBuffer *frameBuffer; Image *backBuffer;
egl::Image *backBuffer; Texture *texture;
egl::Texture *mTexture;
bool reset(int backbufferWidth, int backbufferHeight); bool reset(int backbufferWidth, int backbufferHeight);
const EGLNativeWindowType mWindow; // Window that the surface is created for. const Config *const config; // EGL config surface was created with
bool mWindowSubclassed; // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking EGLint height; // Height of surface
const egl::Config *mConfig; // EGL config surface was created with EGLint width; // Width of surface
EGLint mHeight; // Height of surface
EGLint mWidth; // Width of surface
// EGLint horizontalResolution; // Horizontal dot pitch // EGLint horizontalResolution; // Horizontal dot pitch
// EGLint verticalResolution; // Vertical dot pitch // EGLint verticalResolution; // Vertical dot pitch
// EGLBoolean largestPBuffer; // If true, create largest pbuffer possible EGLBoolean largestPBuffer; // If true, create largest pbuffer possible
// EGLBoolean mipmapTexture; // True if texture has mipmaps // EGLBoolean mipmapTexture; // True if texture has mipmaps
// EGLint mipmapLevel; // Mipmap level to render to // EGLint mipmapLevel; // Mipmap level to render to
// EGLenum multisampleResolve; // Multisample resolve behavior // EGLenum multisampleResolve; // Multisample resolve behavior
EGLint mPixelAspectRatio; // Display aspect ratio EGLint pixelAspectRatio; // Display aspect ratio
EGLenum mRenderBuffer; // Render buffer EGLenum renderBuffer; // Render buffer
EGLenum mSwapBehavior; // Buffer swap behavior EGLenum swapBehavior; // Buffer swap behavior
EGLenum mTextureFormat; // Format of texture: RGB, RGBA, or no texture EGLenum textureFormat; // Format of texture: RGB, RGBA, or no texture
EGLenum mTextureTarget; // Type of texture: 2D or no texture EGLenum textureTarget; // Type of texture: 2D or no texture
// EGLenum vgAlphaFormat; // Alpha format for OpenVG // EGLenum vgAlphaFormat; // Alpha format for OpenVG
// EGLenum vgColorSpace; // Color space for OpenVG // EGLenum vgColorSpace; // Color space for OpenVG
EGLint mSwapInterval; EGLint swapInterval;
};
class WindowSurface : public Surface
{
public:
WindowSurface(Display *display, const egl::Config *config, EGLNativeWindowType window);
bool initialize() override;
bool isWindowSurface() const override { return true; }
void swap() override;
EGLNativeWindowType getWindowHandle() const override;
private:
void deleteResources() override;
bool checkForResize();
bool reset(int backBufferWidth, int backBufferHeight);
const EGLNativeWindowType window;
sw::FrameBuffer *frameBuffer;
};
class PBufferSurface : public Surface
{
public:
PBufferSurface(Display *display, const egl::Config *config, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureTarget, EGLBoolean largestPBuffer);
bool isPBufferSurface() const override { return true; }
void swap() override;
EGLNativeWindowType getWindowHandle() const override;
}; };
} }
......
...@@ -302,7 +302,7 @@ EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint * ...@@ -302,7 +302,7 @@ EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *
return EGL_NO_SURFACE; return EGL_NO_SURFACE;
} }
return display->createOffscreenSurface(config, attrib_list); return display->createPBufferSurface(config, attrib_list);
} }
EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list) EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
...@@ -380,7 +380,10 @@ EGLBoolean QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EG ...@@ -380,7 +380,10 @@ EGLBoolean QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EG
UNIMPLEMENTED(); // FIXME UNIMPLEMENTED(); // FIXME
break; break;
case EGL_LARGEST_PBUFFER: case EGL_LARGEST_PBUFFER:
UNIMPLEMENTED(); // FIXME if(eglSurface->isPBufferSurface()) // For a window or pixmap surface, the contents of *value are not modified.
{
*value = eglSurface->getLargestPBuffer();
}
break; break;
case EGL_MIPMAP_TEXTURE: case EGL_MIPMAP_TEXTURE:
UNIMPLEMENTED(); // FIXME UNIMPLEMENTED(); // FIXME
...@@ -530,7 +533,7 @@ EGLBoolean BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) ...@@ -530,7 +533,7 @@ EGLBoolean BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
return error(EGL_BAD_PARAMETER, EGL_FALSE); return error(EGL_BAD_PARAMETER, EGL_FALSE);
} }
if(surface == EGL_NO_SURFACE || eglSurface->getWindowHandle()) if(surface == EGL_NO_SURFACE || eglSurface->isWindowSurface())
{ {
return error(EGL_BAD_SURFACE, EGL_FALSE); return error(EGL_BAD_SURFACE, EGL_FALSE);
} }
...@@ -572,7 +575,7 @@ EGLBoolean ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) ...@@ -572,7 +575,7 @@ EGLBoolean ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
return error(EGL_BAD_PARAMETER, EGL_FALSE); return error(EGL_BAD_PARAMETER, EGL_FALSE);
} }
if(surface == EGL_NO_SURFACE || eglSurface->getWindowHandle()) if(surface == EGL_NO_SURFACE || eglSurface->isWindowSurface())
{ {
return error(EGL_BAD_SURFACE, EGL_FALSE); return error(EGL_BAD_SURFACE, EGL_FALSE);
} }
......
...@@ -2129,7 +2129,7 @@ void Context::applyTextures(sw::SamplerType samplerType) ...@@ -2129,7 +2129,7 @@ void Context::applyTextures(sw::SamplerType samplerType)
} }
else else
{ {
applyTexture(samplerType, samplerIndex, 0); applyTexture(samplerType, samplerIndex, nullptr);
device->setStageOperation(samplerIndex, sw::TextureStage::STAGE_SELECTARG1); device->setStageOperation(samplerIndex, sw::TextureStage::STAGE_SELECTARG1);
device->setFirstArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT); device->setFirstArgument(samplerIndex, sw::TextureStage::SOURCE_CURRENT);
...@@ -2144,7 +2144,7 @@ void Context::applyTextures(sw::SamplerType samplerType) ...@@ -2144,7 +2144,7 @@ void Context::applyTextures(sw::SamplerType samplerType)
} }
else else
{ {
applyTexture(samplerType, samplerIndex, NULL); applyTexture(samplerType, samplerIndex, nullptr);
} }
} }
} }
......
...@@ -2238,7 +2238,7 @@ void Context::applyTextures() ...@@ -2238,7 +2238,7 @@ void Context::applyTextures()
} }
else else
{ {
applyTexture(unit, 0); applyTexture(unit, nullptr);
device->setFirstArgument(unit, sw::TextureStage::SOURCE_CURRENT); device->setFirstArgument(unit, sw::TextureStage::SOURCE_CURRENT);
device->setFirstModifier(unit, sw::TextureStage::MODIFIER_COLOR); device->setFirstModifier(unit, sw::TextureStage::MODIFIER_COLOR);
......
...@@ -90,17 +90,9 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, Buffer *bu ...@@ -90,17 +90,9 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLsizei count, Buffer *bu
} }
intptr_t offset = reinterpret_cast<intptr_t>(indices); intptr_t offset = reinterpret_cast<intptr_t>(indices);
bool alignedOffset = false;
if(buffer != NULL) if(buffer != NULL)
{ {
switch(type)
{
case GL_UNSIGNED_BYTE: alignedOffset = (offset % sizeof(GLubyte) == 0); break;
case GL_UNSIGNED_SHORT: alignedOffset = (offset % sizeof(GLushort) == 0); break;
default: UNREACHABLE(type); alignedOffset = false;
}
if(typeSize(type) * count + offset > static_cast<std::size_t>(buffer->size())) if(typeSize(type) * count + offset > static_cast<std::size_t>(buffer->size()))
{ {
return GL_INVALID_OPERATION; return GL_INVALID_OPERATION;
......
...@@ -3083,12 +3083,12 @@ void Context::applyTextures(sw::SamplerType samplerType) ...@@ -3083,12 +3083,12 @@ void Context::applyTextures(sw::SamplerType samplerType)
} }
else else
{ {
applyTexture(samplerType, samplerIndex, 0); applyTexture(samplerType, samplerIndex, nullptr);
} }
} }
else else
{ {
applyTexture(samplerType, samplerIndex, NULL); applyTexture(samplerType, samplerIndex, nullptr);
} }
} }
} }
......
...@@ -98,18 +98,9 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLuint start, GLuint end, ...@@ -98,18 +98,9 @@ GLenum IndexDataManager::prepareIndexData(GLenum type, GLuint start, GLuint end,
} }
intptr_t offset = reinterpret_cast<intptr_t>(indices); intptr_t offset = reinterpret_cast<intptr_t>(indices);
bool alignedOffset = false;
if(buffer != NULL) if(buffer != NULL)
{ {
switch(type)
{
case GL_UNSIGNED_BYTE: alignedOffset = (offset % sizeof(GLubyte) == 0); break;
case GL_UNSIGNED_SHORT: alignedOffset = (offset % sizeof(GLushort) == 0); break;
case GL_UNSIGNED_INT: alignedOffset = (offset % sizeof(GLuint) == 0); break;
default: UNREACHABLE(type); alignedOffset = false;
}
if(typeSize(type) * count + offset > static_cast<std::size_t>(buffer->size())) if(typeSize(type) * count + offset > static_cast<std::size_t>(buffer->size()))
{ {
return GL_INVALID_OPERATION; return GL_INVALID_OPERATION;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment