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/Reactor.hpp"
19#include "Renderer/Surface.hpp"
20#include "Common/Thread.hpp"
21
22namespace sw
23{
24 using namespace rr;
25
26 class Surface;
27
28 struct BlitState
29 {
30 int width;
31 int height;
32 Format destFormat;
33 Format sourceFormat;
34 int destStride;
35 int sourceStride;
36 int cursorWidth;
37 int cursorHeight;
38 };
39
40 class [[clang::lto_visibility_public]] FrameBuffer
41 {
42 public:
43 FrameBuffer(int width, int height, bool fullscreen, bool topLeftOrigin);
44
45 virtual ~FrameBuffer() = 0;
46
47 virtual void flip(sw::Surface *source) = 0;
48 virtual void blit(sw::Surface *source, const Rect *sourceRect, const Rect *destRect) = 0;
49
50 virtual void *lock() = 0;
51 virtual void unlock() = 0;
52
53 static void setCursorImage(sw::Surface *cursor);
54 static void setCursorOrigin(int x0, int y0);
55 static void setCursorPosition(int x, int y);
56
57 static std::shared_ptr<Routine> copyRoutine(const BlitState &state);
58
59 protected:
60 void copy(sw::Surface *source);
61
62 bool windowed;
63
64 void *framebuffer; // Native window buffer.
65 int width;
66 int height;
67 int stride;
68 Format format;
69
70 private:
71 void copyLocked();
72
73 static void threadFunction(void *parameters);
74
75 void *renderbuffer; // Render target buffer.
76
77 struct Cursor
78 {
79 void *image;
80 int x;
81 int y;
82 int width;
83 int height;
84 int hotspotX;
85 int hotspotY;
86 int positionX;
87 int positionY;
88 };
89
90 static Cursor cursor;
91
92 void (*blitFunction)(void *dst, void *src, Cursor *cursor);
93 std::shared_ptr<Routine> blitRoutine;
94 BlitState blitState; // State of the current blitRoutine.
95 BlitState updateState; // State of the routine to be generated.
96
97 static void blend(const BlitState &state, const Pointer<Byte> &d, const Pointer<Byte> &s, const Pointer<Byte> &c);
98
99 Thread *blitThread;
100 Event syncEvent;
101 Event blitEvent;
102 volatile bool terminate;
103
104 static bool topLeftOrigin;
105 };
106}
107
108#endif // sw_FrameBuffer_hpp
109