Home | History | Annotate | Download | only in Device
      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_Blitter_hpp
     16 #define sw_Blitter_hpp
     17 
     18 #include "Surface.hpp"
     19 #include "RoutineCache.hpp"
     20 #include "Reactor/Reactor.hpp"
     21 
     22 #include <string.h>
     23 
     24 namespace sw
     25 {
     26 	class Blitter
     27 	{
     28 		struct Options
     29 		{
     30 			Options() = default;
     31 			Options(bool filter, bool useStencil, bool convertSRGB)
     32 				: writeMask(0xF), clearOperation(false), filter(filter), useStencil(useStencil), convertSRGB(convertSRGB), clampToEdge(false) {}
     33 			Options(unsigned int writeMask)
     34 				: writeMask(writeMask), clearOperation(true), filter(false), useStencil(false), convertSRGB(true), clampToEdge(false) {}
     35 
     36 			union
     37 			{
     38 				struct
     39 				{
     40 					bool writeRed : 1;
     41 					bool writeGreen : 1;
     42 					bool writeBlue : 1;
     43 					bool writeAlpha : 1;
     44 				};
     45 
     46 				unsigned char writeMask;
     47 			};
     48 
     49 			bool clearOperation : 1;
     50 			bool filter : 1;
     51 			bool useStencil : 1;
     52 			bool convertSRGB : 1;
     53 			bool clampToEdge : 1;
     54 		};
     55 
     56 		struct State : Options
     57 		{
     58 			State() = default;
     59 			State(const Options &options) : Options(options) {}
     60 
     61 			bool operator==(const State &state) const
     62 			{
     63 				return memcmp(this, &state, sizeof(State)) == 0;
     64 			}
     65 
     66 			VkFormat sourceFormat;
     67 			VkFormat destFormat;
     68 			int destSamples;
     69 		};
     70 
     71 		struct BlitData
     72 		{
     73 			void *source;
     74 			void *dest;
     75 			int sPitchB;
     76 			int dPitchB;
     77 			int dSliceB;
     78 
     79 			float x0;
     80 			float y0;
     81 			float w;
     82 			float h;
     83 
     84 			int y0d;
     85 			int y1d;
     86 			int x0d;
     87 			int x1d;
     88 
     89 			int sWidth;
     90 			int sHeight;
     91 		};
     92 
     93 	public:
     94 		Blitter();
     95 		virtual ~Blitter();
     96 
     97 		void clear(void *pixel, VkFormat format, Surface *dest, const SliceRect &dRect, unsigned int rgbaMask);
     98 		void blit(Surface *source, const SliceRectF &sRect, Surface *dest, const SliceRect &dRect, const Options &options);
     99 		void blit3D(Surface *source, Surface *dest);
    100 
    101 	private:
    102 		bool fastClear(void *pixel, VkFormat format, Surface *dest, const SliceRect &dRect, unsigned int rgbaMask);
    103 
    104 		bool read(Float4 &color, Pointer<Byte> element, const State &state);
    105 		bool write(Float4 &color, Pointer<Byte> element, const State &state);
    106 		bool read(Int4 &color, Pointer<Byte> element, const State &state);
    107 		bool write(Int4 &color, Pointer<Byte> element, const State &state);
    108 		static bool GetScale(float4& scale, VkFormat format);
    109 		static bool ApplyScaleAndClamp(Float4 &value, const State &state, bool preScaled = false);
    110 		static Int ComputeOffset(Int &x, Int &y, Int &pitchB, int bytes, bool quadLayout);
    111 		static Float4 LinearToSRGB(Float4 &color);
    112 		static Float4 sRGBtoLinear(Float4 &color);
    113 		bool blitReactor(Surface *source, const SliceRectF &sRect, Surface *dest, const SliceRect &dRect, const Options &options);
    114 		Routine *generate(const State &state);
    115 
    116 		RoutineCache<State> *blitCache;
    117 		MutexLock criticalSection;
    118 	};
    119 }
    120 
    121 #endif   // sw_Blitter_hpp
    122