1// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15// Surface.hpp: Defines the egl::Surface class, representing a rendering surface 16// such as the client area of a window, including any back buffers. 17// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3. 18 19#ifndef INCLUDE_EGL_SURFACE_H_ 20#define INCLUDE_EGL_SURFACE_H_ 21 22#include "common/Object.hpp" 23#include "common/Surface.hpp" 24 25#include "Main/FrameBuffer.hpp" 26 27#include <EGL/egl.h> 28 29namespace egl 30{ 31class Display; 32class Config; 33 34class Surface : public gl::Surface, public gl::Object 35{ 36public: 37 virtual bool initialize(); 38 virtual void swap() = 0; 39 40 egl::Image *getRenderTarget() override; 41 egl::Image *getDepthStencil() override; 42 43 void setSwapBehavior(EGLenum swapBehavior); 44 void setSwapInterval(EGLint interval); 45 46 virtual EGLint getConfigID() const; 47 virtual EGLenum getSurfaceType() const; 48 49 EGLint getWidth() const override; 50 EGLint getHeight() const override; 51 EGLenum getTextureTarget() const override; 52 virtual EGLint getPixelAspectRatio() const; 53 virtual EGLenum getRenderBuffer() const; 54 virtual EGLenum getSwapBehavior() const; 55 virtual EGLenum getTextureFormat() const; 56 virtual EGLBoolean getLargestPBuffer() const; 57 virtual EGLNativeWindowType getWindowHandle() const = 0; 58 59 void setBoundTexture(egl::Texture *texture) override; 60 virtual egl::Texture *getBoundTexture() const; 61 62 virtual bool isWindowSurface() const { return false; } 63 virtual bool isPBufferSurface() const { return false; } 64 bool hasClientBuffer() const { return clientBuffer != nullptr; } 65 66protected: 67 Surface(const Display *display, const Config *config); 68 69 ~Surface() override; 70 71 virtual void deleteResources(); 72 73 sw::Format getClientBufferFormat() const; 74 75 const Display *const display; 76 Image *depthStencil; 77 Image *backBuffer; 78 Texture *texture; 79 80 bool reset(int backbufferWidth, int backbufferHeight); 81 82 const Config *const config; // EGL config surface was created with 83 EGLint width; // Width of surface 84 EGLint height; // Height of surface 85// EGLint horizontalResolution; // Horizontal dot pitch 86// EGLint verticalResolution; // Vertical dot pitch 87 EGLBoolean largestPBuffer; // If true, create largest pbuffer possible 88// EGLBoolean mipmapTexture; // True if texture has mipmaps 89// EGLint mipmapLevel; // Mipmap level to render to 90// EGLenum multisampleResolve; // Multisample resolve behavior 91 EGLint pixelAspectRatio; // Display aspect ratio 92 EGLenum renderBuffer; // Render buffer 93 EGLenum swapBehavior; // Buffer swap behavior 94 EGLenum textureFormat; // Format of texture: RGB, RGBA, or no texture 95 EGLenum textureTarget; // Type of texture: 2D or no texture 96 EGLenum clientBufferFormat; // Format of the client buffer 97 EGLenum clientBufferType; // Type of the client buffer 98// EGLenum vgAlphaFormat; // Alpha format for OpenVG 99// EGLenum vgColorSpace; // Color space for OpenVG 100 EGLint swapInterval; 101 EGLClientBuffer clientBuffer; 102 EGLint clientBufferPlane; 103}; 104 105class WindowSurface : public Surface 106{ 107public: 108 WindowSurface(Display *display, const egl::Config *config, EGLNativeWindowType window); 109 ~WindowSurface() override; 110 111 bool initialize() override; 112 113 bool isWindowSurface() const override { return true; } 114 void swap() override; 115 116 EGLNativeWindowType getWindowHandle() const override; 117 118private: 119 void deleteResources() override; 120 bool checkForResize(); 121 bool reset(int backBufferWidth, int backBufferHeight); 122 123 const EGLNativeWindowType window; 124 sw::FrameBuffer *frameBuffer; 125}; 126 127class PBufferSurface : public Surface 128{ 129public: 130 PBufferSurface(Display *display, const egl::Config *config, EGLint width, EGLint height, 131 EGLenum textureFormat, EGLenum textureTarget, EGLenum internalFormat, 132 EGLenum textureType, EGLBoolean largestPBuffer, EGLClientBuffer clientBuffer, 133 EGLint clientBufferPlane); 134 ~PBufferSurface() override; 135 136 bool isPBufferSurface() const override { return true; } 137 void swap() override; 138 139 EGLNativeWindowType getWindowHandle() const override; 140 141private: 142 void deleteResources() override; 143}; 144} 145 146#endif // INCLUDE_EGL_SURFACE_H_ 147