1cb93a386Sopenharmony_ci// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2cb93a386Sopenharmony_ci//
3cb93a386Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4cb93a386Sopenharmony_ci// you may not use this file except in compliance with the License.
5cb93a386Sopenharmony_ci// You may obtain a copy of the License at
6cb93a386Sopenharmony_ci//
7cb93a386Sopenharmony_ci//    http://www.apache.org/licenses/LICENSE-2.0
8cb93a386Sopenharmony_ci//
9cb93a386Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10cb93a386Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11cb93a386Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12cb93a386Sopenharmony_ci// See the License for the specific language governing permissions and
13cb93a386Sopenharmony_ci// limitations under the License.
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_ci#ifndef sw_Blitter_hpp
16cb93a386Sopenharmony_ci#define sw_Blitter_hpp
17cb93a386Sopenharmony_ci
18cb93a386Sopenharmony_ci#include "Surface.hpp"
19cb93a386Sopenharmony_ci#include "RoutineCache.hpp"
20cb93a386Sopenharmony_ci#include "Reactor/Reactor.hpp"
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_ci#include <string.h>
23cb93a386Sopenharmony_ci
24cb93a386Sopenharmony_cinamespace sw
25cb93a386Sopenharmony_ci{
26cb93a386Sopenharmony_ci	class Blitter
27cb93a386Sopenharmony_ci	{
28cb93a386Sopenharmony_ci		struct Options
29cb93a386Sopenharmony_ci		{
30cb93a386Sopenharmony_ci			Options() = default;
31cb93a386Sopenharmony_ci			Options(bool filter, bool useStencil, bool convertSRGB)
32cb93a386Sopenharmony_ci				: writeMask(0xF), clearOperation(false), filter(filter), useStencil(useStencil), convertSRGB(convertSRGB), clampToEdge(false) {}
33cb93a386Sopenharmony_ci			Options(unsigned int writeMask)
34cb93a386Sopenharmony_ci				: writeMask(writeMask), clearOperation(true), filter(false), useStencil(false), convertSRGB(true), clampToEdge(false) {}
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_ci			union
37cb93a386Sopenharmony_ci			{
38cb93a386Sopenharmony_ci				struct
39cb93a386Sopenharmony_ci				{
40cb93a386Sopenharmony_ci					bool writeRed : 1;
41cb93a386Sopenharmony_ci					bool writeGreen : 1;
42cb93a386Sopenharmony_ci					bool writeBlue : 1;
43cb93a386Sopenharmony_ci					bool writeAlpha : 1;
44cb93a386Sopenharmony_ci				};
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_ci				unsigned char writeMask;
47cb93a386Sopenharmony_ci			};
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ci			bool clearOperation : 1;
50cb93a386Sopenharmony_ci			bool filter : 1;
51cb93a386Sopenharmony_ci			bool useStencil : 1;
52cb93a386Sopenharmony_ci			bool convertSRGB : 1;
53cb93a386Sopenharmony_ci			bool clampToEdge : 1;
54cb93a386Sopenharmony_ci		};
55cb93a386Sopenharmony_ci
56cb93a386Sopenharmony_ci		struct State : Memset<State>, Options
57cb93a386Sopenharmony_ci		{
58cb93a386Sopenharmony_ci			State() : Memset(this, 0) {}
59cb93a386Sopenharmony_ci			State(const Options &options) : Memset(this, 0), Options(options) {}
60cb93a386Sopenharmony_ci
61cb93a386Sopenharmony_ci			bool operator==(const State &state) const
62cb93a386Sopenharmony_ci			{
63cb93a386Sopenharmony_ci				static_assert(is_memcmparable<State>::value, "Cannot memcmp State");
64cb93a386Sopenharmony_ci				return memcmp(this, &state, sizeof(State)) == 0;
65cb93a386Sopenharmony_ci			}
66cb93a386Sopenharmony_ci
67cb93a386Sopenharmony_ci			Format sourceFormat;
68cb93a386Sopenharmony_ci			Format destFormat;
69cb93a386Sopenharmony_ci			int destSamples;
70cb93a386Sopenharmony_ci		};
71cb93a386Sopenharmony_ci
72cb93a386Sopenharmony_ci		struct BlitData
73cb93a386Sopenharmony_ci		{
74cb93a386Sopenharmony_ci			void *source;
75cb93a386Sopenharmony_ci			void *dest;
76cb93a386Sopenharmony_ci			int sPitchB;
77cb93a386Sopenharmony_ci			int dPitchB;
78cb93a386Sopenharmony_ci			int dSliceB;
79cb93a386Sopenharmony_ci
80cb93a386Sopenharmony_ci			float x0;
81cb93a386Sopenharmony_ci			float y0;
82cb93a386Sopenharmony_ci			float w;
83cb93a386Sopenharmony_ci			float h;
84cb93a386Sopenharmony_ci
85cb93a386Sopenharmony_ci			int y0d;
86cb93a386Sopenharmony_ci			int y1d;
87cb93a386Sopenharmony_ci			int x0d;
88cb93a386Sopenharmony_ci			int x1d;
89cb93a386Sopenharmony_ci
90cb93a386Sopenharmony_ci			int sWidth;
91cb93a386Sopenharmony_ci			int sHeight;
92cb93a386Sopenharmony_ci		};
93cb93a386Sopenharmony_ci
94cb93a386Sopenharmony_ci	public:
95cb93a386Sopenharmony_ci		Blitter();
96cb93a386Sopenharmony_ci		virtual ~Blitter();
97cb93a386Sopenharmony_ci
98cb93a386Sopenharmony_ci		void clear(void *pixel, sw::Format format, Surface *dest, const SliceRect &dRect, unsigned int rgbaMask);
99cb93a386Sopenharmony_ci		void blit(Surface *source, const SliceRectF &sRect, Surface *dest, const SliceRect &dRect, const Options &options);
100cb93a386Sopenharmony_ci		void blit3D(Surface *source, Surface *dest);
101cb93a386Sopenharmony_ci
102cb93a386Sopenharmony_ci	private:
103cb93a386Sopenharmony_ci		bool fastClear(void *pixel, sw::Format format, Surface *dest, const SliceRect &dRect, unsigned int rgbaMask);
104cb93a386Sopenharmony_ci
105cb93a386Sopenharmony_ci		bool read(Float4 &color, Pointer<Byte> element, const State &state);
106cb93a386Sopenharmony_ci		bool write(Float4 &color, Pointer<Byte> element, const State &state);
107cb93a386Sopenharmony_ci		bool read(Int4 &color, Pointer<Byte> element, const State &state);
108cb93a386Sopenharmony_ci		bool write(Int4 &color, Pointer<Byte> element, const State &state);
109cb93a386Sopenharmony_ci		static bool GetScale(float4& scale, Format format);
110cb93a386Sopenharmony_ci		static bool ApplyScaleAndClamp(Float4 &value, const State &state, bool preScaled = false);
111cb93a386Sopenharmony_ci		static Int ComputeOffset(Int &x, Int &y, Int &pitchB, int bytes, bool quadLayout);
112cb93a386Sopenharmony_ci		static Float4 LinearToSRGB(Float4 &color);
113cb93a386Sopenharmony_ci		static Float4 sRGBtoLinear(Float4 &color);
114cb93a386Sopenharmony_ci		bool blitReactor(Surface *source, const SliceRectF &sRect, Surface *dest, const SliceRect &dRect, const Options &options);
115cb93a386Sopenharmony_ci		std::shared_ptr<Routine> generate(const State &state);
116cb93a386Sopenharmony_ci
117cb93a386Sopenharmony_ci		RoutineCache<State> *blitCache;
118cb93a386Sopenharmony_ci		MutexLock criticalSection;
119cb93a386Sopenharmony_ci	};
120cb93a386Sopenharmony_ci}
121cb93a386Sopenharmony_ci
122cb93a386Sopenharmony_ci#endif   // sw_Blitter_hpp
123