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