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 sw_FrameBuffer_hpp 16 #define sw_FrameBuffer_hpp 17 18 #include "Reactor/Nucleus.hpp" 19 #include "Renderer/Surface.hpp" 20 #include "Common/Thread.hpp" 21 22 namespace sw 23 { 24 class Surface; 25 26 struct BlitState 27 { 28 int width; 29 int height; 30 Format destFormat; 31 Format sourceFormat; 32 int stride; 33 int cursorWidth; 34 int cursorHeight; 35 }; 36 37 class FrameBuffer 38 { 39 public: 40 FrameBuffer(int width, int height, bool fullscreen, bool topLeftOrigin); 41 42 virtual ~FrameBuffer(); 43 44 int getWidth() const; 45 int getHeight() const; 46 int getStride() const; 47 48 virtual void flip(void *source, Format sourceFormat, size_t sourceStride) = 0; 49 virtual void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) = 0; 50 51 virtual void *lock() = 0; 52 virtual void unlock() = 0; 53 54 static void setCursorImage(sw::Surface *cursor); 55 static void setCursorOrigin(int x0, int y0); 56 static void setCursorPosition(int x, int y); 57 58 static Routine *copyRoutine(const BlitState &state); 59 60 protected: 61 void copy(void *source, Format format, size_t stride); 62 int width; 63 int height; 64 Format sourceFormat; 65 Format destFormat; 66 int stride; 67 bool windowed; 68 69 void *locked; // Video memory back buffer 70 71 private: 72 void copyLocked(); 73 74 static void threadFunction(void *parameters); 75 76 void *target; // Render target buffer 77 78 void (*blitFunction)(void *dst, void *src); 79 Routine *blitRoutine; 80 BlitState blitState; 81 82 static void blend(const BlitState &state, const Pointer<Byte> &d, const Pointer<Byte> &s, const Pointer<Byte> &c); 83 84 static void *cursor; 85 static int cursorWidth; 86 static int cursorHeight; 87 static int cursorHotspotX; 88 static int cursorHotspotY; 89 static int cursorPositionX; 90 static int cursorPositionY; 91 static int cursorX; 92 static int cursorY; 93 94 Thread *blitThread; 95 Event syncEvent; 96 Event blitEvent; 97 volatile bool terminate; 98 99 static bool topLeftOrigin; 100 }; 101 } 102 103 #endif // sw_FrameBuffer_hpp 104