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 #ifndef gl_Device_hpp 16 #define gl_Device_hpp 17 18 #include "Renderer/Renderer.hpp" 19 20 namespace egl 21 { 22 class Image; 23 } 24 25 namespace es2 26 { 27 class Texture; 28 29 struct Viewport 30 { 31 int x0; 32 int y0; 33 unsigned int width; 34 unsigned int height; 35 float minZ; 36 float maxZ; 37 }; 38 39 class Device : public sw::Renderer 40 { 41 public: 42 explicit Device(sw::Context *context); 43 44 virtual ~Device(); 45 46 virtual void clearColor(float red, float green, float blue, float alpha, unsigned int rgbaMask); 47 virtual void clearDepth(float z); 48 virtual void clearStencil(unsigned int stencil, unsigned int mask); 49 virtual egl::Image *createDepthStencilSurface(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard); 50 virtual egl::Image *createRenderTarget(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool lockable); 51 virtual void drawIndexedPrimitive(sw::DrawType type, unsigned int indexOffset, unsigned int primitiveCount); 52 virtual void drawPrimitive(sw::DrawType type, unsigned int primiveCount); 53 virtual void setPixelShader(sw::PixelShader *shader); 54 virtual void setPixelShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count); 55 virtual void setScissorEnable(bool enable); 56 virtual void setRenderTarget(int index, egl::Image *renderTarget); 57 virtual void setDepthBuffer(egl::Image *depthBuffer); 58 virtual void setStencilBuffer(egl::Image *stencilBuffer); 59 virtual void setScissorRect(const sw::Rect &rect); 60 virtual void setVertexShader(sw::VertexShader *shader); 61 virtual void setVertexShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count); 62 virtual void setViewport(const Viewport &viewport); 63 64 virtual bool stretchRect(sw::Surface *sourceSurface, const sw::SliceRect *sourceRect, sw::Surface *destSurface, const sw::SliceRect *destRect, bool filter); 65 virtual bool stretchCube(sw::Surface *sourceSurface, sw::Surface *destSurface); 66 virtual void finish(); 67 68 private: 69 sw::Context *const context; 70 71 bool bindResources(); 72 void bindShaderConstants(); 73 bool bindViewport(); // Also adjusts for scissoring 74 75 bool validRectangle(const sw::Rect *rect, sw::Surface *surface); 76 77 void copyBuffer(sw::byte *sourceBuffer, sw::byte *destBuffer, unsigned int width, unsigned int height, unsigned int sourcePitch, unsigned int destPitch, unsigned int bytes, bool flipX, bool flipY); 78 79 Viewport viewport; 80 sw::Rect scissorRect; 81 bool scissorEnable; 82 83 sw::PixelShader *pixelShader; 84 sw::VertexShader *vertexShader; 85 86 bool pixelShaderDirty; 87 unsigned int pixelShaderConstantsFDirty; 88 bool vertexShaderDirty; 89 unsigned int vertexShaderConstantsFDirty; 90 91 float pixelShaderConstantF[sw::FRAGMENT_UNIFORM_VECTORS][4]; 92 float vertexShaderConstantF[sw::VERTEX_UNIFORM_VECTORS][4]; 93 94 egl::Image *renderTarget[sw::RENDERTARGETS]; 95 egl::Image *depthBuffer; 96 egl::Image *stencilBuffer; 97 }; 98 } 99 100 #endif // gl_Device_hpp 101