blob: 183a10403442ceba6bf91a1ff530e4c2237c7f3b [file] [log] [blame]
// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Surface.hpp: Defines the egl::Surface class, representing a rendering surface
// 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_EGL_SURFACE_H_
#define INCLUDE_EGL_SURFACE_H_
#include "common/Object.hpp"
#include "common/Surface.hpp"
#include "Main/FrameBuffer.hpp"
#include <EGL/egl.h>
namespace egl
{
class Display;
class Config;
class Surface : public gl::Surface, public gl::Object
{
public:
virtual bool initialize();
virtual void swap() = 0;
egl::Image *getRenderTarget() override;
egl::Image *getDepthStencil() override;
void setMipmapLevel(EGLint mipmapLevel);
void setMultisampleResolve(EGLenum multisampleResolve);
void setSwapBehavior(EGLenum swapBehavior);
void setSwapInterval(EGLint interval);
virtual EGLint getConfigID() const;
virtual EGLenum getSurfaceType() const;
EGLint getWidth() const override;
EGLint getHeight() const override;
EGLenum getTextureTarget() const override;
virtual EGLint getMipmapLevel() const;
virtual EGLenum getMultisampleResolve() const;
virtual EGLint getPixelAspectRatio() const;
virtual EGLenum getRenderBuffer() const;
virtual EGLenum getSwapBehavior() const;
virtual EGLenum getTextureFormat() const;
virtual EGLBoolean getLargestPBuffer() const;
virtual EGLNativeWindowType getWindowHandle() const = 0;
void setBoundTexture(egl::Texture *texture) override;
virtual egl::Texture *getBoundTexture() const;
virtual bool isWindowSurface() const { return false; }
virtual bool isPBufferSurface() const { return false; }
bool hasClientBuffer() const { return clientBuffer != nullptr; }
protected:
Surface(const Display *display, const Config *config);
~Surface() override;
virtual void deleteResources();
sw::Format getClientBufferFormat() const;
const Display *const display;
const Config *const config;
Image *depthStencil = nullptr;
Image *backBuffer = nullptr;
Texture *texture = nullptr;
bool reset(int backbufferWidth, int backbufferHeight);
// Surface attributes:
EGLint width = 0; // Width of surface
EGLint height= 0; // Height of surface
// EGLint horizontalResolution = EGL_UNKNOWN; // Horizontal dot pitch
// EGLint verticalResolution = EGL_UNKNOWN; // Vertical dot pitch
EGLBoolean largestPBuffer = EGL_FALSE; // If true, create largest pbuffer possible
// EGLBoolean mipmapTexture = EGL_FALSE; // True if texture has mipmaps
EGLint mipmapLevel = 0; // Mipmap level to render to
EGLenum multisampleResolve = EGL_MULTISAMPLE_RESOLVE_DEFAULT; // Multisample resolve behavior
EGLint pixelAspectRatio = EGL_UNKNOWN; // Display aspect ratio
EGLenum renderBuffer = EGL_BACK_BUFFER; // Render buffer
EGLenum swapBehavior = EGL_BUFFER_PRESERVED; // Buffer swap behavior (initial value chosen by implementation)
EGLenum textureFormat = EGL_NO_TEXTURE; // Format of texture: RGB, RGBA, or no texture
EGLenum textureTarget = EGL_NO_TEXTURE; // Type of texture: 2D or no texture
// EGLenum vgAlphaFormat = EGL_VG_ALPHA_FORMAT_NONPRE; // Alpha format for OpenVG
// EGLenum vgColorSpace = EGL_VG_COLORSPACE_sRGB; // Color space for OpenVG
EGLint swapInterval = 1;
// EGL_ANGLE_iosurface_client_buffer attributes:
EGLClientBuffer clientBuffer = nullptr;
EGLint clientBufferPlane;
EGLenum clientBufferFormat; // Format of the client buffer
EGLenum clientBufferType; // Type of the client buffer
};
class WindowSurface : public Surface
{
public:
WindowSurface(Display *display, const egl::Config *config, EGLNativeWindowType window);
~WindowSurface() override;
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 = nullptr;
};
class PBufferSurface : public Surface
{
public:
PBufferSurface(Display *display, const egl::Config *config, EGLint width, EGLint height,
EGLenum textureFormat, EGLenum textureTarget, EGLenum internalFormat,
EGLenum textureType, EGLBoolean largestPBuffer, EGLClientBuffer clientBuffer,
EGLint clientBufferPlane);
~PBufferSurface() override;
bool isPBufferSurface() const override { return true; }
void swap() override;
EGLNativeWindowType getWindowHandle() const override;
private:
void deleteResources() override;
};
}
#endif // INCLUDE_EGL_SURFACE_H_