Update SwiftShader to April code dump. April code dump from Transgaming. Adds new shader compiler.
diff --git a/src/Renderer/Blitter.cpp b/src/Renderer/Blitter.cpp index bdd282c..2d709ca 100644 --- a/src/Renderer/Blitter.cpp +++ b/src/Renderer/Blitter.cpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -12,7 +12,7 @@ #include "Blitter.hpp" #include "Common/Debug.hpp" -#include "Reactor/Shell.hpp" +#include "Reactor/Reactor.hpp" namespace sw { @@ -33,19 +33,19 @@ return; } - source->lockInternal(sRect.left, sRect.top, 0, sw::LOCK_READONLY, sw::PUBLIC); - dest->lockInternal(dRect.left, dRect.top, 0, sw::LOCK_WRITEONLY, sw::PUBLIC); + source->lockInternal(sRect.x0, sRect.y0, 0, sw::LOCK_READONLY, sw::PUBLIC); + dest->lockInternal(dRect.x0, dRect.y0, 0, sw::LOCK_WRITEONLY, sw::PUBLIC); - float w = 1.0f / (dRect.right - dRect.left) * (sRect.right - sRect.left); - float h = 1.0f / (dRect.bottom - dRect.top) * (sRect.bottom - sRect.top); + float w = 1.0f / (dRect.x1 - dRect.x0) * (sRect.x1 - sRect.x0); + float h = 1.0f / (dRect.y1 - dRect.y0) * (sRect.y1 - sRect.y0); - float y = (float)sRect.top + 0.5f * h; + float y = (float)sRect.y0 + 0.5f * h; - for(int j = dRect.top; j < dRect.bottom; j++) + for(int j = dRect.y0; j < dRect.y1; j++) { - float x = (float)sRect.left + 0.5f * w; + float x = (float)sRect.x0 + 0.5f * w; - for(int i = dRect.left; i < dRect.right; i++) + for(int i = dRect.x0; i < dRect.x1; i++) { sw::Color<float> color; @@ -137,21 +137,21 @@ Float w = *Pointer<Float>(blit + OFFSET(BlitData,w)); Float h = *Pointer<Float>(blit + OFFSET(BlitData,h)); - Int top = *Pointer<Int>(blit + OFFSET(BlitData,top)); - Int bottom = *Pointer<Int>(blit + OFFSET(BlitData,bottom)); - Int left = *Pointer<Int>(blit + OFFSET(BlitData,left)); - Int right = *Pointer<Int>(blit + OFFSET(BlitData,right)); + Int x0d = *Pointer<Int>(blit + OFFSET(BlitData,x0d)); + Int x1d = *Pointer<Int>(blit + OFFSET(BlitData,x1d)); + Int y0d = *Pointer<Int>(blit + OFFSET(BlitData,y0d)); + Int y1d = *Pointer<Int>(blit + OFFSET(BlitData,y1d)); - Int width = *Pointer<Int>(blit + OFFSET(BlitData,width)); - Int height = *Pointer<Int>(blit + OFFSET(BlitData,height)); + Int sWidth = *Pointer<Int>(blit + OFFSET(BlitData,sWidth)); + Int sHeight = *Pointer<Int>(blit + OFFSET(BlitData,sHeight)); Float y = y0; - For(Int j = top, j < bottom, j++) + For(Int j = y0d, j < y1d, j++) { Float x = x0; - For(Int i = left, i < right, i++) + For(Int i = x0d, i < x1d, i++) { Float4 color; @@ -172,14 +172,11 @@ Float x0 = x - Float(0.5f); Float y0 = y - Float(0.5f); - Int X0 = Int(x0); - Int Y0 = Int(y0); - - X0 = IfThenElse(X0 < 0, Int(0), X0); - Y0 = IfThenElse(Y0 < 0, Int(0), Y0); - - Int X1 = IfThenElse(X0 + 1 >= width, X0, X0 + 1); - Int Y1 = IfThenElse(Y0 + 1 >= height, Y0, Y0 + 1); + Int X0 = Max(Int(x0), 0); + Int Y0 = Max(Int(y0), 0); + + Int X1 = IfThenElse(X0 + 1 >= sWidth, X0, X0 + 1); + Int Y1 = IfThenElse(Y0 + 1 >= sHeight, Y0, Y0 + 1); Pointer<Byte> s00 = source + Y0 * sPitchB + X0 * Surface::bytes(state.sourceFormat); Pointer<Byte> s01 = source + Y0 * sPitchB + X1 * Surface::bytes(state.sourceFormat); @@ -322,18 +319,18 @@ data.sPitchB = source->getInternalPitchB(); data.dPitchB = dest->getInternalPitchB(); - data.w = 1.0f / (dRect.right - dRect.left) * (sRect.right - sRect.left); - data.h = 1.0f / (dRect.bottom - dRect.top) * (sRect.bottom - sRect.top); - data.x0 = (float)sRect.left + 0.5f * data.w; - data.y0 = (float)sRect.top + 0.5f * data.h; + data.w = 1.0f / (dRect.x1 - dRect.x0) * (sRect.x1 - sRect.x0); + data.h = 1.0f / (dRect.y1 - dRect.y0) * (sRect.y1 - sRect.y0); + data.x0 = (float)sRect.x0 + 0.5f * data.w; + data.y0 = (float)sRect.y0 + 0.5f * data.h; - data.top = dRect.top; - data.bottom = dRect.bottom; - data.left = dRect.left; - data.right = dRect.right; + data.x0d = dRect.x0; + data.x1d = dRect.x1; + data.y0d = dRect.y0; + data.y1d = dRect.y1; - data.width = source->getInternalWidth(); - data.height = source->getInternalHeight(); + data.sWidth = source->getInternalWidth(); + data.sHeight = source->getInternalHeight(); blitFunction(&data);
diff --git a/src/Renderer/Blitter.hpp b/src/Renderer/Blitter.hpp index 6eda305..8d9554d 100644 --- a/src/Renderer/Blitter.hpp +++ b/src/Renderer/Blitter.hpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -57,13 +57,13 @@ float w; float h; - int top; - int bottom; - int left; - int right; + int y0d; + int y1d; + int x0d; + int x1d; - int width; - int height; + int sWidth; + int sHeight; }; LRUCache<BlitState, Routine> *blitCache;
diff --git a/src/Renderer/Clipper.cpp b/src/Renderer/Clipper.cpp index 2c6c158..38918c9 100644 --- a/src/Renderer/Clipper.cpp +++ b/src/Renderer/Clipper.cpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -167,8 +167,8 @@ { int j = i == polygon.n - 1 ? 0 : i + 1; - float di = V[i]->w + (V[i]->x + data.offX[0] * V[i]->w); - float dj = V[j]->w + (V[j]->x + data.offX[0] * V[j]->w); + float di = V[i]->w + (V[i]->x + data.halfPixelX[0] * V[i]->w); + float dj = V[j]->w + (V[j]->x + data.halfPixelX[0] * V[j]->w); if(di >= 0) { @@ -209,8 +209,8 @@ { int j = i == polygon.n - 1 ? 0 : i + 1; - float di = V[i]->w - (V[i]->x + data.offX[0] * V[i]->w); - float dj = V[j]->w - (V[j]->x + data.offX[0] * V[j]->w); + float di = V[i]->w - (V[i]->x + data.halfPixelX[0] * V[i]->w); + float dj = V[j]->w - (V[j]->x + data.halfPixelX[0] * V[j]->w); if(di >= 0) { @@ -251,8 +251,8 @@ { int j = i == polygon.n - 1 ? 0 : i + 1; - float di = V[i]->w - (V[i]->y + data.offY[0] * V[i]->w); - float dj = V[j]->w - (V[j]->y + data.offY[0] * V[j]->w); + float di = V[i]->w - (V[i]->y + data.halfPixelY[0] * V[i]->w); + float dj = V[j]->w - (V[j]->y + data.halfPixelY[0] * V[j]->w); if(di >= 0) { @@ -293,8 +293,8 @@ { int j = i == polygon.n - 1 ? 0 : i + 1; - float di = V[i]->w + (V[i]->y + data.offY[0] * V[i]->w); - float dj = V[j]->w + (V[j]->y + data.offY[0] * V[j]->w); + float di = V[i]->w + (V[i]->y + data.halfPixelY[0] * V[i]->w); + float dj = V[j]->w + (V[j]->y + data.halfPixelY[0] * V[j]->w); if(di >= 0) {
diff --git a/src/Renderer/Clipper.hpp b/src/Renderer/Clipper.hpp index fca7b0c..de017b8 100644 --- a/src/Renderer/Clipper.hpp +++ b/src/Renderer/Clipper.hpp
@@ -1,66 +1,66 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Clipper_hpp -#define sw_Clipper_hpp - -#include "Plane.hpp" -#include "Common/Types.hpp" - -namespace sw -{ - struct Polygon; - struct DrawCall; - struct DrawData; - - class Clipper - { - public: - enum ClipFlags - { - CLIP_RIGHT = 1 << 0, - CLIP_TOP = 1 << 1, - CLIP_FAR = 1 << 2, - CLIP_LEFT = 1 << 3, - CLIP_BOTTOM = 1 << 4, - CLIP_NEAR = 1 << 5, - - CLIP_FINITE = 1 << 7, - - // User-defined clipping planes - CLIP_PLANE0 = 1 << 8, - CLIP_PLANE1 = 1 << 9, - CLIP_PLANE2 = 1 << 10, - CLIP_PLANE3 = 1 << 11, - CLIP_PLANE4 = 1 << 12, - CLIP_PLANE5 = 1 << 13 - }; - - Clipper(); - - ~Clipper(); - - bool clip(Polygon &polygon, int clipFlagsOr, const DrawCall &draw); - - private: - void clipNear(Polygon &polygon); - void clipFar(Polygon &polygon); - void clipLeft(Polygon &polygon, const DrawData &data); - void clipRight(Polygon &polygon, const DrawData &data); - void clipTop(Polygon &polygon, const DrawData &data); - void clipBottom(Polygon &polygon, const DrawData &data); - void clipPlane(Polygon &polygon, const Plane &plane); - - void clipEdge(float4 &Vo, const float4 &Vi, const float4 &Vj, float di, float dj) const; - }; -} - -#endif // sw_Clipper_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2011 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef sw_Clipper_hpp +#define sw_Clipper_hpp + +#include "Plane.hpp" +#include "Common/Types.hpp" + +namespace sw +{ + struct Polygon; + struct DrawCall; + struct DrawData; + + class Clipper + { + public: + enum ClipFlags + { + CLIP_RIGHT = 1 << 0, + CLIP_TOP = 1 << 1, + CLIP_FAR = 1 << 2, + CLIP_LEFT = 1 << 3, + CLIP_BOTTOM = 1 << 4, + CLIP_NEAR = 1 << 5, + + CLIP_FINITE = 1 << 7, + + // User-defined clipping planes + CLIP_PLANE0 = 1 << 8, + CLIP_PLANE1 = 1 << 9, + CLIP_PLANE2 = 1 << 10, + CLIP_PLANE3 = 1 << 11, + CLIP_PLANE4 = 1 << 12, + CLIP_PLANE5 = 1 << 13 + }; + + Clipper(); + + ~Clipper(); + + bool clip(Polygon &polygon, int clipFlagsOr, const DrawCall &draw); + + private: + void clipNear(Polygon &polygon); + void clipFar(Polygon &polygon); + void clipLeft(Polygon &polygon, const DrawData &data); + void clipRight(Polygon &polygon, const DrawData &data); + void clipTop(Polygon &polygon, const DrawData &data); + void clipBottom(Polygon &polygon, const DrawData &data); + void clipPlane(Polygon &polygon, const Plane &plane); + + void clipEdge(float4 &Vo, const float4 &Vi, const float4 &Vj, float di, float dj) const; + }; +} + +#endif // sw_Clipper_hpp
diff --git a/src/Renderer/Color.hpp b/src/Renderer/Color.hpp index 786e897..febfb08 100644 --- a/src/Renderer/Color.hpp +++ b/src/Renderer/Color.hpp
@@ -1,443 +1,443 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Color_hpp -#define sw_Color_hpp - -#include "Common/Types.hpp" -#include "Common/Math.hpp" - -namespace sw -{ - template<class T> - struct Color - { - Color(); - - Color(const Color<byte> &c); - Color(const Color<short> &c); - Color(const Color<float> &c); - - Color(int c); - Color(unsigned short c); - Color(unsigned long c); - Color(unsigned int c); - - Color(T r, T g, T b, T a = 1); - - operator unsigned int() const; - - T &operator[](int i); - const T &operator[](int i) const; - - Color operator+() const; - Color operator-() const; - - Color& operator=(const Color& c); - - Color &operator+=(const Color &c); - Color &operator*=(float l); - - static Color gradient(const Color &c1, const Color &c2, float d); - static Color shade(const Color &c1, const Color &c2, float d); - - template<class T> - friend Color operator+(const Color &c1, const Color &c2); - template<class T> - friend Color operator-(const Color &c1, const Color &c2); - - template<class T> - friend Color operator*(float l, const Color &c); - template<class T> - friend Color operator*(const Color &c1, const Color &c2); - template<class T> - friend Color operator/(const Color &c, float l); - - T r; - T g; - T b; - T a; - }; -} - -#include "Common/Math.hpp" - -namespace sw -{ - template<class T> - inline Color<T>::Color() - { - } - - inline Color<byte>::Color(const Color<byte> &c) - { - r = c.r; - g = c.g; - b = c.b; - a = c.a; - } - - inline Color<byte>::Color(const Color<short> &c) - { - r = clamp(c.r >> 4, 0, 255); - g = clamp(c.g >> 4, 0, 255); - b = clamp(c.b >> 4, 0, 255); - a = clamp(c.a >> 4, 0, 255); - } - - inline Color<byte>::Color(const Color<float> &c) - { - r = ifloor(clamp(c.r * 256.0f, 0.0f, 255.0f)); - g = ifloor(clamp(c.g * 256.0f, 0.0f, 255.0f)); - b = ifloor(clamp(c.b * 256.0f, 0.0f, 255.0f)); - a = ifloor(clamp(c.a * 256.0f, 0.0f, 255.0f)); - } - - inline Color<short>::Color(const Color<short> &c) - { - r = c.r; - g = c.g; - b = c.b; - a = c.a; - } - - inline Color<short>::Color(const Color<byte> &c) - { - r = c.r << 4; - g = c.g << 4; - b = c.b << 4; - a = c.a << 4; - } - - inline Color<float>::Color(const Color<float> &c) - { - r = c.r; - g = c.g; - b = c.b; - a = c.a; - } - - inline Color<short>::Color(const Color<float> &c) - { - r = iround(clamp(c.r * 4095.0f, -4096.0f, 4095.0f)); - g = iround(clamp(c.g * 4095.0f, -4096.0f, 4095.0f)); - b = iround(clamp(c.b * 4095.0f, -4096.0f, 4095.0f)); - a = iround(clamp(c.a * 4095.0f, -4096.0f, 4095.0f)); - } - - inline Color<float>::Color(const Color<byte> &c) - { - r = c.r / 255.0f; - g = c.g / 255.0f; - b = c.b / 255.0f; - a = c.a / 255.0f; - } - - inline Color<float>::Color(const Color<short> &c) - { - r = c.r / 4095.0f; - g = c.g / 4095.0f; - b = c.b / 4095.0f; - a = c.a / 4095.0f; - } - - inline Color<float>::Color(unsigned short c) - { - r = (float)(c & 0xF800) / (float)0xF800; - g = (float)(c & 0x07E0) / (float)0x07E0; - b = (float)(c & 0x001F) / (float)0x001F; - a = 1; - } - - inline Color<short>::Color(unsigned short c) - { - // 4.12 fixed-point format - r = ((c & 0xF800) >> 4) + ((c & 0xF800) >> 9) + ((c & 0xF800) >> 14); - g = ((c & 0x07E0) << 1) + ((c & 0x07E0) >> 5); - b = ((c & 0x001F) << 7) + ((c & 0x001F) << 2) + ((c & 0x001F) >> 3); - a = 0x1000; - } - - inline Color<byte>::Color(unsigned short c) - { - r = (byte)(((c & 0xF800) >> 8) + ((c & 0xE000) >> 13)); - g = (byte)(((c & 0x07E0) >> 3) + ((c & 0x0600) >> 9)); - b = (byte)(((c & 0x001F) << 3) + ((c & 0x001C) >> 2)); - a = 0xFF; - } - - inline Color<float>::Color(int c) - { - const float d = 1.0f / 255.0f; - - r = (float)((c & 0x00FF0000) >> 16) * d; - g = (float)((c & 0x0000FF00) >> 8) * d; - b = (float)((c & 0x000000FF) >> 0) * d; - a = (float)((c & 0xFF000000) >> 24) * d; - } - - inline Color<short>::Color(int c) - { - // 4.12 fixed-point format - r = (short)((c & 0x00FF0000) >> 12); - g = (short)((c & 0x0000FF00) >> 4); - b = (short)((c & 0x000000FF) << 4); - a = (short)((c & 0xFF000000) >> 20); - } - - inline Color<byte>::Color(int c) - { - r = (byte)((c & 0x00FF0000) >> 16); - g = (byte)((c & 0x0000FF00) >> 8); - b = (byte)((c & 0x000000FF) >> 0); - a = (byte)((c & 0xFF000000) >> 24); - } - - inline Color<float>::Color(unsigned int c) - { - const float d = 1.0f / 255.0f; - - r = (float)((c & 0x00FF0000) >> 16) * d; - g = (float)((c & 0x0000FF00) >> 8) * d; - b = (float)((c & 0x000000FF) >> 0) * d; - a = (float)((c & 0xFF000000) >> 24) * d; - } - - inline Color<short>::Color(unsigned int c) - { - // 4.12 fixed-point format - r = (short)((c & 0x00FF0000) >> 12); - g = (short)((c & 0x0000FF00) >> 4); - b = (short)((c & 0x000000FF) << 4); - a = (short)((c & 0xFF000000) >> 20); - } - - inline Color<byte>::Color(unsigned int c) - { - r = (byte)((c & 0x00FF0000) >> 16); - g = (byte)((c & 0x0000FF00) >> 8); - b = (byte)((c & 0x000000FF) >> 0); - a = (byte)((c & 0xFF000000) >> 24); - } - - inline Color<float>::Color(unsigned long c) - { - const float d = 1.0f / 255.0f; - - r = (float)((c & 0x00FF0000) >> 16) * d; - g = (float)((c & 0x0000FF00) >> 8) * d; - b = (float)((c & 0x000000FF) >> 0) * d; - a = (float)((c & 0xFF000000) >> 24) * d; - } - - inline Color<short>::Color(unsigned long c) - { - // 4.12 fixed-point format - r = (short)((c & 0x00FF0000) >> 12); - g = (short)((c & 0x0000FF00) >> 4); - b = (short)((c & 0x000000FF) << 4); - a = (short)((c & 0xFF000000) >> 20); - } - - inline Color<byte>::Color(unsigned long c) - { - r = (byte)((c & 0x00FF0000) >> 16); - g = (byte)((c & 0x0000FF00) >> 8); - b = (byte)((c & 0x000000FF) >> 0); - a = (byte)((c & 0xFF000000) >> 24); - } - - template<class T> - inline Color<T>::Color(T r_, T g_, T b_, T a_) - { - r = r_; - g = g_; - b = b_; - a = a_; - } - - inline Color<float>::operator unsigned int() const - { - return ((unsigned int)min(b * 255.0f, 255.0f) << 0) | - ((unsigned int)min(g * 255.0f, 255.0f) << 8) | - ((unsigned int)min(r * 255.0f, 255.0f) << 16) | - ((unsigned int)min(a * 255.0f, 255.0f) << 24); - } - - inline Color<short>::operator unsigned int() const - { - return ((unsigned int)min(b >> 4, 255) << 0) | - ((unsigned int)min(g >> 4, 255) << 8) | - ((unsigned int)min(r >> 4, 255) << 16) | - ((unsigned int)min(a >> 4, 255) << 24); - } - - inline Color<byte>::operator unsigned int() const - { - return (b << 0) + - (g << 8) + - (r << 16) + - (a << 24); - } - - template<class T> - inline T &Color<T>::operator[](int i) - { - return (&r)[i]; - } - - template<class T> - inline const T &Color<T>::operator[](int i) const - { - return (&r)[i]; - } - - template<class T> - inline Color<T> Color<T>::operator+() const - { - return *this; - } - - template<class T> - inline Color<T> Color<T>::operator-() const - { - return Color(-r, -g, -b, -a); - } - - template<class T> - inline Color<T> &Color<T>::operator=(const Color& c) - { - r = c.r; - g = c.g; - b = c.b; - a = c.a; - - return *this; - } - - template<class T> - inline Color<T> &Color<T>::operator+=(const Color &c) - { - r += c.r; - g += c.g; - b += c.b; - a += c.a; - - return *this; - } - - template<class T> - inline Color<T> &Color<T>::operator*=(float l) - { - *this = l * *this; - - return *this; - } - - template<class T> - inline Color<T> operator+(const Color<T> &c1, const Color<T> &c2) - { - return Color<T>(c1.r + c2.r, - c1.g + c2.g, - c1.b + c2.b, - c1.a + c2.a); - } - - template<class T> - inline Color<T> operator-(const Color<T> &c1, const Color<T> &c2) - { - return Color<T>(c1.r - c2.r, - c1.g - c2.g, - c1.b - c2.b, - c1.a - c2.a); - } - - template<class T> - inline Color<T> operator*(float l, const Color<T> &c) - { - T r = (T)(l * c.r); - T g = (T)(l * c.g); - T b = (T)(l * c.b); - T a = (T)(l * c.a); - - return Color<T>(r, g, b, a); - } - - template<class T> - inline Color<T> operator*(const Color<T> &c1, const Color<T> &c2) - { - T r = c1.r * c2.r; - T g = c1.g * c2.g; - T b = c1.b * c2.b; - T a = c1.a * c2.a; - - return Color<T>(r, g, b, a); - } - - inline Color<short> operator*(const Color<short> &c1, const Color<short> &c2) - { - short r = c1.r * c2.r >> 12; - short g = c1.g * c2.g >> 12; - short b = c1.b * c2.b >> 12; - short a = c1.a * c2.a >> 12; - - return Color<short>(r, g, b, a); - } - - inline Color<byte> operator*(const Color<byte> &c1, const Color<byte> &c2) - { - byte r = c1.r * c2.r >> 8; - byte g = c1.g * c2.g >> 8; - byte b = c1.b * c2.b >> 8; - byte a = c1.a * c2.a >> 8; - - return Color<byte>(r, g, b, a); - } - - template<class T> - inline Color<T> operator/(const Color<T> &c, float l) - { - l = 1.0f / l; - - T r = (T)(l * c.r); - T g = (T)(l * c.g); - T b = (T)(l * c.b); - T a = (T)(l * c.a); - - return Color<T>(r, g, b, a); - } - - template<class T> - inline Color<T> Color<T>::gradient(const Color<T> &c1, const Color<T> &c2, float d) - { - d = 1.0f / d; - - T r = (c2.r - c1.r) * d; - T g = (c2.g - c1.g) * d; - T b = (c2.b - c1.b) * d; - T a = (c2.a - c1.a) * d; - - return Color<T>(r, g, b, a); - } - - template<class T> - inline Color<T> Color<T>::shade(const Color<T> &c1, const Color<T> &c2, float d) - { - T r = c1.r + (T)(d * (c2.r - c1.r)); - T g = c1.g + (T)(d * (c2.g - c1.g)); - T b = c1.b + (T)(d * (c2.b - c1.b)); - T a = c1.a + (T)(d * (c2.a - c1.a)); - - return Color<T>(r, g, b, a); - } -} - -#endif // sw_Color_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2011 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef sw_Color_hpp +#define sw_Color_hpp + +#include "Common/Types.hpp" +#include "Common/Math.hpp" + +namespace sw +{ + template<class T> + struct Color + { + Color(); + + Color(const Color<byte> &c); + Color(const Color<short> &c); + Color(const Color<float> &c); + + Color(int c); + Color(unsigned short c); + Color(unsigned long c); + Color(unsigned int c); + + Color(T r, T g, T b, T a = 1); + + operator unsigned int() const; + + T &operator[](int i); + const T &operator[](int i) const; + + Color operator+() const; + Color operator-() const; + + Color& operator=(const Color& c); + + Color &operator+=(const Color &c); + Color &operator*=(float l); + + static Color gradient(const Color &c1, const Color &c2, float d); + static Color shade(const Color &c1, const Color &c2, float d); + + template<class T> + friend Color operator+(const Color &c1, const Color &c2); + template<class T> + friend Color operator-(const Color &c1, const Color &c2); + + template<class T> + friend Color operator*(float l, const Color &c); + template<class T> + friend Color operator*(const Color &c1, const Color &c2); + template<class T> + friend Color operator/(const Color &c, float l); + + T r; + T g; + T b; + T a; + }; +} + +#include "Common/Math.hpp" + +namespace sw +{ + template<class T> + inline Color<T>::Color() + { + } + + inline Color<byte>::Color(const Color<byte> &c) + { + r = c.r; + g = c.g; + b = c.b; + a = c.a; + } + + inline Color<byte>::Color(const Color<short> &c) + { + r = clamp(c.r >> 4, 0, 255); + g = clamp(c.g >> 4, 0, 255); + b = clamp(c.b >> 4, 0, 255); + a = clamp(c.a >> 4, 0, 255); + } + + inline Color<byte>::Color(const Color<float> &c) + { + r = ifloor(clamp(c.r * 256.0f, 0.0f, 255.0f)); + g = ifloor(clamp(c.g * 256.0f, 0.0f, 255.0f)); + b = ifloor(clamp(c.b * 256.0f, 0.0f, 255.0f)); + a = ifloor(clamp(c.a * 256.0f, 0.0f, 255.0f)); + } + + inline Color<short>::Color(const Color<short> &c) + { + r = c.r; + g = c.g; + b = c.b; + a = c.a; + } + + inline Color<short>::Color(const Color<byte> &c) + { + r = c.r << 4; + g = c.g << 4; + b = c.b << 4; + a = c.a << 4; + } + + inline Color<float>::Color(const Color<float> &c) + { + r = c.r; + g = c.g; + b = c.b; + a = c.a; + } + + inline Color<short>::Color(const Color<float> &c) + { + r = iround(clamp(c.r * 4095.0f, -4096.0f, 4095.0f)); + g = iround(clamp(c.g * 4095.0f, -4096.0f, 4095.0f)); + b = iround(clamp(c.b * 4095.0f, -4096.0f, 4095.0f)); + a = iround(clamp(c.a * 4095.0f, -4096.0f, 4095.0f)); + } + + inline Color<float>::Color(const Color<byte> &c) + { + r = c.r / 255.0f; + g = c.g / 255.0f; + b = c.b / 255.0f; + a = c.a / 255.0f; + } + + inline Color<float>::Color(const Color<short> &c) + { + r = c.r / 4095.0f; + g = c.g / 4095.0f; + b = c.b / 4095.0f; + a = c.a / 4095.0f; + } + + inline Color<float>::Color(unsigned short c) + { + r = (float)(c & 0xF800) / (float)0xF800; + g = (float)(c & 0x07E0) / (float)0x07E0; + b = (float)(c & 0x001F) / (float)0x001F; + a = 1; + } + + inline Color<short>::Color(unsigned short c) + { + // 4.12 fixed-point format + r = ((c & 0xF800) >> 4) + ((c & 0xF800) >> 9) + ((c & 0xF800) >> 14); + g = ((c & 0x07E0) << 1) + ((c & 0x07E0) >> 5); + b = ((c & 0x001F) << 7) + ((c & 0x001F) << 2) + ((c & 0x001F) >> 3); + a = 0x1000; + } + + inline Color<byte>::Color(unsigned short c) + { + r = (byte)(((c & 0xF800) >> 8) + ((c & 0xE000) >> 13)); + g = (byte)(((c & 0x07E0) >> 3) + ((c & 0x0600) >> 9)); + b = (byte)(((c & 0x001F) << 3) + ((c & 0x001C) >> 2)); + a = 0xFF; + } + + inline Color<float>::Color(int c) + { + const float d = 1.0f / 255.0f; + + r = (float)((c & 0x00FF0000) >> 16) * d; + g = (float)((c & 0x0000FF00) >> 8) * d; + b = (float)((c & 0x000000FF) >> 0) * d; + a = (float)((c & 0xFF000000) >> 24) * d; + } + + inline Color<short>::Color(int c) + { + // 4.12 fixed-point format + r = (short)((c & 0x00FF0000) >> 12); + g = (short)((c & 0x0000FF00) >> 4); + b = (short)((c & 0x000000FF) << 4); + a = (short)((c & 0xFF000000) >> 20); + } + + inline Color<byte>::Color(int c) + { + r = (byte)((c & 0x00FF0000) >> 16); + g = (byte)((c & 0x0000FF00) >> 8); + b = (byte)((c & 0x000000FF) >> 0); + a = (byte)((c & 0xFF000000) >> 24); + } + + inline Color<float>::Color(unsigned int c) + { + const float d = 1.0f / 255.0f; + + r = (float)((c & 0x00FF0000) >> 16) * d; + g = (float)((c & 0x0000FF00) >> 8) * d; + b = (float)((c & 0x000000FF) >> 0) * d; + a = (float)((c & 0xFF000000) >> 24) * d; + } + + inline Color<short>::Color(unsigned int c) + { + // 4.12 fixed-point format + r = (short)((c & 0x00FF0000) >> 12); + g = (short)((c & 0x0000FF00) >> 4); + b = (short)((c & 0x000000FF) << 4); + a = (short)((c & 0xFF000000) >> 20); + } + + inline Color<byte>::Color(unsigned int c) + { + r = (byte)((c & 0x00FF0000) >> 16); + g = (byte)((c & 0x0000FF00) >> 8); + b = (byte)((c & 0x000000FF) >> 0); + a = (byte)((c & 0xFF000000) >> 24); + } + + inline Color<float>::Color(unsigned long c) + { + const float d = 1.0f / 255.0f; + + r = (float)((c & 0x00FF0000) >> 16) * d; + g = (float)((c & 0x0000FF00) >> 8) * d; + b = (float)((c & 0x000000FF) >> 0) * d; + a = (float)((c & 0xFF000000) >> 24) * d; + } + + inline Color<short>::Color(unsigned long c) + { + // 4.12 fixed-point format + r = (short)((c & 0x00FF0000) >> 12); + g = (short)((c & 0x0000FF00) >> 4); + b = (short)((c & 0x000000FF) << 4); + a = (short)((c & 0xFF000000) >> 20); + } + + inline Color<byte>::Color(unsigned long c) + { + r = (byte)((c & 0x00FF0000) >> 16); + g = (byte)((c & 0x0000FF00) >> 8); + b = (byte)((c & 0x000000FF) >> 0); + a = (byte)((c & 0xFF000000) >> 24); + } + + template<class T> + inline Color<T>::Color(T r_, T g_, T b_, T a_) + { + r = r_; + g = g_; + b = b_; + a = a_; + } + + inline Color<float>::operator unsigned int() const + { + return ((unsigned int)min(b * 255.0f, 255.0f) << 0) | + ((unsigned int)min(g * 255.0f, 255.0f) << 8) | + ((unsigned int)min(r * 255.0f, 255.0f) << 16) | + ((unsigned int)min(a * 255.0f, 255.0f) << 24); + } + + inline Color<short>::operator unsigned int() const + { + return ((unsigned int)min(b >> 4, 255) << 0) | + ((unsigned int)min(g >> 4, 255) << 8) | + ((unsigned int)min(r >> 4, 255) << 16) | + ((unsigned int)min(a >> 4, 255) << 24); + } + + inline Color<byte>::operator unsigned int() const + { + return (b << 0) + + (g << 8) + + (r << 16) + + (a << 24); + } + + template<class T> + inline T &Color<T>::operator[](int i) + { + return (&r)[i]; + } + + template<class T> + inline const T &Color<T>::operator[](int i) const + { + return (&r)[i]; + } + + template<class T> + inline Color<T> Color<T>::operator+() const + { + return *this; + } + + template<class T> + inline Color<T> Color<T>::operator-() const + { + return Color(-r, -g, -b, -a); + } + + template<class T> + inline Color<T> &Color<T>::operator=(const Color& c) + { + r = c.r; + g = c.g; + b = c.b; + a = c.a; + + return *this; + } + + template<class T> + inline Color<T> &Color<T>::operator+=(const Color &c) + { + r += c.r; + g += c.g; + b += c.b; + a += c.a; + + return *this; + } + + template<class T> + inline Color<T> &Color<T>::operator*=(float l) + { + *this = l * *this; + + return *this; + } + + template<class T> + inline Color<T> operator+(const Color<T> &c1, const Color<T> &c2) + { + return Color<T>(c1.r + c2.r, + c1.g + c2.g, + c1.b + c2.b, + c1.a + c2.a); + } + + template<class T> + inline Color<T> operator-(const Color<T> &c1, const Color<T> &c2) + { + return Color<T>(c1.r - c2.r, + c1.g - c2.g, + c1.b - c2.b, + c1.a - c2.a); + } + + template<class T> + inline Color<T> operator*(float l, const Color<T> &c) + { + T r = (T)(l * c.r); + T g = (T)(l * c.g); + T b = (T)(l * c.b); + T a = (T)(l * c.a); + + return Color<T>(r, g, b, a); + } + + template<class T> + inline Color<T> operator*(const Color<T> &c1, const Color<T> &c2) + { + T r = c1.r * c2.r; + T g = c1.g * c2.g; + T b = c1.b * c2.b; + T a = c1.a * c2.a; + + return Color<T>(r, g, b, a); + } + + inline Color<short> operator*(const Color<short> &c1, const Color<short> &c2) + { + short r = c1.r * c2.r >> 12; + short g = c1.g * c2.g >> 12; + short b = c1.b * c2.b >> 12; + short a = c1.a * c2.a >> 12; + + return Color<short>(r, g, b, a); + } + + inline Color<byte> operator*(const Color<byte> &c1, const Color<byte> &c2) + { + byte r = c1.r * c2.r >> 8; + byte g = c1.g * c2.g >> 8; + byte b = c1.b * c2.b >> 8; + byte a = c1.a * c2.a >> 8; + + return Color<byte>(r, g, b, a); + } + + template<class T> + inline Color<T> operator/(const Color<T> &c, float l) + { + l = 1.0f / l; + + T r = (T)(l * c.r); + T g = (T)(l * c.g); + T b = (T)(l * c.b); + T a = (T)(l * c.a); + + return Color<T>(r, g, b, a); + } + + template<class T> + inline Color<T> Color<T>::gradient(const Color<T> &c1, const Color<T> &c2, float d) + { + d = 1.0f / d; + + T r = (c2.r - c1.r) * d; + T g = (c2.g - c1.g) * d; + T b = (c2.b - c1.b) * d; + T a = (c2.a - c1.a) * d; + + return Color<T>(r, g, b, a); + } + + template<class T> + inline Color<T> Color<T>::shade(const Color<T> &c1, const Color<T> &c2, float d) + { + T r = c1.r + (T)(d * (c2.r - c1.r)); + T g = c1.g + (T)(d * (c2.g - c1.g)); + T b = c1.b + (T)(d * (c2.b - c1.b)); + T a = c1.a + (T)(d * (c2.a - c1.a)); + + return Color<T>(r, g, b, a); + } +} + +#endif // sw_Color_hpp
diff --git a/src/Renderer/Context.cpp b/src/Renderer/Context.cpp index 12a8398..794a23a 100644 --- a/src/Renderer/Context.cpp +++ b/src/Renderer/Context.cpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -26,6 +26,11 @@ { extern bool perspectiveCorrection; + bool halfIntegerCoordinates = false; // Pixel centers are not at integer coordinates + bool symmetricNormalizedDepth = false; // [-1, 1] instead of [0, 1] + bool booleanFaceRegister = false; + bool fullPixelPositionRegister = false; + bool forceWindowed = false; bool quadLayoutEnabled = false; bool veryEarlyDepthTest = true; @@ -193,8 +198,6 @@ input[i].defaults(); } - postTransform = false; - fogStart = 0.0f; fogEnd = 1.0f; @@ -502,7 +505,7 @@ return lightingEnable && !preTransformed; } - bool Context::vertexTextureActive(int coordinate, int component) // FIXME: Rename to texCoordActive + bool Context::texCoordActive(int coordinate, int component) { bool hasTexture = pointSpriteActive(); @@ -510,7 +513,7 @@ { if(!preTransformed) { - if(vertexShader->output[T0 + coordinate][component].usage == ShaderOperation::USAGE_TEXCOORD) + if(vertexShader->output[T0 + coordinate][component].usage == Shader::USAGE_TEXCOORD) { hasTexture = true; } @@ -563,12 +566,12 @@ return hasTexture && usesTexture; } - bool Context::vertexTextureActive(int coordinate) // FIXME: Rename to texCoordActive + bool Context::texCoordActive(int coordinate) { - return vertexTextureActive(coordinate, 0) || - vertexTextureActive(coordinate, 1) || - vertexTextureActive(coordinate, 2) || - vertexTextureActive(coordinate, 3); + return texCoordActive(coordinate, 0) || + texCoordActive(coordinate, 1) || + texCoordActive(coordinate, 2) || + texCoordActive(coordinate, 3); } bool Context::isProjectionComponent(unsigned int coordinate, int component) @@ -1103,7 +1106,7 @@ Context::TexGen Context::texGenActive(int stage) { - if(vertexShader || !vertexTextureActive(stage)) + if(vertexShader || !texCoordActive(stage)) { return TEXGEN_PASSTHRU; } @@ -1113,7 +1116,7 @@ int Context::textureTransformCountActive(int stage) { - if(vertexShader || !vertexTextureActive(stage)) + if(vertexShader || !texCoordActive(stage)) { return 0; } @@ -1123,7 +1126,7 @@ int Context::texCoordIndexActive(int stage) { - if(vertexShader || !vertexTextureActive(stage)) + if(vertexShader || !texCoordActive(stage)) { return stage; } @@ -1322,14 +1325,14 @@ return textureActive(coordinate, 0) || textureActive(coordinate, 1) || textureActive(coordinate, 2) || textureActive(coordinate, 3); } - bool Context::textureActive(int coordinate, int component) // FIXME: Rename to texCoordActive + bool Context::textureActive(int coordinate, int component) { if(!colorUsed()) { return false; } - if(!vertexTextureActive(coordinate, component)) + if(!texCoordActive(coordinate, component)) { return false; } @@ -1434,6 +1437,6 @@ bool Context::colorUsed() { - return colorWriteActive() || alphaTestActive() || (pixelShader && pixelShader->containsTexkill()); + return colorWriteActive() || alphaTestActive() || (pixelShader && pixelShader->containsKill()); } }
diff --git a/src/Renderer/Context.hpp b/src/Renderer/Context.hpp index eb18ef8..6c7c99a 100644 --- a/src/Renderer/Context.hpp +++ b/src/Renderer/Context.hpp
@@ -1,481 +1,480 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Context_hpp -#define sw_Context_hpp - -#include "Sampler.hpp" -#include "TextureStage.hpp" -#include "Stream.hpp" -#include "Point.hpp" -#include "Vertex.hpp" - -namespace sw -{ - class Sampler; - class Surface; - class PixelShader; - class VertexShader; - struct Triangle; - struct Primitive; - struct Vertex; - class Resource; - - enum In // Default input stream semantic - { - Position = 0, - BlendWeight = 1, - BlendIndices = 2, - Normal = 3, - PSize = 4, - Color0 = 5, - Color1 = 6, - TexCoord0 = 7, - TexCoord1 = 8, - TexCoord2 = 9, - TexCoord3 = 10, - TexCoord4 = 11, - TexCoord5 = 12, - TexCoord6 = 13, - TexCoord7 = 14, - PositionT = 15 - }; - - class Context - { - public: - enum DrawType - { - DRAW_POINTLIST, - DRAW_LINELIST, - DRAW_LINESTRIP, - DRAW_LINELOOP, - DRAW_TRIANGLELIST, - DRAW_TRIANGLESTRIP, - DRAW_TRIANGLEFAN, - - DRAW_INDEXEDPOINTLIST8, - DRAW_INDEXEDLINELIST8, - DRAW_INDEXEDLINESTRIP8, - DRAW_INDEXEDLINELOOP8, - DRAW_INDEXEDTRIANGLELIST8, - DRAW_INDEXEDTRIANGLESTRIP8, - DRAW_INDEXEDTRIANGLEFAN8, - - DRAW_INDEXEDPOINTLIST16, - DRAW_INDEXEDLINELIST16, - DRAW_INDEXEDLINESTRIP16, - DRAW_INDEXEDLINELOOP16, - DRAW_INDEXEDTRIANGLELIST16, - DRAW_INDEXEDTRIANGLESTRIP16, - DRAW_INDEXEDTRIANGLEFAN16, - - DRAW_INDEXEDPOINTLIST32, - DRAW_INDEXEDLINELIST32, - DRAW_INDEXEDLINESTRIP32, - DRAW_INDEXEDLINELOOP32, - DRAW_INDEXEDTRIANGLELIST32, - DRAW_INDEXEDTRIANGLESTRIP32, - DRAW_INDEXEDTRIANGLEFAN32, - - DRAW_LAST = DRAW_INDEXEDTRIANGLEFAN32 - }; - - enum FillMode - { - FILL_SOLID, - FILL_WIREFRAME, - FILL_VERTEX, - - FILL_LAST = FILL_VERTEX - }; - - enum ShadingMode - { - SHADING_FLAT, - SHADING_GOURAUD, - - SHADING_LAST = SHADING_GOURAUD - }; - - enum DepthCompareMode - { - DEPTH_ALWAYS, - DEPTH_NEVER, - DEPTH_EQUAL, - DEPTH_NOTEQUAL, - DEPTH_LESS, - DEPTH_LESSEQUAL, - DEPTH_GREATER, - DEPTH_GREATEREQUAL, - - DEPTH_LAST = DEPTH_GREATEREQUAL - }; - - enum StencilCompareMode - { - STENCIL_ALWAYS, - STENCIL_NEVER, - STENCIL_EQUAL, - STENCIL_NOTEQUAL, - STENCIL_LESS, - STENCIL_LESSEQUAL, - STENCIL_GREATER, - STENCIL_GREATEREQUAL, - - STENCIL_LAST = STENCIL_GREATEREQUAL - }; - - enum StencilOperation - { - OPERATION_KEEP, - OPERATION_ZERO, - OPERATION_REPLACE, - OPERATION_INCRSAT, - OPERATION_DECRSAT, - OPERATION_INVERT, - OPERATION_INCR, - OPERATION_DECR, - - OPERATION_LAST = OPERATION_DECR - }; - - enum AlphaCompareMode - { - ALPHA_ALWAYS, - ALPHA_NEVER, - ALPHA_EQUAL, - ALPHA_NOTEQUAL, - ALPHA_LESS, - ALPHA_LESSEQUAL, - ALPHA_GREATER, - ALPHA_GREATEREQUAL, - - ALPHA_LAST = ALPHA_GREATEREQUAL - }; - - enum CullMode - { - CULL_NONE, - CULL_CLOCKWISE, - CULL_COUNTERCLOCKWISE, - - CULL_LAST = CULL_COUNTERCLOCKWISE - }; - - enum BlendFactor - { - BLEND_ZERO, - BLEND_ONE, - BLEND_SOURCE, - BLEND_INVSOURCE, - BLEND_DEST, - BLEND_INVDEST, - BLEND_SOURCEALPHA, - BLEND_INVSOURCEALPHA, - BLEND_DESTALPHA, - BLEND_INVDESTALPHA, - BLEND_SRCALPHASAT, - BLEND_CONSTANT, - BLEND_INVCONSTANT, - BLEND_CONSTANTALPHA, - BLEND_INVCONSTANTALPHA, - - BLEND_LAST = BLEND_INVCONSTANT - }; - - enum BlendOperation - { - BLENDOP_ADD, - BLENDOP_SUB, - BLENDOP_INVSUB, - BLENDOP_MIN, - BLENDOP_MAX, - - BLENDOP_SOURCE, // Copy source - BLENDOP_DEST, // Copy dest - BLENDOP_NULL, // Nullify result - - BLENDOP_LAST = BLENDOP_NULL - }; - - enum MaterialSource - { - MATERIAL, - COLOR1, - COLOR2, - - MATERIAL_LAST = COLOR2 - }; - - enum FogMode - { - FOG_NONE, - FOG_LINEAR, - FOG_EXP, - FOG_EXP2, - - FOG_LAST = FOG_EXP2 - }; - - enum TexGen - { - TEXGEN_PASSTHRU, - TEXGEN_NORMAL, - TEXGEN_POSITION, - TEXGEN_REFLECTION, - TEXGEN_SPHEREMAP, - - TEXGEN_LAST = TEXGEN_SPHEREMAP - }; - - enum TransparencyAntialiasing - { - TRANSPARENCY_NONE, - TRANSPARENCY_ALPHA_TO_COVERAGE, - - TRANSPARENCY_LAST = TRANSPARENCY_ALPHA_TO_COVERAGE - }; - - Context(); - - ~Context(); - - void *operator new(size_t bytes); - void operator delete(void *pointer, size_t bytes); - - bool isDrawPoint(bool fillModeAware = false) const; - bool isDrawLine(bool fillModeAware = false) const; - bool isDrawTriangle(bool fillModeAware = false) const; - - void init(); - - const float &exp2Bias(); // NOTE: Needs address for JIT - - const Point &getLightPosition(int light); - - void setGlobalMipmapBias(float bias); - - // Set fixed-function vertex pipeline states - void setLightingEnable(bool lightingEnable); - void setSpecularEnable(bool specularEnable); - void setLightEnable(int light, bool lightEnable); - void setLightPosition(int light, Point worldLightPosition); - - void setColorVertexEnable(bool colorVertexEnable); - void setAmbientMaterialSource(MaterialSource ambientMaterialSource); - void setDiffuseMaterialSource(MaterialSource diffuseMaterialSource); - void setSpecularMaterialSource(MaterialSource specularMaterialSource); - void setEmissiveMaterialSource(MaterialSource emissiveMaterialSource); - - void setPointSpriteEnable(bool pointSpriteEnable); - void setPointScaleEnable(bool pointScaleEnable); - - // Set fixed-function pixel pipeline states, return true when modified - bool setDepthBufferEnable(bool depthBufferEnable); - - bool setAlphaBlendEnable(bool alphaBlendEnable); - bool setSourceBlendFactor(BlendFactor sourceBlendFactor); - bool setDestBlendFactor(BlendFactor destBlendFactor); - bool setBlendOperation(BlendOperation blendOperation); - - bool setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable); - bool setSourceBlendFactorAlpha(Context::BlendFactor sourceBlendFactorAlpha); - bool setDestBlendFactorAlpha(Context::BlendFactor destBlendFactorAlpha); - bool setBlendOperationAlpha(Context::BlendOperation blendOperationAlpha); - - bool setColorWriteMask(int index, int colorWriteMask); - bool setWriteSRGB(bool sRGB); - - // Active fixed-function pixel pipeline states - bool fogActive(); - bool pointSizeActive(); - Context::FogMode pixelFogActive(); - bool depthWriteActive(); - bool alphaTestActive(); - bool depthBufferActive(); - bool stencilActive(); - - bool perspectiveActive(); - - // Active fixed-function vertex pipeline states - bool vertexLightingActive(); - bool vertexTextureActive(int coordinate, int component); - bool vertexTextureActive(int coordinate); - bool isProjectionComponent(unsigned int coordinate, int component); - bool vertexSpecularInputActive(); - bool vertexSpecularActive(); - bool vertexNormalActive(); - bool vertexLightActive(); - bool vertexLightActive(int i); - MaterialSource vertexDiffuseMaterialSourceActive(); - MaterialSource vertexSpecularMaterialSourceActive(); - MaterialSource vertexAmbientMaterialSourceActive(); - MaterialSource vertexEmissiveMaterialSourceActive(); - - bool pointSpriteActive(); - bool pointScaleActive(); - - bool alphaBlendActive(); - BlendFactor sourceBlendFactor(); - BlendFactor destBlendFactor(); - BlendOperation blendOperation(); - - BlendFactor sourceBlendFactorAlpha(); - BlendFactor destBlendFactorAlpha(); - BlendOperation blendOperationAlpha(); - - bool indexedVertexBlendActive(); - int vertexBlendMatrixCountActive(); - bool localViewerActive(); - bool normalizeNormalsActive(); - FogMode vertexFogModeActive(); - bool rangeFogActive(); - - TexGen texGenActive(int stage); - int textureTransformCountActive(int stage); - int texCoordIndexActive(int stage); - - // Active context states - bool diffuseUsed(); // Used by pixel processor but not provided by vertex processor - bool diffuseUsed(int component); // Used by pixel processor but not provided by vertex processor - bool diffuseActive(); - bool diffuseActive(int component); - bool specularUsed(); - bool specularUsed(int component); - bool specularActive(); - bool specularActive(int component); - bool colorActive(int color, int component); - bool textureActive(); - bool textureActive(int coordinate); - bool textureActive(int coordinate, int component); - - unsigned short pixelShaderVersion() const; - unsigned short vertexShaderVersion() const; - - DrawType drawType; - - bool stencilEnable; - StencilCompareMode stencilCompareMode; - int stencilReference; - int stencilMask; - StencilOperation stencilFailOperation; - StencilOperation stencilPassOperation; - StencilOperation stencilZFailOperation; - int stencilWriteMask; - - bool twoSidedStencil; - StencilCompareMode stencilCompareModeCCW; - int stencilReferenceCCW; - int stencilMaskCCW; - StencilOperation stencilFailOperationCCW; - StencilOperation stencilPassOperationCCW; - StencilOperation stencilZFailOperationCCW; - int stencilWriteMaskCCW; - - // Pixel processor states - AlphaCompareMode alphaCompareMode; - bool alphaTestEnable; - FillMode fillMode; - ShadingMode shadingMode; - - CullMode cullMode; - int alphaReference; - - TextureStage textureStage[8]; - Sampler sampler[16 + 4]; - - Format renderTargetInternalFormat(int index); - int colorWriteActive(); - int colorWriteActive(int index); - bool colorUsed(); - - Resource *texture[16 + 4]; - Stream input[16]; - Resource *indexBuffer; - - bool preTransformed; // FIXME: Private - bool postTransform; - - float fogStart; - float fogEnd; - - void computeIllumination(); - - bool textureWrapActive; - unsigned char textureWrap[16]; - Context::TexGen texGen[8]; - bool localViewer; - bool normalizeNormals; - int textureTransformCount[8]; - bool textureTransformProject[8]; - - Surface *renderTarget[4]; - Surface *depthStencil; - - // Fog - bool fogEnable; - FogMode pixelFogMode; - FogMode vertexFogMode; - bool wBasedFog; - bool rangeFogEnable; - - // Vertex blending - bool indexedVertexBlendEnable; - int vertexBlendMatrixCount; - - // Shaders - const PixelShader *pixelShader; - const VertexShader *vertexShader; - - // Global mipmap bias - float bias; - - // Fixed-function vertex pipeline state - bool lightingEnable; - bool specularEnable; - bool lightEnable[8]; - Point worldLightPosition[8]; - - MaterialSource ambientMaterialSource; - MaterialSource diffuseMaterialSource; - MaterialSource specularMaterialSource; - MaterialSource emissiveMaterialSource; - bool colorVertexEnable; - - bool occlusionEnabled; - - // Pixel processor states - bool depthBufferEnable; - DepthCompareMode depthCompareMode; - bool depthWriteEnable; - - bool alphaBlendEnable; - BlendFactor sourceBlendFactorState; - BlendFactor destBlendFactorState; - BlendOperation blendOperationState; - - bool separateAlphaBlendEnable; - BlendFactor sourceBlendFactorStateAlpha; - BlendFactor destBlendFactorStateAlpha; - BlendOperation blendOperationStateAlpha; - - bool pointSpriteEnable; - bool pointScaleEnable; - - int colorWriteMask[4]; // RGBA - bool writeSRGB; - unsigned int sampleMask; - unsigned int multiSampleMask; - }; -} - -#endif // sw_Context_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2012 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef sw_Context_hpp +#define sw_Context_hpp + +#include "Sampler.hpp" +#include "TextureStage.hpp" +#include "Stream.hpp" +#include "Point.hpp" +#include "Vertex.hpp" + +namespace sw +{ + class Sampler; + class Surface; + class PixelShader; + class VertexShader; + struct Triangle; + struct Primitive; + struct Vertex; + class Resource; + + enum In // Default input stream semantic + { + Position = 0, + BlendWeight = 1, + BlendIndices = 2, + Normal = 3, + PSize = 4, + Color0 = 5, + Color1 = 6, + TexCoord0 = 7, + TexCoord1 = 8, + TexCoord2 = 9, + TexCoord3 = 10, + TexCoord4 = 11, + TexCoord5 = 12, + TexCoord6 = 13, + TexCoord7 = 14, + PositionT = 15 + }; + + class Context + { + public: + enum DrawType + { + DRAW_POINTLIST, + DRAW_LINELIST, + DRAW_LINESTRIP, + DRAW_LINELOOP, + DRAW_TRIANGLELIST, + DRAW_TRIANGLESTRIP, + DRAW_TRIANGLEFAN, + + DRAW_INDEXEDPOINTLIST8, + DRAW_INDEXEDLINELIST8, + DRAW_INDEXEDLINESTRIP8, + DRAW_INDEXEDLINELOOP8, + DRAW_INDEXEDTRIANGLELIST8, + DRAW_INDEXEDTRIANGLESTRIP8, + DRAW_INDEXEDTRIANGLEFAN8, + + DRAW_INDEXEDPOINTLIST16, + DRAW_INDEXEDLINELIST16, + DRAW_INDEXEDLINESTRIP16, + DRAW_INDEXEDLINELOOP16, + DRAW_INDEXEDTRIANGLELIST16, + DRAW_INDEXEDTRIANGLESTRIP16, + DRAW_INDEXEDTRIANGLEFAN16, + + DRAW_INDEXEDPOINTLIST32, + DRAW_INDEXEDLINELIST32, + DRAW_INDEXEDLINESTRIP32, + DRAW_INDEXEDLINELOOP32, + DRAW_INDEXEDTRIANGLELIST32, + DRAW_INDEXEDTRIANGLESTRIP32, + DRAW_INDEXEDTRIANGLEFAN32, + + DRAW_LAST = DRAW_INDEXEDTRIANGLEFAN32 + }; + + enum FillMode + { + FILL_SOLID, + FILL_WIREFRAME, + FILL_VERTEX, + + FILL_LAST = FILL_VERTEX + }; + + enum ShadingMode + { + SHADING_FLAT, + SHADING_GOURAUD, + + SHADING_LAST = SHADING_GOURAUD + }; + + enum DepthCompareMode + { + DEPTH_ALWAYS, + DEPTH_NEVER, + DEPTH_EQUAL, + DEPTH_NOTEQUAL, + DEPTH_LESS, + DEPTH_LESSEQUAL, + DEPTH_GREATER, + DEPTH_GREATEREQUAL, + + DEPTH_LAST = DEPTH_GREATEREQUAL + }; + + enum StencilCompareMode + { + STENCIL_ALWAYS, + STENCIL_NEVER, + STENCIL_EQUAL, + STENCIL_NOTEQUAL, + STENCIL_LESS, + STENCIL_LESSEQUAL, + STENCIL_GREATER, + STENCIL_GREATEREQUAL, + + STENCIL_LAST = STENCIL_GREATEREQUAL + }; + + enum StencilOperation + { + OPERATION_KEEP, + OPERATION_ZERO, + OPERATION_REPLACE, + OPERATION_INCRSAT, + OPERATION_DECRSAT, + OPERATION_INVERT, + OPERATION_INCR, + OPERATION_DECR, + + OPERATION_LAST = OPERATION_DECR + }; + + enum AlphaCompareMode + { + ALPHA_ALWAYS, + ALPHA_NEVER, + ALPHA_EQUAL, + ALPHA_NOTEQUAL, + ALPHA_LESS, + ALPHA_LESSEQUAL, + ALPHA_GREATER, + ALPHA_GREATEREQUAL, + + ALPHA_LAST = ALPHA_GREATEREQUAL + }; + + enum CullMode + { + CULL_NONE, + CULL_CLOCKWISE, + CULL_COUNTERCLOCKWISE, + + CULL_LAST = CULL_COUNTERCLOCKWISE + }; + + enum BlendFactor + { + BLEND_ZERO, + BLEND_ONE, + BLEND_SOURCE, + BLEND_INVSOURCE, + BLEND_DEST, + BLEND_INVDEST, + BLEND_SOURCEALPHA, + BLEND_INVSOURCEALPHA, + BLEND_DESTALPHA, + BLEND_INVDESTALPHA, + BLEND_SRCALPHASAT, + BLEND_CONSTANT, + BLEND_INVCONSTANT, + BLEND_CONSTANTALPHA, + BLEND_INVCONSTANTALPHA, + + BLEND_LAST = BLEND_INVCONSTANT + }; + + enum BlendOperation + { + BLENDOP_ADD, + BLENDOP_SUB, + BLENDOP_INVSUB, + BLENDOP_MIN, + BLENDOP_MAX, + + BLENDOP_SOURCE, // Copy source + BLENDOP_DEST, // Copy dest + BLENDOP_NULL, // Nullify result + + BLENDOP_LAST = BLENDOP_NULL + }; + + enum MaterialSource + { + MATERIAL, + COLOR1, + COLOR2, + + MATERIAL_LAST = COLOR2 + }; + + enum FogMode + { + FOG_NONE, + FOG_LINEAR, + FOG_EXP, + FOG_EXP2, + + FOG_LAST = FOG_EXP2 + }; + + enum TexGen + { + TEXGEN_PASSTHRU, + TEXGEN_NORMAL, + TEXGEN_POSITION, + TEXGEN_REFLECTION, + TEXGEN_SPHEREMAP, + + TEXGEN_LAST = TEXGEN_SPHEREMAP + }; + + enum TransparencyAntialiasing + { + TRANSPARENCY_NONE, + TRANSPARENCY_ALPHA_TO_COVERAGE, + + TRANSPARENCY_LAST = TRANSPARENCY_ALPHA_TO_COVERAGE + }; + + Context(); + + ~Context(); + + void *operator new(size_t bytes); + void operator delete(void *pointer, size_t bytes); + + bool isDrawPoint(bool fillModeAware = false) const; + bool isDrawLine(bool fillModeAware = false) const; + bool isDrawTriangle(bool fillModeAware = false) const; + + void init(); + + const float &exp2Bias(); // NOTE: Needs address for JIT + + const Point &getLightPosition(int light); + + void setGlobalMipmapBias(float bias); + + // Set fixed-function vertex pipeline states + void setLightingEnable(bool lightingEnable); + void setSpecularEnable(bool specularEnable); + void setLightEnable(int light, bool lightEnable); + void setLightPosition(int light, Point worldLightPosition); + + void setColorVertexEnable(bool colorVertexEnable); + void setAmbientMaterialSource(MaterialSource ambientMaterialSource); + void setDiffuseMaterialSource(MaterialSource diffuseMaterialSource); + void setSpecularMaterialSource(MaterialSource specularMaterialSource); + void setEmissiveMaterialSource(MaterialSource emissiveMaterialSource); + + void setPointSpriteEnable(bool pointSpriteEnable); + void setPointScaleEnable(bool pointScaleEnable); + + // Set fixed-function pixel pipeline states, return true when modified + bool setDepthBufferEnable(bool depthBufferEnable); + + bool setAlphaBlendEnable(bool alphaBlendEnable); + bool setSourceBlendFactor(BlendFactor sourceBlendFactor); + bool setDestBlendFactor(BlendFactor destBlendFactor); + bool setBlendOperation(BlendOperation blendOperation); + + bool setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable); + bool setSourceBlendFactorAlpha(Context::BlendFactor sourceBlendFactorAlpha); + bool setDestBlendFactorAlpha(Context::BlendFactor destBlendFactorAlpha); + bool setBlendOperationAlpha(Context::BlendOperation blendOperationAlpha); + + bool setColorWriteMask(int index, int colorWriteMask); + bool setWriteSRGB(bool sRGB); + + // Active fixed-function pixel pipeline states + bool fogActive(); + bool pointSizeActive(); + Context::FogMode pixelFogActive(); + bool depthWriteActive(); + bool alphaTestActive(); + bool depthBufferActive(); + bool stencilActive(); + + bool perspectiveActive(); + + // Active fixed-function vertex pipeline states + bool vertexLightingActive(); + bool texCoordActive(int coordinate, int component); + bool texCoordActive(int coordinate); + bool isProjectionComponent(unsigned int coordinate, int component); + bool vertexSpecularInputActive(); + bool vertexSpecularActive(); + bool vertexNormalActive(); + bool vertexLightActive(); + bool vertexLightActive(int i); + MaterialSource vertexDiffuseMaterialSourceActive(); + MaterialSource vertexSpecularMaterialSourceActive(); + MaterialSource vertexAmbientMaterialSourceActive(); + MaterialSource vertexEmissiveMaterialSourceActive(); + + bool pointSpriteActive(); + bool pointScaleActive(); + + bool alphaBlendActive(); + BlendFactor sourceBlendFactor(); + BlendFactor destBlendFactor(); + BlendOperation blendOperation(); + + BlendFactor sourceBlendFactorAlpha(); + BlendFactor destBlendFactorAlpha(); + BlendOperation blendOperationAlpha(); + + bool indexedVertexBlendActive(); + int vertexBlendMatrixCountActive(); + bool localViewerActive(); + bool normalizeNormalsActive(); + FogMode vertexFogModeActive(); + bool rangeFogActive(); + + TexGen texGenActive(int stage); + int textureTransformCountActive(int stage); + int texCoordIndexActive(int stage); + + // Active context states + bool diffuseUsed(); // Used by pixel processor but not provided by vertex processor + bool diffuseUsed(int component); // Used by pixel processor but not provided by vertex processor + bool diffuseActive(); + bool diffuseActive(int component); + bool specularUsed(); + bool specularUsed(int component); + bool specularActive(); + bool specularActive(int component); + bool colorActive(int color, int component); + bool textureActive(); + bool textureActive(int coordinate); + bool textureActive(int coordinate, int component); + + unsigned short pixelShaderVersion() const; + unsigned short vertexShaderVersion() const; + + DrawType drawType; + + bool stencilEnable; + StencilCompareMode stencilCompareMode; + int stencilReference; + int stencilMask; + StencilOperation stencilFailOperation; + StencilOperation stencilPassOperation; + StencilOperation stencilZFailOperation; + int stencilWriteMask; + + bool twoSidedStencil; + StencilCompareMode stencilCompareModeCCW; + int stencilReferenceCCW; + int stencilMaskCCW; + StencilOperation stencilFailOperationCCW; + StencilOperation stencilPassOperationCCW; + StencilOperation stencilZFailOperationCCW; + int stencilWriteMaskCCW; + + // Pixel processor states + AlphaCompareMode alphaCompareMode; + bool alphaTestEnable; + FillMode fillMode; + ShadingMode shadingMode; + + CullMode cullMode; + int alphaReference; + + TextureStage textureStage[8]; + Sampler sampler[16 + 4]; + + Format renderTargetInternalFormat(int index); + int colorWriteActive(); + int colorWriteActive(int index); + bool colorUsed(); + + Resource *texture[16 + 4]; + Stream input[16]; + Resource *indexBuffer; + + bool preTransformed; // FIXME: Private + + float fogStart; + float fogEnd; + + void computeIllumination(); + + bool textureWrapActive; + unsigned char textureWrap[16]; + Context::TexGen texGen[8]; + bool localViewer; + bool normalizeNormals; + int textureTransformCount[8]; + bool textureTransformProject[8]; + + Surface *renderTarget[4]; + Surface *depthStencil; + + // Fog + bool fogEnable; + FogMode pixelFogMode; + FogMode vertexFogMode; + bool wBasedFog; + bool rangeFogEnable; + + // Vertex blending + bool indexedVertexBlendEnable; + int vertexBlendMatrixCount; + + // Shaders + const PixelShader *pixelShader; + const VertexShader *vertexShader; + + // Global mipmap bias + float bias; + + // Fixed-function vertex pipeline state + bool lightingEnable; + bool specularEnable; + bool lightEnable[8]; + Point worldLightPosition[8]; + + MaterialSource ambientMaterialSource; + MaterialSource diffuseMaterialSource; + MaterialSource specularMaterialSource; + MaterialSource emissiveMaterialSource; + bool colorVertexEnable; + + bool occlusionEnabled; + + // Pixel processor states + bool depthBufferEnable; + DepthCompareMode depthCompareMode; + bool depthWriteEnable; + + bool alphaBlendEnable; + BlendFactor sourceBlendFactorState; + BlendFactor destBlendFactorState; + BlendOperation blendOperationState; + + bool separateAlphaBlendEnable; + BlendFactor sourceBlendFactorStateAlpha; + BlendFactor destBlendFactorStateAlpha; + BlendOperation blendOperationStateAlpha; + + bool pointSpriteEnable; + bool pointScaleEnable; + + int colorWriteMask[4]; // RGBA + bool writeSRGB; + unsigned int sampleMask; + unsigned int multiSampleMask; + }; +} + +#endif // sw_Context_hpp
diff --git a/src/Renderer/Matrix.hpp b/src/Renderer/Matrix.hpp index d3c9377..1b9a39e 100644 --- a/src/Renderer/Matrix.hpp +++ b/src/Renderer/Matrix.hpp
@@ -1,211 +1,211 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef Matrix_hpp -#define Matrix_hpp - -namespace sw -{ - struct Vector; - struct Point; - - struct Matrix - { - Matrix(); - Matrix(const int i); - Matrix(const float m[16]); - Matrix(const float m[4][4]); - Matrix(float m11, float m12, float m13, - float m21, float m22, float m23, - float m31, float m32, float m33); - Matrix(float m11, float m12, float m13, float m14, - float m21, float m22, float m23, float m24, - float m31, float m32, float m33, float m34, - float m41, float m42, float m43, float m44); - Matrix(const Vector &v1, const Vector &v2, const Vector &v3); // Column vectors - - Matrix &operator=(const Matrix &N); - - // Row major order - float m[4][4]; - - static Matrix diag(float m11, float m22, float m33, float m44); - - operator float*(); - - Matrix operator+() const; - Matrix operator-() const; - - Matrix operator!() const; // Inverse - Matrix operator~() const; // Transpose - - Matrix &operator+=(const Matrix &N); - Matrix &operator-=(const Matrix &N); - Matrix &operator*=(float s); - Matrix &operator*=(const Matrix &N); - Matrix &operator/=(float s); - - float *operator[](int i); // Access element [row][col], starting with [0][0] - const float *operator[](int i) const; - - float &operator()(int i, int j); // Access element (row, col), starting with (1, 1) - const float &operator()(int i, int j) const; - - friend bool operator==(const Matrix &M, const Matrix &N); - friend bool operator!=(const Matrix &M, const Matrix &N); - - friend Matrix operator+(const Matrix &M, const Matrix &N); - friend Matrix operator-(const Matrix &M, const Matrix &N); - friend Matrix operator*(float s, const Matrix &M); - friend Matrix operator*(const Matrix &M, const Matrix &N); - friend Matrix operator/(const Matrix &M, float s); - - static float det(const Matrix &M); - static float det(float m11); - static float det(float m11, float m12, - float m21, float m22); - static float det(float m11, float m12, float m13, - float m21, float m22, float m23, - float m31, float m32, float m33); - static float det(float m11, float m12, float m13, float m14, - float m21, float m22, float m23, float m24, - float m31, float m32, float m33, float m34, - float m41, float m42, float m43, float m44); - static float det(const Vector &v1, const Vector &v2, const Vector &v3); - static float det3(const Matrix &M); - - static float tr(const Matrix &M); - - Matrix &orthogonalise(); // Gram-Schmidt orthogonalisation of 3x3 submatrix - - static Matrix eulerRotate(const Vector &v); - static Matrix eulerRotate(float x, float y, float z); - - static Matrix translate(const Vector &v); - static Matrix translate(float x, float y, float z); - - static Matrix scale(const Vector &v); - static Matrix scale(float x, float y, float z); - - static Matrix lookAt(const Vector &v); - static Matrix lookAt(float x, float y, float z); - }; -} - -#include "Vector.hpp" - -namespace sw -{ - inline Matrix::Matrix() - { - } - - inline Matrix::Matrix(const int i) - { - const float s = (float)i; - - Matrix &M = *this; - - M(1, 1) = s; M(1, 2) = 0; M(1, 3) = 0; M(1, 4) = 0; - M(2, 1) = 0; M(2, 2) = s; M(2, 3) = 0; M(2, 4) = 0; - M(3, 1) = 0; M(3, 2) = 0; M(3, 3) = s; M(3, 4) = 0; - M(4, 1) = 0; M(4, 2) = 0; M(4, 3) = 0; M(4, 4) = s; - } - - inline Matrix::Matrix(const float m[16]) - { - Matrix &M = *this; - - M(1, 1) = m[0]; M(1, 2) = m[1]; M(1, 3) = m[2]; M(1, 4) = m[3]; - M(2, 1) = m[4]; M(2, 2) = m[5]; M(2, 3) = m[6]; M(2, 4) = m[7]; - M(3, 1) = m[8]; M(3, 2) = m[8]; M(3, 3) = m[10]; M(3, 4) = m[11]; - M(4, 1) = m[12]; M(4, 2) = m[13]; M(4, 3) = m[14]; M(4, 4) = m[15]; - } - - inline Matrix::Matrix(const float m[4][4]) - { - Matrix &M = *this; - - M[0][0] = m[0][0]; M[0][1] = m[0][1]; M[0][2] = m[0][2]; M[0][3] = m[0][3]; - M[1][0] = m[1][0]; M[1][1] = m[1][1]; M[1][2] = m[1][2]; M[1][3] = m[1][3]; - M[2][0] = m[2][0]; M[2][1] = m[2][1]; M[2][2] = m[2][2]; M[2][3] = m[2][3]; - M[3][0] = m[3][0]; M[3][1] = m[3][1]; M[3][2] = m[3][2]; M[3][3] = m[3][3]; - } - - inline Matrix::Matrix(float m11, float m12, float m13, - float m21, float m22, float m23, - float m31, float m32, float m33) - { - Matrix &M = *this; - - M(1, 1) = m11; M(1, 2) = m12; M(1, 3) = m13; M(1, 4) = 0; - M(2, 1) = m21; M(2, 2) = m22; M(2, 3) = m23; M(2, 4) = 0; - M(3, 1) = m31; M(3, 2) = m32; M(3, 3) = m33; M(3, 4) = 0; - M(4, 1) = 0; M(4, 2) = 0; M(4, 3) = 0; M(4, 4) = 1; - } - - inline Matrix::Matrix(float m11, float m12, float m13, float m14, - float m21, float m22, float m23, float m24, - float m31, float m32, float m33, float m34, - float m41, float m42, float m43, float m44) - { - Matrix &M = *this; - - M(1, 1) = m11; M(1, 2) = m12; M(1, 3) = m13; M(1, 4) = m14; - M(2, 1) = m21; M(2, 2) = m22; M(2, 3) = m23; M(2, 4) = m24; - M(3, 1) = m31; M(3, 2) = m32; M(3, 3) = m33; M(3, 4) = m34; - M(4, 1) = m41; M(4, 2) = m42; M(4, 3) = m43; M(4, 4) = m44; - } - - inline Matrix::Matrix(const Vector &v1, const Vector &v2, const Vector &v3) - { - Matrix &M = *this; - - M(1, 1) = v1.x; M(1, 2) = v2.x; M(1, 3) = v3.x; M(1, 4) = 0; - M(2, 1) = v1.y; M(2, 2) = v2.y; M(2, 3) = v3.y; M(2, 4) = 0; - M(3, 1) = v1.z; M(3, 2) = v2.z; M(3, 3) = v3.z; M(3, 4) = 0; - M(4, 1) = 0; M(4, 2) = 0; M(4, 3) = 0; M(4, 4) = 1; - } - - inline Matrix &Matrix::operator=(const Matrix &N) - { - Matrix &M = *this; - - M(1, 1) = N(1, 1); M(1, 2) = N(1, 2); M(1, 3) = N(1, 3); M(1, 4) = N(1, 4); - M(2, 1) = N(2, 1); M(2, 2) = N(2, 2); M(2, 3) = N(2, 3); M(2, 4) = N(2, 4); - M(3, 1) = N(3, 1); M(3, 2) = N(3, 2); M(3, 3) = N(3, 3); M(3, 4) = N(3, 4); - M(4, 1) = N(4, 1); M(4, 2) = N(4, 2); M(4, 3) = N(4, 3); M(4, 4) = N(4, 4); - - return M; - } - - inline float *Matrix::operator[](int i) - { - return m[i]; - } - - inline const float *Matrix::operator[](int i) const - { - return m[i]; - } - - inline float &Matrix::operator()(int i, int j) - { - return m[i - 1][j - 1]; - } - - inline const float &Matrix::operator()(int i, int j) const - { - return m[i - 1][j - 1]; - } -} - -#endif // Matrix_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2011 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef Matrix_hpp +#define Matrix_hpp + +namespace sw +{ + struct Vector; + struct Point; + + struct Matrix + { + Matrix(); + Matrix(const int i); + Matrix(const float m[16]); + Matrix(const float m[4][4]); + Matrix(float m11, float m12, float m13, + float m21, float m22, float m23, + float m31, float m32, float m33); + Matrix(float m11, float m12, float m13, float m14, + float m21, float m22, float m23, float m24, + float m31, float m32, float m33, float m34, + float m41, float m42, float m43, float m44); + Matrix(const Vector &v1, const Vector &v2, const Vector &v3); // Column vectors + + Matrix &operator=(const Matrix &N); + + // Row major order + float m[4][4]; + + static Matrix diag(float m11, float m22, float m33, float m44); + + operator float*(); + + Matrix operator+() const; + Matrix operator-() const; + + Matrix operator!() const; // Inverse + Matrix operator~() const; // Transpose + + Matrix &operator+=(const Matrix &N); + Matrix &operator-=(const Matrix &N); + Matrix &operator*=(float s); + Matrix &operator*=(const Matrix &N); + Matrix &operator/=(float s); + + float *operator[](int i); // Access element [row][col], starting with [0][0] + const float *operator[](int i) const; + + float &operator()(int i, int j); // Access element (row, col), starting with (1, 1) + const float &operator()(int i, int j) const; + + friend bool operator==(const Matrix &M, const Matrix &N); + friend bool operator!=(const Matrix &M, const Matrix &N); + + friend Matrix operator+(const Matrix &M, const Matrix &N); + friend Matrix operator-(const Matrix &M, const Matrix &N); + friend Matrix operator*(float s, const Matrix &M); + friend Matrix operator*(const Matrix &M, const Matrix &N); + friend Matrix operator/(const Matrix &M, float s); + + static float det(const Matrix &M); + static float det(float m11); + static float det(float m11, float m12, + float m21, float m22); + static float det(float m11, float m12, float m13, + float m21, float m22, float m23, + float m31, float m32, float m33); + static float det(float m11, float m12, float m13, float m14, + float m21, float m22, float m23, float m24, + float m31, float m32, float m33, float m34, + float m41, float m42, float m43, float m44); + static float det(const Vector &v1, const Vector &v2, const Vector &v3); + static float det3(const Matrix &M); + + static float tr(const Matrix &M); + + Matrix &orthogonalise(); // Gram-Schmidt orthogonalisation of 3x3 submatrix + + static Matrix eulerRotate(const Vector &v); + static Matrix eulerRotate(float x, float y, float z); + + static Matrix translate(const Vector &v); + static Matrix translate(float x, float y, float z); + + static Matrix scale(const Vector &v); + static Matrix scale(float x, float y, float z); + + static Matrix lookAt(const Vector &v); + static Matrix lookAt(float x, float y, float z); + }; +} + +#include "Vector.hpp" + +namespace sw +{ + inline Matrix::Matrix() + { + } + + inline Matrix::Matrix(const int i) + { + const float s = (float)i; + + Matrix &M = *this; + + M(1, 1) = s; M(1, 2) = 0; M(1, 3) = 0; M(1, 4) = 0; + M(2, 1) = 0; M(2, 2) = s; M(2, 3) = 0; M(2, 4) = 0; + M(3, 1) = 0; M(3, 2) = 0; M(3, 3) = s; M(3, 4) = 0; + M(4, 1) = 0; M(4, 2) = 0; M(4, 3) = 0; M(4, 4) = s; + } + + inline Matrix::Matrix(const float m[16]) + { + Matrix &M = *this; + + M(1, 1) = m[0]; M(1, 2) = m[1]; M(1, 3) = m[2]; M(1, 4) = m[3]; + M(2, 1) = m[4]; M(2, 2) = m[5]; M(2, 3) = m[6]; M(2, 4) = m[7]; + M(3, 1) = m[8]; M(3, 2) = m[8]; M(3, 3) = m[10]; M(3, 4) = m[11]; + M(4, 1) = m[12]; M(4, 2) = m[13]; M(4, 3) = m[14]; M(4, 4) = m[15]; + } + + inline Matrix::Matrix(const float m[4][4]) + { + Matrix &M = *this; + + M[0][0] = m[0][0]; M[0][1] = m[0][1]; M[0][2] = m[0][2]; M[0][3] = m[0][3]; + M[1][0] = m[1][0]; M[1][1] = m[1][1]; M[1][2] = m[1][2]; M[1][3] = m[1][3]; + M[2][0] = m[2][0]; M[2][1] = m[2][1]; M[2][2] = m[2][2]; M[2][3] = m[2][3]; + M[3][0] = m[3][0]; M[3][1] = m[3][1]; M[3][2] = m[3][2]; M[3][3] = m[3][3]; + } + + inline Matrix::Matrix(float m11, float m12, float m13, + float m21, float m22, float m23, + float m31, float m32, float m33) + { + Matrix &M = *this; + + M(1, 1) = m11; M(1, 2) = m12; M(1, 3) = m13; M(1, 4) = 0; + M(2, 1) = m21; M(2, 2) = m22; M(2, 3) = m23; M(2, 4) = 0; + M(3, 1) = m31; M(3, 2) = m32; M(3, 3) = m33; M(3, 4) = 0; + M(4, 1) = 0; M(4, 2) = 0; M(4, 3) = 0; M(4, 4) = 1; + } + + inline Matrix::Matrix(float m11, float m12, float m13, float m14, + float m21, float m22, float m23, float m24, + float m31, float m32, float m33, float m34, + float m41, float m42, float m43, float m44) + { + Matrix &M = *this; + + M(1, 1) = m11; M(1, 2) = m12; M(1, 3) = m13; M(1, 4) = m14; + M(2, 1) = m21; M(2, 2) = m22; M(2, 3) = m23; M(2, 4) = m24; + M(3, 1) = m31; M(3, 2) = m32; M(3, 3) = m33; M(3, 4) = m34; + M(4, 1) = m41; M(4, 2) = m42; M(4, 3) = m43; M(4, 4) = m44; + } + + inline Matrix::Matrix(const Vector &v1, const Vector &v2, const Vector &v3) + { + Matrix &M = *this; + + M(1, 1) = v1.x; M(1, 2) = v2.x; M(1, 3) = v3.x; M(1, 4) = 0; + M(2, 1) = v1.y; M(2, 2) = v2.y; M(2, 3) = v3.y; M(2, 4) = 0; + M(3, 1) = v1.z; M(3, 2) = v2.z; M(3, 3) = v3.z; M(3, 4) = 0; + M(4, 1) = 0; M(4, 2) = 0; M(4, 3) = 0; M(4, 4) = 1; + } + + inline Matrix &Matrix::operator=(const Matrix &N) + { + Matrix &M = *this; + + M(1, 1) = N(1, 1); M(1, 2) = N(1, 2); M(1, 3) = N(1, 3); M(1, 4) = N(1, 4); + M(2, 1) = N(2, 1); M(2, 2) = N(2, 2); M(2, 3) = N(2, 3); M(2, 4) = N(2, 4); + M(3, 1) = N(3, 1); M(3, 2) = N(3, 2); M(3, 3) = N(3, 3); M(3, 4) = N(3, 4); + M(4, 1) = N(4, 1); M(4, 2) = N(4, 2); M(4, 3) = N(4, 3); M(4, 4) = N(4, 4); + + return M; + } + + inline float *Matrix::operator[](int i) + { + return m[i]; + } + + inline const float *Matrix::operator[](int i) const + { + return m[i]; + } + + inline float &Matrix::operator()(int i, int j) + { + return m[i - 1][j - 1]; + } + + inline const float &Matrix::operator()(int i, int j) const + { + return m[i - 1][j - 1]; + } +} + +#endif // Matrix_hpp
diff --git a/src/Renderer/PixelProcessor.cpp b/src/Renderer/PixelProcessor.cpp index b0b285a..bd6ea30 100644 --- a/src/Renderer/PixelProcessor.cpp +++ b/src/Renderer/PixelProcessor.cpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -59,6 +59,7 @@ // Round to nearest LOD [0.7, 1.4]: 0.0 // Round to lowest LOD [1.0, 2.0]: 0.5 + precacheDLL = 0; routineCache = 0; setRoutineCacheSize(1024); } @@ -813,15 +814,15 @@ if(context->pixelShader) { - state.shaderHash = context->pixelShader->getHash(); + state.shaderID = context->pixelShader->getSerialID(); } else { - state.shaderHash = 0; + state.shaderID = 0; } state.depthOverride = context->pixelShader && context->pixelShader->depthOverride(); - state.shaderContainsTexkill = context->pixelShader ? context->pixelShader->containsTexkill() : false; + state.shaderContainsKill = context->pixelShader ? context->pixelShader->containsKill() : false; if(context->alphaTestActive()) { @@ -1004,8 +1005,8 @@ switch(context->pixelShader->semantic[interpolant][component].usage) { - case ShaderOperation::USAGE_TEXCOORD: flat = point && !sprite; break; - case ShaderOperation::USAGE_COLOR: flat = flatShading; break; + case Shader::USAGE_TEXCOORD: flat = point && !sprite; break; + case Shader::USAGE_COLOR: flat = flatShading; break; } state.interpolant[interpolant].component |= 1 << component;
diff --git a/src/Renderer/PixelProcessor.hpp b/src/Renderer/PixelProcessor.hpp index 98b73ca..0c0122a 100644 --- a/src/Renderer/PixelProcessor.hpp +++ b/src/Renderer/PixelProcessor.hpp
@@ -1,309 +1,310 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_PixelProcessor_hpp -#define sw_PixelProcessor_hpp - -#include "Context.hpp" -#include "LRUCache.hpp" - -namespace sw -{ - class PixelShader; - class Rasterizer; - struct Texture; - class Routine; - struct DrawData; - - class PixelProcessor - { - public: - struct States - { - unsigned int computeHash(); - - uint64_t shaderHash; - - unsigned int depthOverride : 1; - unsigned int shaderContainsTexkill : 1; - - unsigned int depthCompareMode : BITS(Context::DEPTH_LAST); - unsigned int alphaCompareMode : BITS(Context::ALPHA_LAST); - unsigned int depthWriteEnable : 1; - unsigned int quadLayoutDepthBuffer : 1; - - unsigned int stencilActive : 1; - unsigned int stencilCompareMode : BITS(Context::STENCIL_LAST); - unsigned int stencilFailOperation : BITS(Context::OPERATION_LAST); - unsigned int stencilPassOperation : BITS(Context::OPERATION_LAST); - unsigned int stencilZFailOperation : BITS(Context::OPERATION_LAST); - unsigned int noStencilMask : 1; - unsigned int noStencilWriteMask : 1; - unsigned int stencilWriteMasked : 1; - unsigned int twoSidedStencil : 1; - unsigned int stencilCompareModeCCW : BITS(Context::STENCIL_LAST); - unsigned int stencilFailOperationCCW : BITS(Context::OPERATION_LAST); - unsigned int stencilPassOperationCCW : BITS(Context::OPERATION_LAST); - unsigned int stencilZFailOperationCCW : BITS(Context::OPERATION_LAST); - unsigned int noStencilMaskCCW : 1; - unsigned int noStencilWriteMaskCCW : 1; - unsigned int stencilWriteMaskedCCW : 1; - - unsigned int depthTestActive : 1; - unsigned int fogActive : 1; - unsigned int pixelFogMode : BITS(Context::FOG_LAST); - unsigned int specularAdd : 1; - unsigned int occlusionEnabled : 1; - unsigned int wBasedFog : 1; - unsigned int perspective : 1; - - unsigned int alphaBlendActive : 1; - unsigned int sourceBlendFactor : BITS(Context::BLEND_LAST); - unsigned int destBlendFactor : BITS(Context::BLEND_LAST); - unsigned int blendOperation : BITS(Context::BLENDOP_LAST); - unsigned int sourceBlendFactorAlpha : BITS(Context::BLEND_LAST); - unsigned int destBlendFactorAlpha : BITS(Context::BLEND_LAST); - unsigned int blendOperationAlpha : BITS(Context::BLENDOP_LAST); - - unsigned int colorWriteMask : 16; // (four times four component bit mask) - unsigned char targetFormat[4]; - unsigned int writeSRGB : 1; - unsigned int multiSample : 3; - unsigned int multiSampleMask : 4; - unsigned int transparencyAntialiasing : BITS(Context::TRANSPARENCY_LAST); - unsigned int centroid : 1; - - Sampler::State sampler[16]; - TextureStage::State textureStage[8]; - - struct Interpolant - { - unsigned char component : 4; - unsigned char flat : 4; - unsigned char project : 2; - unsigned char centroid : 1; - }; - - union - { - struct - { - Interpolant color[2]; - Interpolant texture[8]; - Interpolant fog; - }; - - Interpolant interpolant[10]; - }; - }; - - struct State : States - { - State(); - - bool operator==(const State &state) const; - - int colorWriteActive(int index) const - { - return (colorWriteMask >> (index * 4)) & 0xF; - } - - bool alphaTestActive() const - { - return alphaCompareMode != Context::ALPHA_ALWAYS; - } - - bool pixelFogActive() const - { - return pixelFogMode != Context::FOG_NONE; - } - - unsigned int hash; - }; - - struct Stencil - { - int64_t testMaskQ; - int64_t referenceMaskedQ; - int64_t referenceMaskedSignedQ; - int64_t writeMaskQ; - int64_t invWriteMaskQ; - int64_t referenceQ; - - void set(int reference, int testMask, int writeMask) - { - referenceQ = replicate(reference); - testMaskQ = replicate(testMask); - writeMaskQ = replicate(writeMask); - invWriteMaskQ = ~writeMaskQ; - referenceMaskedQ = referenceQ & testMaskQ; - referenceMaskedSignedQ = replicate((reference + 0x80) & 0xFF & testMask); - } - - static int64_t replicate(int b) - { - int64_t w = b & 0xFF; - - return (w << 0) | (w << 8) | (w << 16) | (w << 24) | (w << 32) | (w << 40) | (w << 48) | (w << 56); - } - }; - - struct Fog - { - float4 scale; - float4 offset; - word4 color4[3]; - float4 colorF[3]; - float4 densityE; - float4 densityE2; - }; - - struct Factor - { - word4 textureFactor4[4]; - - word4 alphaReference4; - - word4 blendConstant4W[4]; - float4 blendConstant4F[4]; - word4 invBlendConstant4W[4]; - float4 invBlendConstant4F[4]; - }; - - public: - typedef void (__cdecl *RoutinePointer)(const Primitive *primitive, int count, int thread, DrawData *draw); - - PixelProcessor(Context *context); - - virtual ~PixelProcessor(); - - virtual void setFloatConstant(unsigned int index, const float value[4]); - virtual void setIntegerConstant(unsigned int index, const int value[4]); - virtual void setBooleanConstant(unsigned int index, int boolean); - - virtual void setRenderTarget(int index, Surface *renderTarget); - virtual void setDepthStencil(Surface *depthStencil); - - virtual void setTexCoordIndex(unsigned int stage, int texCoordIndex); - virtual void setStageOperation(unsigned int stage, TextureStage::StageOperation stageOperation); - virtual void setFirstArgument(unsigned int stage, TextureStage::SourceArgument firstArgument); - virtual void setSecondArgument(unsigned int stage, TextureStage::SourceArgument secondArgument); - virtual void setThirdArgument(unsigned int stage, TextureStage::SourceArgument thirdArgument); - virtual void setStageOperationAlpha(unsigned int stage, TextureStage::StageOperation stageOperationAlpha); - virtual void setFirstArgumentAlpha(unsigned int stage, TextureStage::SourceArgument firstArgumentAlpha); - virtual void setSecondArgumentAlpha(unsigned int stage, TextureStage::SourceArgument secondArgumentAlpha); - virtual void setThirdArgumentAlpha(unsigned int stage, TextureStage::SourceArgument thirdArgumentAlpha); - virtual void setFirstModifier(unsigned int stage, TextureStage::ArgumentModifier firstModifier); - virtual void setSecondModifier(unsigned int stage, TextureStage::ArgumentModifier secondModifier); - virtual void setThirdModifier(unsigned int stage, TextureStage::ArgumentModifier thirdModifier); - virtual void setFirstModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier firstModifierAlpha); - virtual void setSecondModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier secondModifierAlpha); - virtual void setThirdModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier thirdModifierAlpha); - virtual void setDestinationArgument(unsigned int stage, TextureStage::DestinationArgument destinationArgument); - virtual void setConstantColor(unsigned int stage, const Color<float> &constantColor); - virtual void setBumpmapMatrix(unsigned int stage, int element, float value); - virtual void setLuminanceScale(unsigned int stage, float value); - virtual void setLuminanceOffset(unsigned int stage, float value); - - virtual void setTextureFilter(unsigned int sampler, FilterType textureFilter); - virtual void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter); - virtual void setGatherEnable(unsigned int sampler, bool enable); - virtual void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode); - virtual void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode); - virtual void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode); - virtual void setReadSRGB(unsigned int sampler, bool sRGB); - virtual void setMipmapLOD(unsigned int sampler, float bias); - virtual void setBorderColor(unsigned int sampler, const Color<float> &borderColor); - virtual void setMaxAnisotropy(unsigned int sampler, unsigned int maxAnisotropy); - - virtual void setWriteSRGB(bool sRGB); - virtual void setDepthBufferEnable(bool depthBufferEnable); - virtual void setDepthCompare(Context::DepthCompareMode depthCompareMode); - virtual void setAlphaCompare(Context::AlphaCompareMode alphaCompareMode); - virtual void setDepthWriteEnable(bool depthWriteEnable); - virtual void setAlphaTestEnable(bool alphaTestEnable); - virtual void setCullMode(Context::CullMode cullMode); - virtual void setColorWriteMask(int index, int rgbaMask); - - virtual void setStencilEnable(bool stencilEnable); - virtual void setStencilCompare(Context::StencilCompareMode stencilCompareMode); - virtual void setStencilReference(int stencilReference); - virtual void setStencilMask(int stencilMask); - virtual void setStencilFailOperation(Context::StencilOperation stencilFailOperation); - virtual void setStencilPassOperation(Context::StencilOperation stencilPassOperation); - virtual void setStencilZFailOperation(Context::StencilOperation stencilZFailOperation); - virtual void setStencilWriteMask(int stencilWriteMask); - virtual void setTwoSidedStencil(bool enable); - virtual void setStencilCompareCCW(Context::StencilCompareMode stencilCompareMode); - virtual void setStencilReferenceCCW(int stencilReference); - virtual void setStencilMaskCCW(int stencilMask); - virtual void setStencilFailOperationCCW(Context::StencilOperation stencilFailOperation); - virtual void setStencilPassOperationCCW(Context::StencilOperation stencilPassOperation); - virtual void setStencilZFailOperationCCW(Context::StencilOperation stencilZFailOperation); - virtual void setStencilWriteMaskCCW(int stencilWriteMask); - - virtual void setTextureFactor(const Color<float> &textureFactor); - virtual void setBlendConstant(const Color<float> &blendConstant); - - virtual void setFillMode(Context::FillMode fillMode); - virtual void setShadingMode(Context::ShadingMode shadingMode); - - virtual void setAlphaBlendEnable(bool alphaBlendEnable); - virtual void setSourceBlendFactor(Context::BlendFactor sourceBlendFactor); - virtual void setDestBlendFactor(Context::BlendFactor destBlendFactor); - virtual void setBlendOperation(Context::BlendOperation blendOperation); - - virtual void setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable); - virtual void setSourceBlendFactorAlpha(Context::BlendFactor sourceBlendFactorAlpha); - virtual void setDestBlendFactorAlpha(Context::BlendFactor destBlendFactorAlpha); - virtual void setBlendOperationAlpha(Context::BlendOperation blendOperationAlpha); - - virtual void setAlphaReference(int alphaReference); - - virtual void setGlobalMipmapBias(float bias); - - virtual void setFogStart(float start); - virtual void setFogEnd(float end); - virtual void setFogColor(Color<float> fogColor); - virtual void setFogDensity(float fogDensity); - virtual void setPixelFogMode(Context::FogMode fogMode); - - virtual void setPerspectiveCorrection(bool perspectiveCorrection); - - virtual void setOcclusionEnabled(bool enable); - - protected: - const State update() const; - Routine *routine(const State &state); - void setRoutineCacheSize(int routineCacheSize); - - // Shader constants - word4 cW[8][4]; - float4 c[224]; - int4 i[16]; - bool b[16]; - - // Other semi-constants - Stencil stencil; - Stencil stencilCCW; - Fog fog; - Factor factor; - - private: - void setFogRanges(float start, float end); - - Context *const context; - - LRUCache<State, Routine> *routineCache; - }; -} - -#endif // sw_PixelProcessor_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2012 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef sw_PixelProcessor_hpp +#define sw_PixelProcessor_hpp + +#include "Context.hpp" +#include "LRUCache.hpp" + +namespace sw +{ + class PixelShader; + class Rasterizer; + struct Texture; + class Routine; + struct DrawData; + + class PixelProcessor + { + public: + struct States + { + unsigned int computeHash(); + + int shaderID; + + unsigned int depthOverride : 1; + unsigned int shaderContainsKill : 1; + + unsigned int depthCompareMode : BITS(Context::DEPTH_LAST); + unsigned int alphaCompareMode : BITS(Context::ALPHA_LAST); + unsigned int depthWriteEnable : 1; + unsigned int quadLayoutDepthBuffer : 1; + + unsigned int stencilActive : 1; + unsigned int stencilCompareMode : BITS(Context::STENCIL_LAST); + unsigned int stencilFailOperation : BITS(Context::OPERATION_LAST); + unsigned int stencilPassOperation : BITS(Context::OPERATION_LAST); + unsigned int stencilZFailOperation : BITS(Context::OPERATION_LAST); + unsigned int noStencilMask : 1; + unsigned int noStencilWriteMask : 1; + unsigned int stencilWriteMasked : 1; + unsigned int twoSidedStencil : 1; + unsigned int stencilCompareModeCCW : BITS(Context::STENCIL_LAST); + unsigned int stencilFailOperationCCW : BITS(Context::OPERATION_LAST); + unsigned int stencilPassOperationCCW : BITS(Context::OPERATION_LAST); + unsigned int stencilZFailOperationCCW : BITS(Context::OPERATION_LAST); + unsigned int noStencilMaskCCW : 1; + unsigned int noStencilWriteMaskCCW : 1; + unsigned int stencilWriteMaskedCCW : 1; + + unsigned int depthTestActive : 1; + unsigned int fogActive : 1; + unsigned int pixelFogMode : BITS(Context::FOG_LAST); + unsigned int specularAdd : 1; + unsigned int occlusionEnabled : 1; + unsigned int wBasedFog : 1; + unsigned int perspective : 1; + + unsigned int alphaBlendActive : 1; + unsigned int sourceBlendFactor : BITS(Context::BLEND_LAST); + unsigned int destBlendFactor : BITS(Context::BLEND_LAST); + unsigned int blendOperation : BITS(Context::BLENDOP_LAST); + unsigned int sourceBlendFactorAlpha : BITS(Context::BLEND_LAST); + unsigned int destBlendFactorAlpha : BITS(Context::BLEND_LAST); + unsigned int blendOperationAlpha : BITS(Context::BLENDOP_LAST); + + unsigned int colorWriteMask : 16; // (four times four component bit mask) + unsigned char targetFormat[4]; + unsigned int writeSRGB : 1; + unsigned int multiSample : 3; + unsigned int multiSampleMask : 4; + unsigned int transparencyAntialiasing : BITS(Context::TRANSPARENCY_LAST); + unsigned int centroid : 1; + + Sampler::State sampler[16]; + TextureStage::State textureStage[8]; + + struct Interpolant + { + unsigned char component : 4; + unsigned char flat : 4; + unsigned char project : 2; + unsigned char centroid : 1; + }; + + union + { + struct + { + Interpolant color[2]; + Interpolant texture[8]; + Interpolant fog; + }; + + Interpolant interpolant[10]; + }; + }; + + struct State : States + { + State(); + + bool operator==(const State &state) const; + + int colorWriteActive(int index) const + { + return (colorWriteMask >> (index * 4)) & 0xF; + } + + bool alphaTestActive() const + { + return alphaCompareMode != Context::ALPHA_ALWAYS; + } + + bool pixelFogActive() const + { + return pixelFogMode != Context::FOG_NONE; + } + + unsigned int hash; + }; + + struct Stencil + { + int64_t testMaskQ; + int64_t referenceMaskedQ; + int64_t referenceMaskedSignedQ; + int64_t writeMaskQ; + int64_t invWriteMaskQ; + int64_t referenceQ; + + void set(int reference, int testMask, int writeMask) + { + referenceQ = replicate(reference); + testMaskQ = replicate(testMask); + writeMaskQ = replicate(writeMask); + invWriteMaskQ = ~writeMaskQ; + referenceMaskedQ = referenceQ & testMaskQ; + referenceMaskedSignedQ = replicate((reference + 0x80) & 0xFF & testMask); + } + + static int64_t replicate(int b) + { + int64_t w = b & 0xFF; + + return (w << 0) | (w << 8) | (w << 16) | (w << 24) | (w << 32) | (w << 40) | (w << 48) | (w << 56); + } + }; + + struct Fog + { + float4 scale; + float4 offset; + word4 color4[3]; + float4 colorF[3]; + float4 densityE; + float4 densityE2; + }; + + struct Factor + { + word4 textureFactor4[4]; + + word4 alphaReference4; + + word4 blendConstant4W[4]; + float4 blendConstant4F[4]; + word4 invBlendConstant4W[4]; + float4 invBlendConstant4F[4]; + }; + + public: + typedef void (__cdecl *RoutinePointer)(const Primitive *primitive, int count, int thread, DrawData *draw); + + PixelProcessor(Context *context); + + virtual ~PixelProcessor(); + + virtual void setFloatConstant(unsigned int index, const float value[4]); + virtual void setIntegerConstant(unsigned int index, const int value[4]); + virtual void setBooleanConstant(unsigned int index, int boolean); + + virtual void setRenderTarget(int index, Surface *renderTarget); + virtual void setDepthStencil(Surface *depthStencil); + + virtual void setTexCoordIndex(unsigned int stage, int texCoordIndex); + virtual void setStageOperation(unsigned int stage, TextureStage::StageOperation stageOperation); + virtual void setFirstArgument(unsigned int stage, TextureStage::SourceArgument firstArgument); + virtual void setSecondArgument(unsigned int stage, TextureStage::SourceArgument secondArgument); + virtual void setThirdArgument(unsigned int stage, TextureStage::SourceArgument thirdArgument); + virtual void setStageOperationAlpha(unsigned int stage, TextureStage::StageOperation stageOperationAlpha); + virtual void setFirstArgumentAlpha(unsigned int stage, TextureStage::SourceArgument firstArgumentAlpha); + virtual void setSecondArgumentAlpha(unsigned int stage, TextureStage::SourceArgument secondArgumentAlpha); + virtual void setThirdArgumentAlpha(unsigned int stage, TextureStage::SourceArgument thirdArgumentAlpha); + virtual void setFirstModifier(unsigned int stage, TextureStage::ArgumentModifier firstModifier); + virtual void setSecondModifier(unsigned int stage, TextureStage::ArgumentModifier secondModifier); + virtual void setThirdModifier(unsigned int stage, TextureStage::ArgumentModifier thirdModifier); + virtual void setFirstModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier firstModifierAlpha); + virtual void setSecondModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier secondModifierAlpha); + virtual void setThirdModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier thirdModifierAlpha); + virtual void setDestinationArgument(unsigned int stage, TextureStage::DestinationArgument destinationArgument); + virtual void setConstantColor(unsigned int stage, const Color<float> &constantColor); + virtual void setBumpmapMatrix(unsigned int stage, int element, float value); + virtual void setLuminanceScale(unsigned int stage, float value); + virtual void setLuminanceOffset(unsigned int stage, float value); + + virtual void setTextureFilter(unsigned int sampler, FilterType textureFilter); + virtual void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter); + virtual void setGatherEnable(unsigned int sampler, bool enable); + virtual void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode); + virtual void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode); + virtual void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode); + virtual void setReadSRGB(unsigned int sampler, bool sRGB); + virtual void setMipmapLOD(unsigned int sampler, float bias); + virtual void setBorderColor(unsigned int sampler, const Color<float> &borderColor); + virtual void setMaxAnisotropy(unsigned int sampler, unsigned int maxAnisotropy); + + virtual void setWriteSRGB(bool sRGB); + virtual void setDepthBufferEnable(bool depthBufferEnable); + virtual void setDepthCompare(Context::DepthCompareMode depthCompareMode); + virtual void setAlphaCompare(Context::AlphaCompareMode alphaCompareMode); + virtual void setDepthWriteEnable(bool depthWriteEnable); + virtual void setAlphaTestEnable(bool alphaTestEnable); + virtual void setCullMode(Context::CullMode cullMode); + virtual void setColorWriteMask(int index, int rgbaMask); + + virtual void setStencilEnable(bool stencilEnable); + virtual void setStencilCompare(Context::StencilCompareMode stencilCompareMode); + virtual void setStencilReference(int stencilReference); + virtual void setStencilMask(int stencilMask); + virtual void setStencilFailOperation(Context::StencilOperation stencilFailOperation); + virtual void setStencilPassOperation(Context::StencilOperation stencilPassOperation); + virtual void setStencilZFailOperation(Context::StencilOperation stencilZFailOperation); + virtual void setStencilWriteMask(int stencilWriteMask); + virtual void setTwoSidedStencil(bool enable); + virtual void setStencilCompareCCW(Context::StencilCompareMode stencilCompareMode); + virtual void setStencilReferenceCCW(int stencilReference); + virtual void setStencilMaskCCW(int stencilMask); + virtual void setStencilFailOperationCCW(Context::StencilOperation stencilFailOperation); + virtual void setStencilPassOperationCCW(Context::StencilOperation stencilPassOperation); + virtual void setStencilZFailOperationCCW(Context::StencilOperation stencilZFailOperation); + virtual void setStencilWriteMaskCCW(int stencilWriteMask); + + virtual void setTextureFactor(const Color<float> &textureFactor); + virtual void setBlendConstant(const Color<float> &blendConstant); + + virtual void setFillMode(Context::FillMode fillMode); + virtual void setShadingMode(Context::ShadingMode shadingMode); + + virtual void setAlphaBlendEnable(bool alphaBlendEnable); + virtual void setSourceBlendFactor(Context::BlendFactor sourceBlendFactor); + virtual void setDestBlendFactor(Context::BlendFactor destBlendFactor); + virtual void setBlendOperation(Context::BlendOperation blendOperation); + + virtual void setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable); + virtual void setSourceBlendFactorAlpha(Context::BlendFactor sourceBlendFactorAlpha); + virtual void setDestBlendFactorAlpha(Context::BlendFactor destBlendFactorAlpha); + virtual void setBlendOperationAlpha(Context::BlendOperation blendOperationAlpha); + + virtual void setAlphaReference(int alphaReference); + + virtual void setGlobalMipmapBias(float bias); + + virtual void setFogStart(float start); + virtual void setFogEnd(float end); + virtual void setFogColor(Color<float> fogColor); + virtual void setFogDensity(float fogDensity); + virtual void setPixelFogMode(Context::FogMode fogMode); + + virtual void setPerspectiveCorrection(bool perspectiveCorrection); + + virtual void setOcclusionEnabled(bool enable); + + protected: + const State update() const; + Routine *routine(const State &state); + void setRoutineCacheSize(int routineCacheSize); + + // Shader constants + word4 cW[8][4]; + float4 c[224]; + int4 i[16]; + bool b[16]; + + // Other semi-constants + Stencil stencil; + Stencil stencilCCW; + Fog fog; + Factor factor; + + private: + void setFogRanges(float start, float end); + + Context *const context; + + LRUCache<State, Routine> *routineCache; + HMODULE precacheDLL; + }; +} + +#endif // sw_PixelProcessor_hpp
diff --git a/src/Renderer/Plane.hpp b/src/Renderer/Plane.hpp index 34f7679..0c0ef32 100644 --- a/src/Renderer/Plane.hpp +++ b/src/Renderer/Plane.hpp
@@ -1,69 +1,69 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef Plane_hpp -#define Plane_hpp - -#include "Vector.hpp" - -namespace sw -{ - struct Matrix; - struct Point; - - struct Plane - { - union - { - struct - { - float A; - float B; - float C; - }; - struct - { - Vector n; - }; - }; - - float D; // Distance to origin along normal - - Plane(); - Plane(const Plane &p); - Plane(const Vector &n, float D); // Normal and distance to origin - Plane(const Vector &n, const Point &P); // Normal and point on plane - Plane(const Point &P0, const Point &P1, const Point &P2); // Through three points - Plane(float A, float B, float C, float D); // Plane equation - Plane(const float ABCD[4]); - - Plane &operator=(const Plane &p); - - Plane operator+() const; - Plane operator-() const; // Flip normal - - Plane &operator*=(const Matrix &A); // Transform plane by matrix (post-multiply) - - friend Plane operator*(const Plane &p, const Matrix &A); // Transform plane by matrix (post-multiply) - friend Plane operator*(const Matrix &A, const Plane &p); // Transform plane by matrix (pre-multiply) - - friend float operator^(const Plane &p1, const Plane &p2); // Angle between planes - - float d(const Point &P) const; // Oriented distance between point and plane - - static float d(const Point &P, const Plane &p); // Oriented distance between point and plane - static float d(const Plane &p, const Point &P); // Oriented distance between plane and point - - Plane &normalise(); // Normalise the Plane equation - }; -} - -#endif // Plane_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2011 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef Plane_hpp +#define Plane_hpp + +#include "Vector.hpp" + +namespace sw +{ + struct Matrix; + struct Point; + + struct Plane + { + union + { + struct + { + float A; + float B; + float C; + }; + struct + { + Vector n; + }; + }; + + float D; // Distance to origin along normal + + Plane(); + Plane(const Plane &p); + Plane(const Vector &n, float D); // Normal and distance to origin + Plane(const Vector &n, const Point &P); // Normal and point on plane + Plane(const Point &P0, const Point &P1, const Point &P2); // Through three points + Plane(float A, float B, float C, float D); // Plane equation + Plane(const float ABCD[4]); + + Plane &operator=(const Plane &p); + + Plane operator+() const; + Plane operator-() const; // Flip normal + + Plane &operator*=(const Matrix &A); // Transform plane by matrix (post-multiply) + + friend Plane operator*(const Plane &p, const Matrix &A); // Transform plane by matrix (post-multiply) + friend Plane operator*(const Matrix &A, const Plane &p); // Transform plane by matrix (pre-multiply) + + friend float operator^(const Plane &p1, const Plane &p2); // Angle between planes + + float d(const Point &P) const; // Oriented distance between point and plane + + static float d(const Point &P, const Plane &p); // Oriented distance between point and plane + static float d(const Plane &p, const Point &P); // Oriented distance between plane and point + + Plane &normalise(); // Normalise the Plane equation + }; +} + +#endif // Plane_hpp
diff --git a/src/Renderer/Point.hpp b/src/Renderer/Point.hpp index 7b50f58..1448ee0 100644 --- a/src/Renderer/Point.hpp +++ b/src/Renderer/Point.hpp
@@ -1,136 +1,136 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef Point_hpp -#define Point_hpp - -namespace sw -{ - struct Vector; - struct Matrix; - - struct Point - { - Point(); - Point(const int i); - Point(const Point &P); - Point(const Vector &v); - Point(float Px, float Py, float Pz); - - Point &operator=(const Point &P); - - union - { - float p[3]; - - struct - { - float x; - float y; - float z; - }; - }; - - float &operator[](int i); - float &operator()(int i); - - const float &operator[](int i) const; - const float &operator()(int i) const; - - Point &operator+=(const Vector &v); - Point &operator-=(const Vector &v); - - friend Point operator+(const Point &P, const Vector &v); - friend Point operator-(const Point &P, const Vector &v); - - friend Vector operator-(const Point &P, const Point &Q); - - friend Point operator*(const Matrix &M, const Point& P); - friend Point operator*(const Point &P, const Matrix &M); - friend Point &operator*=(Point &P, const Matrix &M); - - float d(const Point &P) const; // Distance between two points - float d2(const Point &P) const; // Squared distance between two points - - static float d(const Point &P, const Point &Q); // Distance between two points - static float d2(const Point &P, const Point &Q); // Squared distance between two points - }; -} - -#include "Vector.hpp" - -namespace sw -{ - inline Point::Point() - { - } - - inline Point::Point(const int i) - { - const float s = (float)i; - - x = s; - y = s; - z = s; - } - - inline Point::Point(const Point &P) - { - x = P.x; - y = P.y; - z = P.z; - } - - inline Point::Point(const Vector &v) - { - x = v.x; - y = v.y; - z = v.z; - } - - inline Point::Point(float P_x, float P_y, float P_z) - { - x = P_x; - y = P_y; - z = P_z; - } - - inline Point &Point::operator=(const Point &P) - { - x = P.x; - y = P.y; - z = P.z; - - return *this; - } - - inline float &Point::operator()(int i) - { - return p[i]; - } - - inline float &Point::operator[](int i) - { - return p[i]; - } - - inline const float &Point::operator()(int i) const - { - return p[i]; - } - - inline const float &Point::operator[](int i) const - { - return p[i]; - } -} - -#endif // Point_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2011 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef Point_hpp +#define Point_hpp + +namespace sw +{ + struct Vector; + struct Matrix; + + struct Point + { + Point(); + Point(const int i); + Point(const Point &P); + Point(const Vector &v); + Point(float Px, float Py, float Pz); + + Point &operator=(const Point &P); + + union + { + float p[3]; + + struct + { + float x; + float y; + float z; + }; + }; + + float &operator[](int i); + float &operator()(int i); + + const float &operator[](int i) const; + const float &operator()(int i) const; + + Point &operator+=(const Vector &v); + Point &operator-=(const Vector &v); + + friend Point operator+(const Point &P, const Vector &v); + friend Point operator-(const Point &P, const Vector &v); + + friend Vector operator-(const Point &P, const Point &Q); + + friend Point operator*(const Matrix &M, const Point& P); + friend Point operator*(const Point &P, const Matrix &M); + friend Point &operator*=(Point &P, const Matrix &M); + + float d(const Point &P) const; // Distance between two points + float d2(const Point &P) const; // Squared distance between two points + + static float d(const Point &P, const Point &Q); // Distance between two points + static float d2(const Point &P, const Point &Q); // Squared distance between two points + }; +} + +#include "Vector.hpp" + +namespace sw +{ + inline Point::Point() + { + } + + inline Point::Point(const int i) + { + const float s = (float)i; + + x = s; + y = s; + z = s; + } + + inline Point::Point(const Point &P) + { + x = P.x; + y = P.y; + z = P.z; + } + + inline Point::Point(const Vector &v) + { + x = v.x; + y = v.y; + z = v.z; + } + + inline Point::Point(float P_x, float P_y, float P_z) + { + x = P_x; + y = P_y; + z = P_z; + } + + inline Point &Point::operator=(const Point &P) + { + x = P.x; + y = P.y; + z = P.z; + + return *this; + } + + inline float &Point::operator()(int i) + { + return p[i]; + } + + inline float &Point::operator[](int i) + { + return p[i]; + } + + inline const float &Point::operator()(int i) const + { + return p[i]; + } + + inline const float &Point::operator[](int i) const + { + return p[i]; + } +} + +#endif // Point_hpp
diff --git a/src/Renderer/QuadRasterizer.cpp b/src/Renderer/QuadRasterizer.cpp index 10fcf16..d4548fe 100644 --- a/src/Renderer/QuadRasterizer.cpp +++ b/src/Renderer/QuadRasterizer.cpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -45,7 +45,7 @@ Int cluster(function.arg(2)); Pointer<Byte> data(function.arg(3)); - Registers r; + Registers r(shader); r.constants = *Pointer<Pointer<Byte>>(data + OFFSET(DrawData,constants)); r.cluster = cluster; r.data = data; @@ -91,7 +91,7 @@ Return(); } - routine = function(L"PixelRoutine_%0.16llX", state.shaderHash); + routine = function(L"PixelRoutine_%0.8X", state.shaderID); } void QuadRasterizer::rasterize(Registers &r, Int &yMin, Int &yMax) @@ -128,35 +128,35 @@ x0 = Int(*Pointer<Short>(r.primitive + OFFSET(Primitive,outline->left) + (y + 0) * sizeof(Primitive::Span))); x2 = Int(*Pointer<Short>(r.primitive + OFFSET(Primitive,outline->left) + (y + 1) * sizeof(Primitive::Span))); - x0 = IfThenElse(x0 < x2, x0, x2); + x0 = Min(x0, x2); for(unsigned int q = 1; q < state.multiSample; q++) { Int x0q = Int(*Pointer<Short>(r.primitive + q * sizeof(Primitive) + OFFSET(Primitive,outline->left) + (y + 0) * sizeof(Primitive::Span))); Int x2q = Int(*Pointer<Short>(r.primitive + q * sizeof(Primitive) + OFFSET(Primitive,outline->left) + (y + 1) * sizeof(Primitive::Span))); - x0q = IfThenElse(x0q < x2q, x0q, x2q); + x0q = Min(x0q, x2q); - x0 = IfThenElse(x0q < x0, x0q, x0); + x0 = Min(x0q, x0); } x0 &= 0xFFFFFFFE; x1 = Int(*Pointer<Short>(r.primitive + OFFSET(Primitive,outline->right) + (y + 0) * sizeof(Primitive::Span))); x2 = Int(*Pointer<Short>(r.primitive + OFFSET(Primitive,outline->right) + (y + 1) * sizeof(Primitive::Span))); - x1 = IfThenElse(x1 > x2, x1, x2); + x1 = Max(x1, x2); for(unsigned int q = 1; q < state.multiSample; q++) { Int x1q = Int(*Pointer<Short>(r.primitive + q * sizeof(Primitive) + OFFSET(Primitive,outline->right) + (y + 0) * sizeof(Primitive::Span))); Int x2q = Int(*Pointer<Short>(r.primitive + q * sizeof(Primitive) + OFFSET(Primitive,outline->right) + (y + 1) * sizeof(Primitive::Span))); - x1q = IfThenElse(x1q > x2q, x1q, x2q); + x1q = Max(x1q, x2q); - x1 = IfThenElse(x1q > x1, x1q, x1); + x1 = Max(x1q, x1); } Float4 yyyy = Float4(Float(y)) + *Pointer<Float4>(r.primitive + OFFSET(Primitive,yQuad), 16); - if(state.depthTestActive || state.pixelFogActive()) + if(interpolateZ()) { for(unsigned int q = 0; q < state.multiSample; q++) { @@ -245,7 +245,7 @@ If(x0 < x1) { - if(state.perspective) + if(interpolateW()) { r.Dw = *Pointer<Float4>(r.primitive + OFFSET(Primitive,w.C), 16) + yyyy * *Pointer<Float4>(r.primitive + OFFSET(Primitive,w.B), 16); } @@ -299,18 +299,18 @@ { if(state.colorWriteActive(index)) { - cBuffer[index] += *Pointer<Int>(r.data + OFFSET(DrawData,colorPitchB[index])) << (1 + log2(clusterCount)); // FIXME: Precompute + cBuffer[index] += *Pointer<Int>(r.data + OFFSET(DrawData,colorPitchB[index])) << (1 + sw::log2(clusterCount)); // FIXME: Precompute } } if(state.depthTestActive) { - zBuffer += *Pointer<Int>(r.data + OFFSET(DrawData,depthPitchB)) << (1 + log2(clusterCount)); // FIXME: Precompute + zBuffer += *Pointer<Int>(r.data + OFFSET(DrawData,depthPitchB)) << (1 + sw::log2(clusterCount)); // FIXME: Precompute } if(state.stencilActive) { - sBuffer += *Pointer<Int>(r.data + OFFSET(DrawData,stencilPitchB)) << (1 + log2(clusterCount)); // FIXME: Precompute + sBuffer += *Pointer<Int>(r.data + OFFSET(DrawData,stencilPitchB)) << (1 + sw::log2(clusterCount)); // FIXME: Precompute } y += 2 * clusterCount;
diff --git a/src/Renderer/QuadRasterizer.hpp b/src/Renderer/QuadRasterizer.hpp index 36184cc..4edfeac 100644 --- a/src/Renderer/QuadRasterizer.hpp +++ b/src/Renderer/QuadRasterizer.hpp
@@ -1,34 +1,34 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_QuadRasterizer_hpp -#define sw_QuadRasterizer_hpp - -#include "Rasterizer.hpp" -#include "PixelRoutine.hpp" - -namespace sw -{ - class QuadRasterizer : public PixelRoutine - { - public: - QuadRasterizer(const PixelProcessor::State &state, const PixelShader *pixelShader); - - virtual ~QuadRasterizer(); - - private: - void generate(); - - void rasterize(Registers &r, Int &yMin, Int &yMax); - }; -} - -#endif // sw_QuadRasterizer_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2011 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef sw_QuadRasterizer_hpp +#define sw_QuadRasterizer_hpp + +#include "Rasterizer.hpp" +#include "PixelRoutine.hpp" + +namespace sw +{ + class QuadRasterizer : public PixelRoutine + { + public: + QuadRasterizer(const PixelProcessor::State &state, const PixelShader *pixelShader); + + virtual ~QuadRasterizer(); + + private: + void generate(); + + void rasterize(Registers &r, Int &yMin, Int &yMax); + }; +} + +#endif // sw_QuadRasterizer_hpp
diff --git a/src/Renderer/Rasterizer.hpp b/src/Renderer/Rasterizer.hpp index 0037379..061b399 100644 --- a/src/Renderer/Rasterizer.hpp +++ b/src/Renderer/Rasterizer.hpp
@@ -1,39 +1,39 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Rasterizer_hpp -#define sw_Rasterizer_hpp - -#include "Context.hpp" - -#include "PixelProcessor.hpp" -#include "Config.hpp" - -namespace sw -{ - class Rasterizer - { - public: - Rasterizer(const PixelProcessor::State &state); - - virtual ~Rasterizer(); - - virtual void generate() = 0; - Routine *getRoutine(); - - protected: - Routine *routine; - - const PixelProcessor::State &state; - }; -} - -#endif // sw_Rasterizer_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2011 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef sw_Rasterizer_hpp +#define sw_Rasterizer_hpp + +#include "Context.hpp" + +#include "PixelProcessor.hpp" +#include "Config.hpp" + +namespace sw +{ + class Rasterizer + { + public: + Rasterizer(const PixelProcessor::State &state); + + virtual ~Rasterizer(); + + virtual void generate() = 0; + Routine *getRoutine(); + + protected: + Routine *routine; + + const PixelProcessor::State &state; + }; +} + +#endif // sw_Rasterizer_hpp
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp index 0194f38..6a5195d 100644 --- a/src/Renderer/Renderer.cpp +++ b/src/Renderer/Renderer.cpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -26,8 +26,7 @@ #include "Resource.hpp" #include "Constants.hpp" #include "Debug.hpp" -#include "SwiftShader.h" -#include "Reactor/Shell.hpp" +#include "Reactor/Reactor.hpp" #include <malloc.h> #include <assert.h> @@ -35,10 +34,7 @@ #undef max -SWFILTER maximumFilterQuality = SWF_DEFAULT; -SWFILTER maximumMipmapQuality = SWF_DEFAULT; -SWPERSPECTIVE perspectiveQuality = SWP_DEFAULT; -bool disableServer = false; +bool disableServer = true; #ifndef NDEBUG unsigned int minPrimitives = 1; @@ -47,6 +43,11 @@ namespace sw { + extern bool halfIntegerCoordinates; // Pixel centers are not at integer coordinates + extern bool symmetricNormalizedDepth; // [-1, 1] instead of [0, 1] + extern bool booleanFaceRegister; + extern bool fullPixelPositionRegister; + extern bool forceWindowed; extern bool complementaryDepthBuffer; extern bool postBlendSRGB; @@ -54,17 +55,17 @@ extern Context::TransparencyAntialiasing transparencyAntialiasing; extern bool forceClearRegisters; - extern TranscendentalPrecision logPrecision; - extern TranscendentalPrecision expPrecision; - extern TranscendentalPrecision rcpPrecision; - extern TranscendentalPrecision rsqPrecision; - extern bool perspectiveCorrection; - int batchSize = 128; int threadCount = 1; int unitCount = 1; int clusterCount = 1; + TranscendentalPrecision logPrecision = ACCURATE; + TranscendentalPrecision expPrecision = ACCURATE; + TranscendentalPrecision rcpPrecision = ACCURATE; + TranscendentalPrecision rsqPrecision = ACCURATE; + bool perspectiveCorrection = true; + struct Parameters { Renderer *renderer; @@ -96,15 +97,17 @@ deallocate(data); } - Renderer::Renderer(Context *context, Surface *renderTarget) : context(context), VertexProcessor(context), PixelProcessor(context), SetupProcessor(context), viewport() + Renderer::Renderer(Context *context, bool halfIntegerCoordinates, bool symmetricNormalizedDepth, bool booleanFaceRegister, bool fullPixelPositionRegister, bool exactColorRounding) : context(context), VertexProcessor(context), PixelProcessor(context), SetupProcessor(context), viewport() { - setRenderTarget(0, renderTarget); + sw::halfIntegerCoordinates = halfIntegerCoordinates; + sw::symmetricNormalizedDepth = symmetricNormalizedDepth; + sw::booleanFaceRegister = booleanFaceRegister; + sw::fullPixelPositionRegister = fullPixelPositionRegister; + sw::exactColorRounding = exactColorRounding; + setRenderTarget(0, 0); clipper = new Clipper(); - posScale = vector(1.0f, 1.0f, 1.0f, 1.0f); - posOffset = vector(0.0f, 0.0f, 0.0f, 0.0f); - updateViewMatrix = true; updateBaseMatrix = true; updateProjectionMatrix = true; @@ -158,11 +161,14 @@ swiftConfig = new SwiftConfig(disableServer); updateConfiguration(true); - startupConfiguration(); + + sync = new Resource(0); } Renderer::~Renderer() { + sync->destruct(); + delete clipper; clipper = 0; @@ -204,13 +210,15 @@ for(int q = 0; q < ss; q++) { int oldMultiSampleMask = context->multiSampleMask; - context->multiSampleMask = (context->sampleMask >> (ms * q)) & ((unsigned)0xFFFFFFFF >> (32 - ms)); + context->multiSampleMask = (context->sampleMask >> (ms * q)) & ((unsigned)0xFFFFFFFF >> (32 - ms)); if(!context->multiSampleMask) { continue; } + sync->lock(sw::PRIVATE); + if(update || oldMultiSampleMask != context->multiSampleMask) { vertexState = VertexProcessor::update(); @@ -471,12 +479,12 @@ // Viewport { - float W = 0.5f * viewport.getWidth(); - float H = 0.5f * viewport.getHeight(); - float L = viewport.getLeft() + W; - float T = viewport.getTop() + H; - float N = viewport.getNear(); - float F = viewport.getFar(); + float W = 0.5f * viewport.width; + float H = 0.5f * viewport.height; + float X0 = viewport.x0 + W; + float Y0 = viewport.y0 + H; + float N = viewport.minZ; + float F = viewport.maxZ; float Z = F - N; if(context->isDrawTriangle(false)) @@ -510,17 +518,15 @@ int s = sw::log2(ss); - data->WWWWx16 = replicate(W * 16); - data->HHHHx16 = replicate(-H * 16); - data->LLLLx16 = replicate(L * 16); - data->TTTTx16 = replicate(T * 16); + data->Wx16 = replicate(W * 16); + data->Hx16 = replicate(H * 16); + data->X0x16 = replicate(X0 * 16); + data->Y0x16 = replicate(Y0 * 16); data->XXXX = replicate(X[s][q] / W); data->YYYY = replicate(Y[s][q] / H); - data->offX = replicate(+0.5f / W); - data->offY = replicate(-0.5f / H); - data->posScale = posScale; - data->posOffset = posOffset; - data->viewportHeight = viewport.getHeight(); // FIXME: Should use true viewport size, not scissored viewport + data->halfPixelX = replicate(0.5f / W); + data->halfPixelY = replicate(0.5f / H); + data->viewportHeight = abs(viewport.height); data->slopeDepthBias = slopeDepthBias; data->depthRange = Z; data->depthNear = N; @@ -565,6 +571,14 @@ } } + // Scissor + { + data->scissorX0 = scissor.x0; + data->scissorX1 = scissor.x1; + data->scissorY0 = scissor.y0; + data->scissorY1 = scissor.y1; + } + draw->primitive = 0; draw->count = count; @@ -809,6 +823,12 @@ } } + void Renderer::synchronize() + { + sync->lock(sw::PUBLIC); + sync->unlock(); + } + void Renderer::finishRendering(Task &pixelTask) { int unit = pixelTask.primitiveUnit; @@ -902,6 +922,8 @@ draw.setupRoutine->unbind(); draw.pixelRoutine->unbind(); + sync->unlock(); + draw.references = -1; resumeApp->signal(); } @@ -1534,8 +1556,8 @@ return false; } - const float W = data.WWWWx16[0] * (1.0f / 16.0f); - const float H = -data.HHHHx16[0] * (1.0f / 16.0f); + const float W = data.Wx16[0] * (1.0f / 16.0f); + const float H = data.Hx16[0] * (1.0f / 16.0f); float dx = W * (P1.x / P1.w - P0.x / P0.w); float dy = H * (P1.y / P1.w - P0.y / P0.w); @@ -1570,20 +1592,20 @@ float dx1h = dx * P1.w / H; float dy1w = dy * P1.w / W; - P[0].x += +dy0w + -dx0w; - P[0].y += -dx0h + -dy0h; + P[0].x += -dy0w + -dx0w; + P[0].y += -dx0h + +dy0h; C[0] = computeClipFlags(P[0], data); - P[1].x += +dy1w + +dx1w; + P[1].x += -dy1w + +dx1w; P[1].y += -dx1h + +dy1h; C[1] = computeClipFlags(P[1], data); - P[2].x += -dy1w + +dx1w; - P[2].y += +dx1h + +dy1h; + P[2].x += +dy1w + +dx1w; + P[2].y += +dx1h + -dy1h; C[2] = computeClipFlags(P[2], data); - P[3].x += -dy0w + -dx0w; - P[3].y += +dx0h + -dy0h; + P[3].x += +dy0w + -dx0w; + P[3].y += +dx0h + +dy0h; C[3] = computeClipFlags(P[3], data); if((C[0] & C[1] & C[2] & C[3]) == Clipper::CLIP_FINITE) @@ -1626,34 +1648,34 @@ P[0].x += -dx0; C[0] = computeClipFlags(P[0], data); - P[1].y += -dy0; + P[1].y += +dy0; C[1] = computeClipFlags(P[1], data); P[2].x += +dx0; C[2] = computeClipFlags(P[2], data); - P[3].y += +dy0; + P[3].y += -dy0; C[3] = computeClipFlags(P[3], data); P[4].x += -dx1; C[4] = computeClipFlags(P[4], data); - P[5].y += -dy1; + P[5].y += +dy1; C[5] = computeClipFlags(P[5], data); P[6].x += +dx1; C[6] = computeClipFlags(P[6], data); - P[7].y += +dy1; + P[7].y += -dy1; C[7] = computeClipFlags(P[7], data); if((C[0] & C[1] & C[2] & C[3] & C[4] & C[5] & C[6] & C[7]) == Clipper::CLIP_FINITE) { float4 L[6]; - if(dx > dy) + if(dx > -dy) { - if(dx > -dy) // Right + if(dx > dy) // Right { L[0] = P[0]; L[1] = P[1]; @@ -1674,7 +1696,7 @@ } else { - if(dx > -dy) // Up + if(dx > dy) // Up { L[0] = P[0]; L[1] = P[1]; @@ -1746,30 +1768,30 @@ P[2] = v.v[pos]; P[3] = v.v[pos]; - const float X = 0.5f * pSize * P[0].w / (data.WWWWx16[0] * (1.0f / 16.0f)); - const float Y = 0.5f * pSize * P[0].w / -(data.HHHHx16[0] * (1.0f / 16.0f)); + const float X = pSize * P[0].w * data.halfPixelX[0]; + const float Y = pSize * P[0].w * data.halfPixelY[0]; P[0].x -= X; - P[0].y -= Y; + P[0].y += Y; C[0] = computeClipFlags(P[0], data); P[1].x += X; - P[1].y -= Y; + P[1].y += Y; C[1] = computeClipFlags(P[1], data); P[2].x += X; - P[2].y += Y; + P[2].y -= Y; C[2] = computeClipFlags(P[2], data); P[3].x -= X; - P[3].y += Y; + P[3].y -= Y; C[3] = computeClipFlags(P[3], data); triangle.v1 = triangle.v0; triangle.v2 = triangle.v0; triangle.v1.X += iround(16 * 0.5f * pSize); - triangle.v2.Y -= iround(16 * 0.5f * pSize); + triangle.v2.Y -= iround(16 * 0.5f * pSize) * (data.Hx16[0] > 0.0f ? 1 : -1); // Both Direct3D and OpenGL expect (0, 0) in the top-left corner Polygon polygon(P, 4); @@ -1793,8 +1815,8 @@ unsigned int Renderer::computeClipFlags(const float4 &v, const DrawData &data) { - float clX = v.x + data.offX[0] * v.w; - float clY = v.y + data.offY[0] * v.w; + float clX = v.x + data.halfPixelX[0] * v.w; + float clY = v.y + data.halfPixelY[0] * v.w; return ((clX > v.w) << 0) | ((clY > v.w) << 1) | @@ -1846,7 +1868,7 @@ { while(threadsAwake != 0) { - Thread::sleep(100); + Thread::sleep(1); } for(int thread = 0; thread < threadCount; thread++) @@ -1890,38 +1912,36 @@ for(int i = 0; i < count; i++) { - const ShaderInstruction *instruction = vertexShader->getInstruction(i); + const Shader::Instruction *instruction = vertexShader->getInstruction(i); - if(instruction->getOpcode() == VertexShaderInstruction::Operation::OPCODE_DEF) + if(instruction->opcode == Shader::OPCODE_DEF) { - int index = instruction->getDestinationParameter().index; + int index = instruction->dst.index; float value[4]; - value[0] = instruction->getSourceParameter(0).value; - value[1] = instruction->getSourceParameter(1).value; - value[2] = instruction->getSourceParameter(2).value; - value[3] = instruction->getSourceParameter(3).value; + value[0] = instruction->src[0].value[0]; + value[1] = instruction->src[0].value[1]; + value[2] = instruction->src[0].value[2]; + value[3] = instruction->src[0].value[3]; setVertexShaderConstantF(index, value); } - else if(instruction->getOpcode() == VertexShaderInstruction::Operation::OPCODE_DEFI) + else if(instruction->opcode == Shader::OPCODE_DEFI) { - int index = instruction->getDestinationParameter().index; + int index = instruction->dst.index; int integer[4]; - integer[0] = instruction->getSourceParameter(0).integer; - integer[1] = instruction->getSourceParameter(1).integer; - integer[2] = instruction->getSourceParameter(2).integer; - integer[3] = instruction->getSourceParameter(3).integer; + integer[0] = instruction->src[0].integer[0]; + integer[1] = instruction->src[0].integer[1]; + integer[2] = instruction->src[0].integer[2]; + integer[3] = instruction->src[0].integer[3]; setVertexShaderConstantI(index, integer); } - else if(instruction->getOpcode() == VertexShaderInstruction::Operation::OPCODE_DEFB) + else if(instruction->opcode == Shader::OPCODE_DEFB) { - int index = instruction->getDestinationParameter().index; - int boolean; - - boolean = instruction->getSourceParameter(0).boolean; + int index = instruction->dst.index; + int boolean = instruction->src[0].boolean[0]; setVertexShaderConstantB(index, &boolean); } @@ -1936,38 +1956,36 @@ for(int i = 0; i < count; i++) { - const ShaderInstruction *instruction = pixelShader->getInstruction(i); + const Shader::Instruction *instruction = pixelShader->getInstruction(i); - if(instruction->getOpcode() == PixelShaderInstruction::Operation::OPCODE_DEF) + if(instruction->opcode == Shader::OPCODE_DEF) { - int index = instruction->getDestinationParameter().index; + int index = instruction->dst.index; float value[4]; - value[0] = instruction->getSourceParameter(0).value; - value[1] = instruction->getSourceParameter(1).value; - value[2] = instruction->getSourceParameter(2).value; - value[3] = instruction->getSourceParameter(3).value; + value[0] = instruction->src[0].value[0]; + value[1] = instruction->src[0].value[1]; + value[2] = instruction->src[0].value[2]; + value[3] = instruction->src[0].value[3]; setPixelShaderConstantF(index, value); } - else if(instruction->getOpcode() == PixelShaderInstruction::Operation::OPCODE_DEFI) + else if(instruction->opcode == Shader::OPCODE_DEFI) { - int index = instruction->getDestinationParameter().index; + int index = instruction->dst.index; int integer[4]; - integer[0] = instruction->getSourceParameter(0).integer; - integer[1] = instruction->getSourceParameter(1).integer; - integer[2] = instruction->getSourceParameter(2).integer; - integer[3] = instruction->getSourceParameter(3).integer; + integer[0] = instruction->src[0].integer[0]; + integer[1] = instruction->src[0].integer[1]; + integer[2] = instruction->src[0].integer[2]; + integer[3] = instruction->src[0].integer[3]; setPixelShaderConstantI(index, integer); } - else if(instruction->getOpcode() == PixelShaderInstruction::Operation::OPCODE_DEFB) + else if(instruction->opcode == Shader::OPCODE_DEFB) { - int index = instruction->getDestinationParameter().index; - int boolean; - - boolean = instruction->getSourceParameter(0).boolean; + int index = instruction->dst.index; + int boolean = instruction->src[0].boolean[0]; setPixelShaderConstantB(index, &boolean); } @@ -2011,15 +2029,9 @@ { if(updateClipPlanes) { - // Transformation from viewport clip space to scissored viewport clip space - Matrix scissorClip(posScale.x, 0.0f, 0.0f, posOffset.x, - 0.0f, posScale.y, 0.0f, posOffset.y, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f , 0.0f, 0.0f, 1.0f); - if(VertexProcessor::isFixedFunction()) // User plane in world space { - const Matrix &scissorWorld = scissorClip * getViewTransform(); + const Matrix &scissorWorld = getViewTransform(); if(clipFlags & Clipper::CLIP_PLANE0) clipPlane[0] = scissorWorld * userPlane[0]; if(clipFlags & Clipper::CLIP_PLANE1) clipPlane[1] = scissorWorld * userPlane[1]; @@ -2030,12 +2042,12 @@ } else // User plane in clip space { - if(clipFlags & Clipper::CLIP_PLANE0) clipPlane[0] = scissorClip * userPlane[0]; - if(clipFlags & Clipper::CLIP_PLANE1) clipPlane[1] = scissorClip * userPlane[1]; - if(clipFlags & Clipper::CLIP_PLANE2) clipPlane[2] = scissorClip * userPlane[2]; - if(clipFlags & Clipper::CLIP_PLANE3) clipPlane[3] = scissorClip * userPlane[3]; - if(clipFlags & Clipper::CLIP_PLANE4) clipPlane[4] = scissorClip * userPlane[4]; - if(clipFlags & Clipper::CLIP_PLANE5) clipPlane[5] = scissorClip * userPlane[5]; + if(clipFlags & Clipper::CLIP_PLANE0) clipPlane[0] = userPlane[0]; + if(clipFlags & Clipper::CLIP_PLANE1) clipPlane[1] = userPlane[1]; + if(clipFlags & Clipper::CLIP_PLANE2) clipPlane[2] = userPlane[2]; + if(clipFlags & Clipper::CLIP_PLANE3) clipPlane[3] = userPlane[3]; + if(clipFlags & Clipper::CLIP_PLANE4) clipPlane[4] = userPlane[4]; + if(clipFlags & Clipper::CLIP_PLANE5) clipPlane[5] = userPlane[5]; } updateClipPlanes = false; @@ -2335,31 +2347,6 @@ updateClipPlanes = true; } - void Renderer::setPostTransformEnable(bool enable) - { - context->postTransform = enable; - } - - void Renderer::setPosScale(float x, float y) - { - posScale[0] = x; - posScale[1] = y; - posScale[2] = 1; - posScale[3] = 1; - - updateClipPlanes = true; - } - - void Renderer::setPosOffset(float x, float y) - { - posOffset[0] = x; - posOffset[1] = y; - posOffset[2] = 0; - posOffset[3] = 0; - - updateClipPlanes = true; - } - void Renderer::addQuery(Query *query) { queries.push_back(query); @@ -2407,6 +2394,11 @@ this->viewport = viewport; } + void Renderer::setScissor(const Rect &scissor) + { + this->scissor = scissor; + } + void Renderer::setClipFlags(int flags) { clipFlags = flags << 8; // Bottom 8 bits used by legacy frustum @@ -2532,76 +2524,4 @@ #endif } } - - void Renderer::startupConfiguration() - { - if(!CPUID::supportsSSE2()) - { - MessageBox(0, "Failed to initialize graphics: software mode requires SSE2 support (Pentium 4, Athlon 64, or higher). Aborting application.", 0, MB_ICONERROR); - - exit(0); - } - - if(maximumFilterQuality != SWF_DEFAULT) - { - switch(maximumFilterQuality) - { - case SWF_DEFAULT: Sampler::setFilterQuality(FILTER_LINEAR); break; - case SWF_NONE: Sampler::setFilterQuality(FILTER_POINT); break; - case SWF_POINT: Sampler::setFilterQuality(FILTER_POINT); break; - case SWF_AVERAGE2: Sampler::setFilterQuality(FILTER_LINEAR); break; - case SWF_AVERAGE4: Sampler::setFilterQuality(FILTER_LINEAR); break; - case SWF_POLYGON: Sampler::setFilterQuality(FILTER_LINEAR); break; - case SWF_LINEAR: Sampler::setFilterQuality(FILTER_LINEAR); break; - case SWF_MAXIMUM: Sampler::setFilterQuality(FILTER_LINEAR); break; - default: - ASSERT(false); - } - } - - if(maximumMipmapQuality != SWF_DEFAULT) - { - switch(maximumMipmapQuality) - { - case SWF_DEFAULT: Sampler::setMipmapQuality(MIPMAP_POINT); break; - case SWF_NONE: Sampler::setMipmapQuality(MIPMAP_NONE); break; - case SWF_POINT: Sampler::setMipmapQuality(MIPMAP_POINT); break; - case SWF_AVERAGE2: Sampler::setMipmapQuality(MIPMAP_POINT); break; - case SWF_AVERAGE4: Sampler::setMipmapQuality(MIPMAP_POINT); break; - case SWF_POLYGON: Sampler::setMipmapQuality(MIPMAP_POINT); break; - case SWF_LINEAR: Sampler::setMipmapQuality(MIPMAP_LINEAR); break; - case SWF_MAXIMUM: Sampler::setMipmapQuality(MIPMAP_LINEAR); break; - default: - ASSERT(false); - } - } - - if(perspectiveQuality != SWP_DEFAULT) - { - switch(perspectiveQuality) - { - case SWP_DEFAULT: setPerspectiveCorrection(true); break; - case SWP_NONE: setPerspectiveCorrection(false); break; - case SWP_FAST: setPerspectiveCorrection(true); break; - case SWP_ACCURATE: setPerspectiveCorrection(true); break; - default: - ASSERT(false); - } - } - - const char *commandLine = GetCommandLine(); - bool whql = (strstr(commandLine, "-WHQL") != 0) || (strstr(commandLine, "-THQL") != 0); - - if(whql) - { - Sampler::setFilterQuality(FILTER_ANISOTROPIC); - Sampler::setMipmapQuality(MIPMAP_LINEAR); - - logPrecision = WHQL; - expPrecision = WHQL; - rcpPrecision = WHQL; - rsqPrecision = WHQL; - perspectiveCorrection = true; - } - } }
diff --git a/src/Renderer/Renderer.hpp b/src/Renderer/Renderer.hpp index 0f68f39..2bdcdb9 100644 --- a/src/Renderer/Renderer.hpp +++ b/src/Renderer/Renderer.hpp
@@ -1,411 +1,433 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Renderer_hpp -#define sw_Renderer_hpp - -#include "VertexProcessor.hpp" -#include "PixelProcessor.hpp" -#include "SetupProcessor.hpp" -#include "Viewport.hpp" -#include "Plane.hpp" -#include "Blitter.hpp" -#include "Common/MutexLock.hpp" -#include "Common/Thread.hpp" -#include "Main/Config.hpp" - -#include <list> - -namespace sw -{ - class Clipper; - class Viewport; - class PixelShader; - class VertexShader; - class SwiftConfig; - struct Task; - class Resource; - class Renderer; - - extern int batchSize; - extern int threadCount; - extern int unitCount; - extern int clusterCount; - - struct Query - { - Query() - { - building = false; - reference = 0; - data = 0; - } - - void begin() - { - building = true; - data = 0; - } - - void end() - { - building = false; - } - - bool building; - volatile int reference; - volatile unsigned int data; - }; - - struct DrawData - { - const void *constants; - - const void *input[16]; - unsigned int stride[16]; - Texture mipmap[16 + 4]; - const void *indices; - - struct VS - { - float4 c[256 + 1]; // One extra for indices out of range, c[256] = {0, 0, 0, 0} - int4 i[16]; - bool b[16]; - }; - - struct PS - { - word4 cW[8][4]; - float4 c[224]; - int4 i[16]; - bool b[16]; - }; - - union - { - VS vs; - VertexProcessor::FixedFunction ff; - }; - - PS ps; - - VertexProcessor::PointSprite point; - - PixelProcessor::Stencil stencil[2]; // clockwise, counterclockwise - PixelProcessor::Stencil stencilCCW; - PixelProcessor::Fog fog; - PixelProcessor::Factor factor; - unsigned int occlusion[16]; // Number of pixels passing depth test - - #if PERF_PROFILE - int64_t cycles[PERF_TIMERS][16]; - #endif - - TextureStage::Uniforms textureStage[8]; - - float4 WWWWx16; - float4 HHHHx16; - float4 LLLLx16; - float4 TTTTx16; - float4 ZZZZ; - float4 XXXX; - float4 YYYY; - float4 offX; - float4 offY; - float4 posScale; - float4 posOffset; - float viewportHeight; - float slopeDepthBias; - float depthRange; - float depthNear; - Plane clipPlane[6]; - - unsigned int *colorBuffer[4]; - int colorPitchB[4]; - int colorSliceB[4]; - float *depthBuffer; - int depthPitchB; - int depthSliceB; - unsigned char *stencilBuffer; - int stencilPitchB; - int stencilSliceB; - - float4 a2c0; - float4 a2c1; - float4 a2c2; - float4 a2c3; - }; - - struct DrawCall - { - DrawCall(); - - ~DrawCall(); - - Context::DrawType drawType; - int batchSize; - - Routine *vertexRoutine; - Routine *setupRoutine; - Routine *pixelRoutine; - - VertexProcessor::RoutinePointer vertexPointer; - SetupProcessor::RoutinePointer setupPointer; - PixelProcessor::RoutinePointer pixelPointer; - - int (*setupPrimitives)(Renderer *renderer, int batch, int count); - SetupProcessor::State setupState; - - Resource *vertexStream[16]; - Resource *indexBuffer; - Surface *renderTarget[4]; - Surface *depthStencil; - Resource *texture[16 + 4]; - - int vsDirtyConstF; - int vsDirtyConstI; - int vsDirtyConstB; - - int psDirtyConstF; - int psDirtyConstI; - int psDirtyConstB; - - std::list<Query*> *queries; - - int clipFlags; - - volatile int primitive; // Current primitive to enter pipeline - volatile int count; // Number of primitives to render - volatile int references; // Remaining references to this draw call, 0 when done drawing, -1 when resources unlocked and slot is free - - DrawData *data; - }; - - class Renderer : public VertexProcessor, public PixelProcessor, public SetupProcessor - { - struct Task - { - enum Type - { - PRIMITIVES, - PIXELS, - - RESUME, - SUSPEND - }; - - volatile Type type; - volatile int primitiveUnit; - volatile int pixelCluster; - }; - - struct PrimitiveProgress - { - void init() - { - drawCall = 0; - firstPrimitive = 0; - primitiveCount = 0; - visible = 0; - references = 0; - } - - volatile int drawCall; - volatile int firstPrimitive; - volatile int primitiveCount; - volatile int visible; - volatile int references; - }; - - struct PixelProgress - { - void init() - { - drawCall = 0; - processedPrimitives = 0; - executing = false; - } - - volatile int drawCall; - volatile int processedPrimitives; - volatile bool executing; - }; - - public: - Renderer(Context *context, Surface *renderTarget = 0); - - virtual ~Renderer(); - - virtual void blit(Surface *source, const Rect &sRect, Surface *dest, const Rect &dRect, bool filter); - virtual void draw(Context::DrawType drawType, unsigned int indexOffset, unsigned int count, bool update = true); - - virtual void setIndexBuffer(Resource *indexBuffer); - - virtual void setMultiSampleMask(unsigned int mask); - virtual void setTransparencyAntialiasing(Context::TransparencyAntialiasing transparencyAntialiasing); - - virtual void setTextureResource(unsigned int sampler, Resource *resource); - virtual void setTextureLevel(unsigned int sampler, unsigned int face, unsigned int level, Surface *surface, TextureType type); - - virtual void setTextureFilter(SamplerType type, int sampler, FilterType textureFilter); - virtual void setMipmapFilter(SamplerType type, int sampler, MipmapType mipmapFilter); - virtual void setGatherEnable(SamplerType type, int sampler, bool enable); - virtual void setAddressingModeU(SamplerType type, int sampler, AddressingMode addressingMode); - virtual void setAddressingModeV(SamplerType type, int sampler, AddressingMode addressingMode); - virtual void setAddressingModeW(SamplerType type, int sampler, AddressingMode addressingMode); - virtual void setReadSRGB(SamplerType type, int sampler, bool sRGB); - virtual void setMipmapLOD(SamplerType type, int sampler, float bias); - virtual void setBorderColor(SamplerType type, int sampler, const Color<float> &borderColor); - virtual void setMaxAnisotropy(SamplerType type, int sampler, unsigned int maxAnisotropy); - - virtual void setPointSpriteEnable(bool pointSpriteEnable); - virtual void setPointScaleEnable(bool pointScaleEnable); - - virtual void setDepthBias(float bias); - virtual void setSlopeDepthBias(float slopeBias); - - // Programmable pipelines - virtual void setPixelShader(const PixelShader *shader); - virtual void setVertexShader(const VertexShader *shader); - - virtual void setPixelShaderConstantF(int index, const float value[4], int count = 1); - virtual void setPixelShaderConstantI(int index, const int value[4], int count = 1); - virtual void setPixelShaderConstantB(int index, const int *boolean, int count = 1); - - virtual void setVertexShaderConstantF(int index, const float value[4], int count = 1); - virtual void setVertexShaderConstantI(int index, const int value[4], int count = 1); - virtual void setVertexShaderConstantB(int index, const int *boolean, int count = 1); - - // Viewport & Clipper - virtual void setViewport(const Viewport &viewport); - virtual void setClipFlags(int flags); - virtual void setClipPlane(unsigned int index, const float plane[4]); - - // Partial transform - virtual void setModelMatrix(const Matrix &M, int i = 0); - virtual void setViewMatrix(const Matrix &V); - virtual void setBaseMatrix(const Matrix &B); - virtual void setProjectionMatrix(const Matrix &P); - - virtual void setPostTransformEnable(bool enable); - - virtual void setPosScale(float x, float y); - virtual void setPosOffset(float x, float y); - - virtual void addQuery(Query *query); - virtual void removeQuery(Query *query); - - #if PERF_HUD - // Performance timers - int getThreadCount(); - int64_t getVertexTime(int thread); - int64_t getSetupTime(int thread); - int64_t getPixelTime(int thread); - void resetTimers(); - #endif - - private: - static void threadFunction(void *parameters); - void threadLoop(int threadIndex); - void taskLoop(int threadIndex); - void findAvailableTasks(); - void scheduleTask(int threadIndex); - void executeTask(int threadIndex); - void finishRendering(Task &pixelTask); - - void processPrimitiveVertices(int unit, unsigned int start, unsigned int count, unsigned int loop, int thread); - - static int setupSolidTriangles(Renderer *renderer, int batch, int count); - static int setupWireframeTriangle(Renderer *renderer, int batch, int count); - static int setupVertexTriangle(Renderer *renderer, int batch, int count); - static int setupLines(Renderer *renderer, int batch, int count); - static int setupPoints(Renderer *renderer, int batch, int count); - - static bool setupLine(Renderer *renderer, Primitive &primitive, Triangle &triangle, const DrawCall &draw); - static bool setupPoint(Renderer *renderer, Primitive &primitive, Triangle &triangle, const DrawCall &draw); - - bool isReadWriteTexture(int sampler); - void updateClipper(); - void updateConfiguration(bool initialUpdate = false); - void startupConfiguration(); - static unsigned int computeClipFlags(const float4 &v, const DrawData &data); - void initializeThreads(int threadCount); - void terminateThreads(); - void deleteBatches(); - - void loadConstants(const VertexShader *vertexShader); - void loadConstants(const PixelShader *pixelShader); - - Context *context; - Clipper *clipper; - Viewport viewport; - float4 posScale; - float4 posOffset; - int clipFlags; - - Triangle *triangleBatch[16]; - Primitive *primitiveBatch[16]; - - // User-defined clipping planes - Plane userPlane[6]; - Plane clipPlane[6]; // Tranformed to clip space - bool updateClipPlanes; - - volatile bool exitThreads; - volatile int threadsAwake; - Thread *worker[16]; - Event *resume[16]; // Events for resuming threads - Event *suspend[16]; // Events for suspending threads - Event *resumeApp; // Event for resuming the application thread - - PrimitiveProgress primitiveProgress[16]; - PixelProgress pixelProgress[16]; - Task task[16]; // Current tasks for threads - - enum {DRAW_COUNT = 16}; // Number of draw calls buffered - DrawCall *drawCall[DRAW_COUNT]; - DrawCall *drawList[DRAW_COUNT]; - - volatile int currentDraw; - volatile int nextDraw; - - Task taskQueue[32]; - unsigned int qHead; - unsigned int qSize; - - BackoffLock mutex; - - #if PERF_HUD - int64_t vertexTime[16]; - int64_t setupTime[16]; - int64_t pixelTime[16]; - #endif - - VertexTask *vertexTask[16]; - - SwiftConfig *swiftConfig; - - std::list<Query*> queries; - - VertexProcessor::State vertexState; - SetupProcessor::State setupState; - PixelProcessor::State pixelState; - int (*setupPrimitives)(Renderer *renderer, int batch, int count); - - Routine *vertexRoutine; - Routine *setupRoutine; - Routine *pixelRoutine; - - Blitter blitter; - }; -} - -#endif // sw_Renderer_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2012 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef sw_Renderer_hpp +#define sw_Renderer_hpp + +#include "VertexProcessor.hpp" +#include "PixelProcessor.hpp" +#include "SetupProcessor.hpp" +#include "Plane.hpp" +#include "Blitter.hpp" +#include "Common/MutexLock.hpp" +#include "Common/Thread.hpp" +#include "Main/Config.hpp" + +#include <list> + +namespace sw +{ + class Clipper; + class PixelShader; + class VertexShader; + class SwiftConfig; + struct Task; + class Resource; + class Renderer; + + extern int batchSize; + extern int threadCount; + extern int unitCount; + extern int clusterCount; + + enum TranscendentalPrecision + { + APPROXIMATE, + PARTIAL, // 2^-10 + ACCURATE, + WHQL, // 2^-21 + IEEE // 2^-23 + }; + + extern TranscendentalPrecision logPrecision; + extern TranscendentalPrecision expPrecision; + extern TranscendentalPrecision rcpPrecision; + extern TranscendentalPrecision rsqPrecision; + extern bool perspectiveCorrection; + + struct Query + { + Query() + { + building = false; + reference = 0; + data = 0; + } + + void begin() + { + building = true; + data = 0; + } + + void end() + { + building = false; + } + + bool building; + volatile int reference; + volatile unsigned int data; + }; + + struct DrawData + { + const void *constants; + + const void *input[16]; + unsigned int stride[16]; + Texture mipmap[16 + 4]; + const void *indices; + + struct VS + { + float4 c[256 + 1]; // One extra for indices out of range, c[256] = {0, 0, 0, 0} + int4 i[16]; + bool b[16]; + }; + + struct PS + { + word4 cW[8][4]; + float4 c[224]; + int4 i[16]; + bool b[16]; + }; + + union + { + VS vs; + VertexProcessor::FixedFunction ff; + }; + + PS ps; + + VertexProcessor::PointSprite point; + + PixelProcessor::Stencil stencil[2]; // clockwise, counterclockwise + PixelProcessor::Stencil stencilCCW; + PixelProcessor::Fog fog; + PixelProcessor::Factor factor; + unsigned int occlusion[16]; // Number of pixels passing depth test + + #if PERF_PROFILE + int64_t cycles[PERF_TIMERS][16]; + #endif + + TextureStage::Uniforms textureStage[8]; + + float4 Wx16; + float4 Hx16; + float4 X0x16; + float4 Y0x16; + float4 XXXX; + float4 YYYY; + float4 halfPixelX; + float4 halfPixelY; + float viewportHeight; + float slopeDepthBias; + float depthRange; + float depthNear; + Plane clipPlane[6]; + + unsigned int *colorBuffer[4]; + int colorPitchB[4]; + int colorSliceB[4]; + float *depthBuffer; + int depthPitchB; + int depthSliceB; + unsigned char *stencilBuffer; + int stencilPitchB; + int stencilSliceB; + + int scissorX0; + int scissorX1; + int scissorY0; + int scissorY1; + + float4 a2c0; + float4 a2c1; + float4 a2c2; + float4 a2c3; + }; + + struct DrawCall + { + DrawCall(); + + ~DrawCall(); + + Context::DrawType drawType; + int batchSize; + + Routine *vertexRoutine; + Routine *setupRoutine; + Routine *pixelRoutine; + + VertexProcessor::RoutinePointer vertexPointer; + SetupProcessor::RoutinePointer setupPointer; + PixelProcessor::RoutinePointer pixelPointer; + + int (*setupPrimitives)(Renderer *renderer, int batch, int count); + SetupProcessor::State setupState; + + Resource *vertexStream[16]; + Resource *indexBuffer; + Surface *renderTarget[4]; + Surface *depthStencil; + Resource *texture[16 + 4]; + + int vsDirtyConstF; + int vsDirtyConstI; + int vsDirtyConstB; + + int psDirtyConstF; + int psDirtyConstI; + int psDirtyConstB; + + std::list<Query*> *queries; + + int clipFlags; + + volatile int primitive; // Current primitive to enter pipeline + volatile int count; // Number of primitives to render + volatile int references; // Remaining references to this draw call, 0 when done drawing, -1 when resources unlocked and slot is free + + DrawData *data; + }; + + struct Viewport + { + float x0; + float y0; + float width; + float height; + float minZ; + float maxZ; + }; + + class Renderer : public VertexProcessor, public PixelProcessor, public SetupProcessor + { + struct Task + { + enum Type + { + PRIMITIVES, + PIXELS, + + RESUME, + SUSPEND + }; + + volatile Type type; + volatile int primitiveUnit; + volatile int pixelCluster; + }; + + struct PrimitiveProgress + { + void init() + { + drawCall = 0; + firstPrimitive = 0; + primitiveCount = 0; + visible = 0; + references = 0; + } + + volatile int drawCall; + volatile int firstPrimitive; + volatile int primitiveCount; + volatile int visible; + volatile int references; + }; + + struct PixelProgress + { + void init() + { + drawCall = 0; + processedPrimitives = 0; + executing = false; + } + + volatile int drawCall; + volatile int processedPrimitives; + volatile bool executing; + }; + + public: + Renderer(Context *context, bool halfIntegerCoordinates, bool symmetricNormalizedDepth, bool booleanFaceRegister, bool fullPixelPositionRegister, bool exactColorRounding); + + virtual ~Renderer(); + + virtual void blit(Surface *source, const Rect &sRect, Surface *dest, const Rect &dRect, bool filter); + virtual void draw(Context::DrawType drawType, unsigned int indexOffset, unsigned int count, bool update = true); + + virtual void setIndexBuffer(Resource *indexBuffer); + + virtual void setMultiSampleMask(unsigned int mask); + virtual void setTransparencyAntialiasing(Context::TransparencyAntialiasing transparencyAntialiasing); + + virtual void setTextureResource(unsigned int sampler, Resource *resource); + virtual void setTextureLevel(unsigned int sampler, unsigned int face, unsigned int level, Surface *surface, TextureType type); + + virtual void setTextureFilter(SamplerType type, int sampler, FilterType textureFilter); + virtual void setMipmapFilter(SamplerType type, int sampler, MipmapType mipmapFilter); + virtual void setGatherEnable(SamplerType type, int sampler, bool enable); + virtual void setAddressingModeU(SamplerType type, int sampler, AddressingMode addressingMode); + virtual void setAddressingModeV(SamplerType type, int sampler, AddressingMode addressingMode); + virtual void setAddressingModeW(SamplerType type, int sampler, AddressingMode addressingMode); + virtual void setReadSRGB(SamplerType type, int sampler, bool sRGB); + virtual void setMipmapLOD(SamplerType type, int sampler, float bias); + virtual void setBorderColor(SamplerType type, int sampler, const Color<float> &borderColor); + virtual void setMaxAnisotropy(SamplerType type, int sampler, unsigned int maxAnisotropy); + + virtual void setPointSpriteEnable(bool pointSpriteEnable); + virtual void setPointScaleEnable(bool pointScaleEnable); + + virtual void setDepthBias(float bias); + virtual void setSlopeDepthBias(float slopeBias); + + // Programmable pipelines + virtual void setPixelShader(const PixelShader *shader); + virtual void setVertexShader(const VertexShader *shader); + + virtual void setPixelShaderConstantF(int index, const float value[4], int count = 1); + virtual void setPixelShaderConstantI(int index, const int value[4], int count = 1); + virtual void setPixelShaderConstantB(int index, const int *boolean, int count = 1); + + virtual void setVertexShaderConstantF(int index, const float value[4], int count = 1); + virtual void setVertexShaderConstantI(int index, const int value[4], int count = 1); + virtual void setVertexShaderConstantB(int index, const int *boolean, int count = 1); + + // Viewport & Clipper + virtual void setViewport(const Viewport &viewport); + virtual void setScissor(const Rect &scissor); + virtual void setClipFlags(int flags); + virtual void setClipPlane(unsigned int index, const float plane[4]); + + // Partial transform + virtual void setModelMatrix(const Matrix &M, int i = 0); + virtual void setViewMatrix(const Matrix &V); + virtual void setBaseMatrix(const Matrix &B); + virtual void setProjectionMatrix(const Matrix &P); + + virtual void addQuery(Query *query); + virtual void removeQuery(Query *query); + + void synchronize(); + + #if PERF_HUD + // Performance timers + int getThreadCount(); + int64_t getVertexTime(int thread); + int64_t getSetupTime(int thread); + int64_t getPixelTime(int thread); + void resetTimers(); + #endif + + private: + static void threadFunction(void *parameters); + void threadLoop(int threadIndex); + void taskLoop(int threadIndex); + void findAvailableTasks(); + void scheduleTask(int threadIndex); + void executeTask(int threadIndex); + void finishRendering(Task &pixelTask); + + void processPrimitiveVertices(int unit, unsigned int start, unsigned int count, unsigned int loop, int thread); + + static int setupSolidTriangles(Renderer *renderer, int batch, int count); + static int setupWireframeTriangle(Renderer *renderer, int batch, int count); + static int setupVertexTriangle(Renderer *renderer, int batch, int count); + static int setupLines(Renderer *renderer, int batch, int count); + static int setupPoints(Renderer *renderer, int batch, int count); + + static bool setupLine(Renderer *renderer, Primitive &primitive, Triangle &triangle, const DrawCall &draw); + static bool setupPoint(Renderer *renderer, Primitive &primitive, Triangle &triangle, const DrawCall &draw); + + bool isReadWriteTexture(int sampler); + void updateClipper(); + void updateConfiguration(bool initialUpdate = false); + static unsigned int computeClipFlags(const float4 &v, const DrawData &data); + void initializeThreads(int threadCount); + void terminateThreads(); + void deleteBatches(); + + void loadConstants(const VertexShader *vertexShader); + void loadConstants(const PixelShader *pixelShader); + + Context *context; + Clipper *clipper; + Viewport viewport; + Rect scissor; + int clipFlags; + + Triangle *triangleBatch[16]; + Primitive *primitiveBatch[16]; + + // User-defined clipping planes + Plane userPlane[6]; + Plane clipPlane[6]; // Tranformed to clip space + bool updateClipPlanes; + + volatile bool exitThreads; + volatile int threadsAwake; + Thread *worker[16]; + Event *resume[16]; // Events for resuming threads + Event *suspend[16]; // Events for suspending threads + Event *resumeApp; // Event for resuming the application thread + + PrimitiveProgress primitiveProgress[16]; + PixelProgress pixelProgress[16]; + Task task[16]; // Current tasks for threads + + enum {DRAW_COUNT = 16}; // Number of draw calls buffered + DrawCall *drawCall[DRAW_COUNT]; + DrawCall *drawList[DRAW_COUNT]; + + volatile int currentDraw; + volatile int nextDraw; + + Task taskQueue[32]; + unsigned int qHead; + unsigned int qSize; + + BackoffLock mutex; + + #if PERF_HUD + int64_t vertexTime[16]; + int64_t setupTime[16]; + int64_t pixelTime[16]; + #endif + + VertexTask *vertexTask[16]; + + SwiftConfig *swiftConfig; + + std::list<Query*> queries; + Resource *sync; + + VertexProcessor::State vertexState; + SetupProcessor::State setupState; + PixelProcessor::State pixelState; + int (*setupPrimitives)(Renderer *renderer, int batch, int count); + + Routine *vertexRoutine; + Routine *setupRoutine; + Routine *pixelRoutine; + + Blitter blitter; + }; +} + +#endif // sw_Renderer_hpp
diff --git a/src/Renderer/Sampler.cpp b/src/Renderer/Sampler.cpp index 1b7c651..a292267 100644 --- a/src/Renderer/Sampler.cpp +++ b/src/Renderer/Sampler.cpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -343,6 +343,11 @@ return false; } + if(texture.mipmap[0].width[0] != texture.mipmap[0].onePitchP[1]) + { + return true; // Shifting of the texture coordinates doesn't yield the correct address, so using multiply by pitch + } + return !isPow2(texture.mipmap[0].width[0]) || !isPow2(texture.mipmap[0].height[0]) || !isPow2(texture.mipmap[0].depth[0]); }
diff --git a/src/Renderer/Sampler.hpp b/src/Renderer/Sampler.hpp index 2132a06..14d0487 100644 --- a/src/Renderer/Sampler.hpp +++ b/src/Renderer/Sampler.hpp
@@ -1,195 +1,195 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Sampler_hpp -#define sw_Sampler_hpp - -#include "Main/Config.hpp" -#include "Renderer/Surface.hpp" - -namespace sw -{ - struct Mipmap - { - void *buffer[6]; - - union - { - struct - { - int64_t uInt; - int64_t vInt; - int64_t wInt; - int64_t uFrac; - int64_t vFrac; - int64_t wFrac; - }; - - struct - { - float4 fWidth; - float4 fHeight; - float4 fDepth; - }; - }; - - short uHalf[4]; - short vHalf[4]; - short wHalf[4]; - short width[4]; - short height[4]; - short depth[4]; - short onePitchP[4]; - int sliceP[2]; - }; - - struct Texture - { - Mipmap mipmap[MIPMAP_LEVELS]; - - float LOD; - float4 widthHeightLOD; - float4 widthLOD; - float4 heightLOD; - float4 depthLOD; - - word4 borderColor4[4]; - float4 borderColorF[4]; - float maxAnisotropy; - }; - - enum SamplerType - { - SAMPLER_PIXEL, - SAMPLER_VERTEX - }; - - enum TextureType - { - TEXTURE_NULL, - TEXTURE_2D, - TEXTURE_CUBE, - TEXTURE_3D, - - TEXTURE_LAST = TEXTURE_3D - }; - - enum FilterType - { - FILTER_POINT, - FILTER_GATHER, - FILTER_LINEAR, - FILTER_ANISOTROPIC, - - FILTER_LAST = FILTER_ANISOTROPIC - }; - - enum MipmapType - { - MIPMAP_NONE, - MIPMAP_POINT, - MIPMAP_LINEAR, - - MIPMAP_LAST = MIPMAP_LINEAR - }; - - enum AddressingMode - { - ADDRESSING_WRAP, - ADDRESSING_CLAMP, - ADDRESSING_MIRROR, - ADDRESSING_MIRRORONCE, - ADDRESSING_BORDER, - - ADDRESSING_LAST = ADDRESSING_BORDER - }; - - class Sampler - { - public: - struct State - { - State(); - - unsigned int textureType : BITS(TEXTURE_LAST); - unsigned int textureFormat : BITS(FORMAT_LAST); - unsigned int textureFilter : BITS(FILTER_LAST); - unsigned int addressingModeU : BITS(ADDRESSING_LAST); - unsigned int addressingModeV : BITS(ADDRESSING_LAST); - unsigned int addressingModeW : BITS(ADDRESSING_LAST); - unsigned int mipmapFilter : BITS(FILTER_LAST); - unsigned int hasNPOTTexture : 1; - unsigned int sRGB : 1; - - #if PERF_PROFILE - bool compressedFormat : 1; - #endif - }; - - Sampler(); - - ~Sampler(); - - State samplerState() const; - - void setTextureLevel(int face, int level, Surface *surface, TextureType type); - - void setTextureFilter(FilterType textureFilter); - void setMipmapFilter(MipmapType mipmapFilter); - void setGatherEnable(bool enable); - void setAddressingModeU(AddressingMode addressingMode); - void setAddressingModeV(AddressingMode addressingMode); - void setAddressingModeW(AddressingMode addressingMode); - void setReadSRGB(bool sRGB); - void setBorderColor(const Color<float> &borderColor); - void setMaxAnisotropy(unsigned int maxAnisotropy); - - static void setFilterQuality(FilterType maximumFilterQuality); - static void setMipmapQuality(MipmapType maximumFilterQuality); - void setMipmapLOD(float lod); - - bool hasTexture() const; - bool hasUnsignedTexture() const; - bool hasCubeTexture() const; - bool hasVolumeTexture() const; - - const Texture &getTextureData(); - - private: - MipmapType mipmapFilter() const; - bool hasNPOTTexture() const; - TextureType getTextureType() const; - FilterType getTextureFilter() const; - AddressingMode getAddressingModeU() const; - AddressingMode getAddressingModeV() const; - AddressingMode getAddressingModeW() const; - - Format externalTextureFormat; - Format internalTextureFormat; - TextureType textureType; - - FilterType textureFilter; - AddressingMode addressingModeU; - AddressingMode addressingModeV; - AddressingMode addressingModeW; - MipmapType mipmapFilterState; - bool sRGB; - bool gather; - - Texture texture; - float exp2LOD; - - static FilterType maximumTextureFilterQuality; - static MipmapType maximumMipmapFilterQuality; - }; -} - -#endif // sw_Sampler_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2011 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef sw_Sampler_hpp +#define sw_Sampler_hpp + +#include "Main/Config.hpp" +#include "Renderer/Surface.hpp" + +namespace sw +{ + struct Mipmap + { + void *buffer[6]; + + union + { + struct + { + int64_t uInt; + int64_t vInt; + int64_t wInt; + int64_t uFrac; + int64_t vFrac; + int64_t wFrac; + }; + + struct + { + float4 fWidth; + float4 fHeight; + float4 fDepth; + }; + }; + + short uHalf[4]; + short vHalf[4]; + short wHalf[4]; + short width[4]; + short height[4]; + short depth[4]; + short onePitchP[4]; + int sliceP[2]; + }; + + struct Texture + { + Mipmap mipmap[MIPMAP_LEVELS]; + + float LOD; + float4 widthHeightLOD; + float4 widthLOD; + float4 heightLOD; + float4 depthLOD; + + word4 borderColor4[4]; + float4 borderColorF[4]; + float maxAnisotropy; + }; + + enum SamplerType + { + SAMPLER_PIXEL, + SAMPLER_VERTEX + }; + + enum TextureType + { + TEXTURE_NULL, + TEXTURE_2D, + TEXTURE_CUBE, + TEXTURE_3D, + + TEXTURE_LAST = TEXTURE_3D + }; + + enum FilterType + { + FILTER_POINT, + FILTER_GATHER, + FILTER_LINEAR, + FILTER_ANISOTROPIC, + + FILTER_LAST = FILTER_ANISOTROPIC + }; + + enum MipmapType + { + MIPMAP_NONE, + MIPMAP_POINT, + MIPMAP_LINEAR, + + MIPMAP_LAST = MIPMAP_LINEAR + }; + + enum AddressingMode + { + ADDRESSING_WRAP, + ADDRESSING_CLAMP, + ADDRESSING_MIRROR, + ADDRESSING_MIRRORONCE, + ADDRESSING_BORDER, + + ADDRESSING_LAST = ADDRESSING_BORDER + }; + + class Sampler + { + public: + struct State + { + State(); + + unsigned int textureType : BITS(TEXTURE_LAST); + unsigned int textureFormat : BITS(FORMAT_LAST); + unsigned int textureFilter : BITS(FILTER_LAST); + unsigned int addressingModeU : BITS(ADDRESSING_LAST); + unsigned int addressingModeV : BITS(ADDRESSING_LAST); + unsigned int addressingModeW : BITS(ADDRESSING_LAST); + unsigned int mipmapFilter : BITS(FILTER_LAST); + unsigned int hasNPOTTexture : 1; + unsigned int sRGB : 1; + + #if PERF_PROFILE + bool compressedFormat : 1; + #endif + }; + + Sampler(); + + ~Sampler(); + + State samplerState() const; + + void setTextureLevel(int face, int level, Surface *surface, TextureType type); + + void setTextureFilter(FilterType textureFilter); + void setMipmapFilter(MipmapType mipmapFilter); + void setGatherEnable(bool enable); + void setAddressingModeU(AddressingMode addressingMode); + void setAddressingModeV(AddressingMode addressingMode); + void setAddressingModeW(AddressingMode addressingMode); + void setReadSRGB(bool sRGB); + void setBorderColor(const Color<float> &borderColor); + void setMaxAnisotropy(unsigned int maxAnisotropy); + + static void setFilterQuality(FilterType maximumFilterQuality); + static void setMipmapQuality(MipmapType maximumFilterQuality); + void setMipmapLOD(float lod); + + bool hasTexture() const; + bool hasUnsignedTexture() const; + bool hasCubeTexture() const; + bool hasVolumeTexture() const; + + const Texture &getTextureData(); + + private: + MipmapType mipmapFilter() const; + bool hasNPOTTexture() const; + TextureType getTextureType() const; + FilterType getTextureFilter() const; + AddressingMode getAddressingModeU() const; + AddressingMode getAddressingModeV() const; + AddressingMode getAddressingModeW() const; + + Format externalTextureFormat; + Format internalTextureFormat; + TextureType textureType; + + FilterType textureFilter; + AddressingMode addressingModeU; + AddressingMode addressingModeV; + AddressingMode addressingModeW; + MipmapType mipmapFilterState; + bool sRGB; + bool gather; + + Texture texture; + float exp2LOD; + + static FilterType maximumTextureFilterQuality; + static MipmapType maximumMipmapFilterQuality; + }; +} + +#endif // sw_Sampler_hpp
diff --git a/src/Renderer/SetupProcessor.cpp b/src/Renderer/SetupProcessor.cpp index 1e737a4..775564e 100644 --- a/src/Renderer/SetupProcessor.cpp +++ b/src/Renderer/SetupProcessor.cpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -14,7 +14,6 @@ #include "SetupRoutine.hpp" #include "Primitive.hpp" #include "Polygon.hpp" -#include "Viewport.hpp" #include "Context.hpp" #include "Renderer.hpp" #include "Constants.hpp" @@ -23,6 +22,7 @@ namespace sw { extern bool complementaryDepthBuffer; + extern bool fullPixelPositionRegister; unsigned int SetupProcessor::States::computeHash() { @@ -54,6 +54,7 @@ SetupProcessor::SetupProcessor(Context *context) : context(context) { + precacheDLL = 0; routineCache = 0; setRoutineCacheSize(1024); } @@ -68,11 +69,14 @@ { State state; + bool vPosZW = (context->pixelShader && context->pixelShader->vPosDeclared && fullPixelPositionRegister); + state.isDrawPoint = context->isDrawPoint(true); state.isDrawLine = context->isDrawLine(true); state.isDrawTriangle = context->isDrawTriangle(false); state.isDrawSolidTriangle = context->isDrawTriangle(true); - state.interpolateDepth = context->depthBufferActive() || context->pixelFogActive() != Context::FOG_NONE; + state.interpolateZ = context->depthBufferActive() || context->pixelFogActive() != Context::FOG_NONE || vPosZW; + state.interpolateW = context->perspectiveActive() || vPosZW; state.perspective = context->perspectiveActive(); state.pointSprite = context->pointSpriteActive(); state.cullMode = context->cullMode; @@ -135,8 +139,8 @@ switch(context->pixelShader->semantic[interpolant][component - project].usage) { - case ShaderOperation::USAGE_TEXCOORD: flat = point && !sprite; break; - case ShaderOperation::USAGE_COLOR: flat = flatShading; break; + case Shader::USAGE_TEXCOORD: flat = point && !sprite; break; + case Shader::USAGE_COLOR: flat = flatShading; break; } state.gradient[interpolant][component].attribute = input; @@ -157,11 +161,11 @@ { case 0xFF: break; - case ShaderOperation::USAGE_TEXCOORD: + case Shader::USAGE_TEXCOORD: state.gradient[interpolant][component].attribute = T0 + index; state.gradient[interpolant][component].flat = point && !sprite; break; - case ShaderOperation::USAGE_COLOR: + case Shader::USAGE_COLOR: state.gradient[interpolant][component].attribute = D0 + index; state.gradient[interpolant][component].flat = flatShading; break;
diff --git a/src/Renderer/SetupProcessor.hpp b/src/Renderer/SetupProcessor.hpp index 13adf87..0537057 100644 --- a/src/Renderer/SetupProcessor.hpp +++ b/src/Renderer/SetupProcessor.hpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -24,7 +24,6 @@ struct Triangle; struct Polygon; struct Vertex; - class Viewport; class Routine; struct DrawCall; struct DrawData; @@ -36,21 +35,21 @@ { unsigned int computeHash(); - unsigned int isDrawPoint : 1; - unsigned int isDrawLine : 1; - unsigned int isDrawTriangle : 1; - unsigned int isDrawSolidTriangle : 1; - unsigned int interpolateDepth : 1; - unsigned int perspective : 1; - unsigned int pointSprite : 1; - unsigned int positionRegister : 4; - unsigned int pointSizeRegister : 4; - unsigned int cullMode : BITS(Context::CULL_LAST); - unsigned int twoSidedStencil : 1; - unsigned int slopeDepthBias : 1; - unsigned int vFace : 1; - - unsigned int multiSample : 3; // 1, 2 or 4 + unsigned int isDrawPoint : 1; + unsigned int isDrawLine : 1; + unsigned int isDrawTriangle : 1; + unsigned int isDrawSolidTriangle : 1; + unsigned int interpolateZ : 1; + unsigned int interpolateW : 1; + unsigned int perspective : 1; + unsigned int pointSprite : 1; + unsigned int positionRegister : 4; + unsigned int pointSizeRegister : 4; + unsigned int cullMode : BITS(Context::CULL_LAST); + unsigned int twoSidedStencil : 1; + unsigned int slopeDepthBias : 1; + unsigned int vFace : 1; + unsigned int multiSample : 3; // 1, 2 or 4 struct Gradient { @@ -100,6 +99,7 @@ Context *const context; LRUCache<State, Routine> *routineCache; + HMODULE precacheDLL; }; }
diff --git a/src/Renderer/Stream.hpp b/src/Renderer/Stream.hpp index 395f244..b038a99 100644 --- a/src/Renderer/Stream.hpp +++ b/src/Renderer/Stream.hpp
@@ -1,98 +1,98 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Stream_hpp -#define sw_Stream_hpp - -#include "Common/Types.hpp" - -namespace sw -{ - class Resource; - - enum StreamType - { - STREAMTYPE_COLOR, // 4 normalized unsigned bytes, ZYXW order - STREAMTYPE_UDEC3, // 3 unsigned 10-bit fields - STREAMTYPE_DEC3N, // 3 normalized signed 10-bit fields - STREAMTYPE_INDICES, // 4 unsigned bytes, stored unconverted into X component - STREAMTYPE_FLOAT, // Normalization ignored - STREAMTYPE_BYTE, - STREAMTYPE_SBYTE, - STREAMTYPE_SHORT, - STREAMTYPE_USHORT, - STREAMTYPE_FIXED, // Normalization ignored (16.16 format) - STREAMTYPE_HALF, // Normalization ignored - - STREAMTYPE_LAST = STREAMTYPE_HALF - }; - - struct StreamResource - { - Resource *resource; - const void *buffer; - unsigned int stride; - }; - - struct Stream : public StreamResource - { - Stream(Resource *resource = 0, const void *buffer = 0, unsigned int stride = 0) - { - this->resource = resource; - this->buffer = buffer; - this->stride = stride; - } - - Stream &define(StreamType type, unsigned int count, bool normalized = false) - { - this->type = type; - this->count = count; - this->normalized = normalized; - - return *this; - } - - Stream &define(const void *buffer, StreamType type, unsigned int count, bool normalized = false) - { - this->buffer = buffer; - this->type = type; - this->count = count; - this->normalized = normalized; - - return *this; - } - - Stream &defaults() - { - static const float4 null = {0, 0, 0, 1}; - - resource = 0; - buffer = &null; - stride = 0; - type = STREAMTYPE_FLOAT; - count = 0; - normalized = false; - - return *this; - } - - operator bool() const // Returns true if stream contains data - { - return count != 0; - } - - StreamType type; - unsigned int count; - bool normalized; - }; -} - -#endif // sw_Stream_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2012 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef sw_Stream_hpp +#define sw_Stream_hpp + +#include "Common/Types.hpp" + +namespace sw +{ + class Resource; + + enum StreamType + { + STREAMTYPE_COLOR, // 4 normalized unsigned bytes, ZYXW order + STREAMTYPE_UDEC3, // 3 unsigned 10-bit fields + STREAMTYPE_DEC3N, // 3 normalized signed 10-bit fields + STREAMTYPE_INDICES, // 4 unsigned bytes, stored unconverted into X component + STREAMTYPE_FLOAT, // Normalization ignored + STREAMTYPE_BYTE, + STREAMTYPE_SBYTE, + STREAMTYPE_SHORT, + STREAMTYPE_USHORT, + STREAMTYPE_FIXED, // Normalization ignored (16.16 format) + STREAMTYPE_HALF, // Normalization ignored + + STREAMTYPE_LAST = STREAMTYPE_HALF + }; + + struct StreamResource + { + Resource *resource; + const void *buffer; + unsigned int stride; + }; + + struct Stream : public StreamResource + { + Stream(Resource *resource = 0, const void *buffer = 0, unsigned int stride = 0) + { + this->resource = resource; + this->buffer = buffer; + this->stride = stride; + } + + Stream &define(StreamType type, unsigned int count, bool normalized = false) + { + this->type = type; + this->count = count; + this->normalized = normalized; + + return *this; + } + + Stream &define(const void *buffer, StreamType type, unsigned int count, bool normalized = false) + { + this->buffer = buffer; + this->type = type; + this->count = count; + this->normalized = normalized; + + return *this; + } + + Stream &defaults() + { + static const float4 null = {0, 0, 0, 1}; + + resource = 0; + buffer = &null; + stride = 0; + type = STREAMTYPE_FLOAT; + count = 0; + normalized = false; + + return *this; + } + + operator bool() const // Returns true if stream contains data + { + return count != 0; + } + + StreamType type; + unsigned char count; + bool normalized; + }; +} + +#endif // sw_Stream_hpp
diff --git a/src/Renderer/Surface.cpp b/src/Renderer/Surface.cpp index d072a15..3767123 100644 --- a/src/Renderer/Surface.cpp +++ b/src/Renderer/Surface.cpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -13,12 +13,13 @@ #include "Color.hpp" #include "Context.hpp" +#include "Renderer.hpp" #include "Common/Half.hpp" #include "Common/Memory.hpp" #include "Common/CPUID.hpp" #include "Common/Resource.hpp" #include "Common/Debug.hpp" -#include "Reactor/Shell.hpp" +#include "Reactor/Reactor.hpp" #include <xmmintrin.h> #include <emmintrin.h> @@ -35,6 +36,14 @@ unsigned int *Surface::palette = 0; unsigned int Surface::paletteID = 0; + void Rect::clip(int minX, int minY, int maxX, int maxY) + { + x0 = sw::clamp(x0, minX, maxX); + y0 = sw::clamp(y0, minY, maxY); + x1 = sw::clamp(x1, minX, maxX); + y1 = sw::clamp(y1, minY, maxY); + } + void Surface::Buffer::write(int x, int y, int z, const Color<float> &color) { void *element = (unsigned char*)buffer + x * bytes + y * pitchB + z * sliceB; @@ -624,7 +633,7 @@ return c00 + c10 + c01 + c11; } - void *Surface::Buffer::lockRect(int left, int top, int front, Lock lock) + void *Surface::Buffer::lockRect(int x, int y, int z, Lock lock) { this->lock = lock; @@ -647,14 +656,14 @@ #if S3TC_SUPPORT case FORMAT_DXT1: case FORMAT_ATI1: - return (unsigned char*)buffer + 8 * (left / 4) + (top / 4) * pitchB + front * sliceB; + return (unsigned char*)buffer + 8 * (x / 4) + (y / 4) * pitchB + z * sliceB; case FORMAT_DXT3: case FORMAT_DXT5: case FORMAT_ATI2: - return (unsigned char*)buffer + 16 * (left / 4) + (top / 4) * pitchB + front * sliceB; + return (unsigned char*)buffer + 16 * (x / 4) + (y / 4) * pitchB + z * sliceB; #endif default: - return (unsigned char*)buffer + left * bytes + top * pitchB + front * sliceB; + return (unsigned char*)buffer + x * bytes + y * pitchB + z * sliceB; } return 0; @@ -668,7 +677,7 @@ Surface::Surface(Resource *texture, int width, int height, int depth, Format format, bool lockable, bool renderTarget) : lockable(lockable), renderTarget(renderTarget) { resource = texture ? texture : new Resource(0); - hasParent = texture; + hasParent = texture != 0; depth = max(1, depth); external.buffer = 0; @@ -720,6 +729,9 @@ { if(!hasParent) { + // Synchronize so we can deallocate the buffers below + resource->lock(DESTRUCT); + resource->unlock(); resource->destruct(); } @@ -737,7 +749,7 @@ stencil.buffer = 0; } - void *Surface::lockExternal(int left, int top, int front, Lock lock, Accessor client) + void *Surface::lockExternal(int x, int y, int z, Lock lock, Accessor client) { resource->lock(client); @@ -774,7 +786,7 @@ ASSERT(false); } - return external.lockRect(left, top, front, lock); + return external.lockRect(x, y, z, lock); } void Surface::unlockExternal() @@ -784,7 +796,7 @@ external.unlockRect(); } - void *Surface::lockInternal(int left, int top, int front, Lock lock, Accessor client) + void *Surface::lockInternal(int x, int y, int z, Lock lock, Accessor client) { if(lock != LOCK_UNLOCKED) { @@ -860,7 +872,7 @@ resolve(); } - return internal.lockRect(left, top, front, lock); + return internal.lockRect(x, y, z, lock); } void Surface::unlockInternal() @@ -2066,9 +2078,7 @@ int width4 = (width + 3) & ~3; int height4 = (height + 3) & ~3; - void *buffer = allocate(size(width4, height4, depth, format)); - - return buffer; + return allocate(size(width4, height4, depth, format)); } void Surface::memfill(void *buffer, int pattern, int bytes) @@ -2199,7 +2209,7 @@ case FORMAT_A8R8G8B8: // case FORMAT_X8G8R8B8Q: // FIXME // case FORMAT_A8G8R8B8Q: // FIXME - if(rgbaMask == 0xF || (internal.format == FORMAT_X8R8G8B8 && rgbaMask == 0xF)) + if(rgbaMask == 0xF || (internal.format == FORMAT_X8R8G8B8 && rgbaMask == 0x7)) { memfill(target, color, 4 * (x1 - x0)); }
diff --git a/src/Renderer/Surface.hpp b/src/Renderer/Surface.hpp index 9e46a9a..a50b1c3 100644 --- a/src/Renderer/Surface.hpp +++ b/src/Renderer/Surface.hpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -20,12 +20,14 @@ { class Resource; - struct Rect // Top-left coordinate system + struct Rect { - union {int left; int x1;}; - union {int top; int y1;}; - union {int right; int x2;}; - union {int bottom; int y2;}; + void clip(int minX, int minY, int maxX, int maxY); + + int x0; // Inclusive + int y0; // Inclusive + int x1; // Exclusive + int y1; // Exclusive }; enum Format @@ -129,7 +131,7 @@ Color<float> sample(float x, float y, float z) const; Color<float> sample(float x, float y) const; - void *lockRect(int left, int top, int front, Lock lock); + void *lockRect(int x, int y, int z, Lock lock); void unlockRect(); void *buffer; @@ -153,7 +155,7 @@ virtual ~Surface(); - void *lockExternal(int left, int top, int front, Lock lock, Accessor client); + void *lockExternal(int x, int y, int z, Lock lock, Accessor client); void unlockExternal(); inline int getExternalWidth() const; inline int getExternalHeight() const; @@ -164,7 +166,7 @@ inline int getExternalSliceB() const; inline int getExternalSliceP() const; - virtual void *lockInternal(int left, int top, int front, Lock lock, Accessor client); + virtual void *lockInternal(int x, int y, int z, Lock lock, Accessor client); virtual void unlockInternal(); inline int getInternalWidth() const; inline int getInternalHeight() const; @@ -327,7 +329,6 @@ static void decodeDXT1(Buffer &internal, const Buffer &external); static void decodeDXT3(Buffer &internal, const Buffer &external); static void decodeDXT5(Buffer &internal, const Buffer &external); - static void decodeATI1(Buffer &internal, const Buffer &external); static void decodeATI2(Buffer &internal, const Buffer &external); #endif
diff --git a/src/Renderer/Vector.hpp b/src/Renderer/Vector.hpp index 2ff1713..4c32d9e 100644 --- a/src/Renderer/Vector.hpp +++ b/src/Renderer/Vector.hpp
@@ -1,150 +1,150 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef Vector_hpp -#define Vector_hpp - -namespace sw -{ - struct Point; - struct Matrix; - struct Plane; - - struct Vector - { - Vector(); - Vector(const int i); - Vector(const Vector &v); - Vector(const Point &p); - Vector(float v_x, float v_y, float v_z); - - Vector &operator=(const Vector &v); - - union - { - float v[3]; - - struct - { - float x; - float y; - float z; - }; - }; - - float &operator[](int i); - float &operator()(int i); - - const float &operator[](int i) const; - const float &operator()(int i) const; - - Vector operator+() const; - Vector operator-() const; - - Vector &operator+=(const Vector &v); - Vector &operator-=(const Vector &v); - Vector &operator*=(float s); - Vector &operator/=(float s); - - friend bool operator==(const Vector &u, const Vector &v); - friend bool operator!=(const Vector &u, const Vector &v); - - friend Vector operator+(const Vector &u, const Vector &v); - friend Vector operator-(const Vector &u, const Vector &v); - friend float operator*(const Vector &u, const Vector &v); // Dot product - friend Vector operator*(float s, const Vector &v); - friend Vector operator*(const Vector &v, float s); - friend Vector operator/(const Vector &v, float s); - friend float operator^(const Vector &u, const Vector &v); // Angle between vectors - friend Vector operator%(const Vector &u, const Vector &v); // Cross product - - friend Vector operator*(const Matrix &M, const Vector& v); - friend Vector operator*(const Vector &v, const Matrix &M); - friend Vector &operator*=(Vector &v, const Matrix &M); - - static float N(const Vector &v); // Norm - static float N2(const Vector &v); // Squared norm - - static Vector mirror(const Vector &v, const Plane &p); - static Vector reflect(const Vector &v, const Plane &p); - static Vector lerp(const Vector &u, const Vector &v, float t); - }; -} - -#include "Point.hpp" - -namespace sw -{ - inline Vector::Vector() - { - } - - inline Vector::Vector(const int i) - { - const float s = (float)i; - - x = s; - y = s; - z = s; - } - - inline Vector::Vector(const Vector &v) - { - x = v.x; - y = v.y; - z = v.z; - } - - inline Vector::Vector(const Point &P) - { - x = P.x; - y = P.y; - z = P.z; - } - - inline Vector::Vector(float v_x, float v_y, float v_z) - { - x = v_x; - y = v_y; - z = v_z; - } - - inline Vector &Vector::operator=(const Vector &v) - { - x = v.x; - y = v.y; - z = v.z; - - return *this; - } - - inline float &Vector::operator()(int i) - { - return v[i]; - } - - inline float &Vector::operator[](int i) - { - return v[i]; - } - - inline const float &Vector::operator()(int i) const - { - return v[i]; - } - - inline const float &Vector::operator[](int i) const - { - return v[i]; - } -} - -#endif // Vector_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2011 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef Vector_hpp +#define Vector_hpp + +namespace sw +{ + struct Point; + struct Matrix; + struct Plane; + + struct Vector + { + Vector(); + Vector(const int i); + Vector(const Vector &v); + Vector(const Point &p); + Vector(float v_x, float v_y, float v_z); + + Vector &operator=(const Vector &v); + + union + { + float v[3]; + + struct + { + float x; + float y; + float z; + }; + }; + + float &operator[](int i); + float &operator()(int i); + + const float &operator[](int i) const; + const float &operator()(int i) const; + + Vector operator+() const; + Vector operator-() const; + + Vector &operator+=(const Vector &v); + Vector &operator-=(const Vector &v); + Vector &operator*=(float s); + Vector &operator/=(float s); + + friend bool operator==(const Vector &u, const Vector &v); + friend bool operator!=(const Vector &u, const Vector &v); + + friend Vector operator+(const Vector &u, const Vector &v); + friend Vector operator-(const Vector &u, const Vector &v); + friend float operator*(const Vector &u, const Vector &v); // Dot product + friend Vector operator*(float s, const Vector &v); + friend Vector operator*(const Vector &v, float s); + friend Vector operator/(const Vector &v, float s); + friend float operator^(const Vector &u, const Vector &v); // Angle between vectors + friend Vector operator%(const Vector &u, const Vector &v); // Cross product + + friend Vector operator*(const Matrix &M, const Vector& v); + friend Vector operator*(const Vector &v, const Matrix &M); + friend Vector &operator*=(Vector &v, const Matrix &M); + + static float N(const Vector &v); // Norm + static float N2(const Vector &v); // Squared norm + + static Vector mirror(const Vector &v, const Plane &p); + static Vector reflect(const Vector &v, const Plane &p); + static Vector lerp(const Vector &u, const Vector &v, float t); + }; +} + +#include "Point.hpp" + +namespace sw +{ + inline Vector::Vector() + { + } + + inline Vector::Vector(const int i) + { + const float s = (float)i; + + x = s; + y = s; + z = s; + } + + inline Vector::Vector(const Vector &v) + { + x = v.x; + y = v.y; + z = v.z; + } + + inline Vector::Vector(const Point &P) + { + x = P.x; + y = P.y; + z = P.z; + } + + inline Vector::Vector(float v_x, float v_y, float v_z) + { + x = v_x; + y = v_y; + z = v_z; + } + + inline Vector &Vector::operator=(const Vector &v) + { + x = v.x; + y = v.y; + z = v.z; + + return *this; + } + + inline float &Vector::operator()(int i) + { + return v[i]; + } + + inline float &Vector::operator[](int i) + { + return v[i]; + } + + inline const float &Vector::operator()(int i) const + { + return v[i]; + } + + inline const float &Vector::operator[](int i) const + { + return v[i]; + } +} + +#endif // Vector_hpp
diff --git a/src/Renderer/Vertex.hpp b/src/Renderer/Vertex.hpp index b1f77c5..0b593a7 100644 --- a/src/Renderer/Vertex.hpp +++ b/src/Renderer/Vertex.hpp
@@ -1,99 +1,99 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef Vertex_hpp -#define Vertex_hpp - -#include "Color.hpp" -#include "Common/MetaMacro.hpp" -#include "Common/Types.hpp" - -namespace sw -{ - enum Out // Default vertex attribute semantic - { - Pos = 0, - D0 = 1, - D1 = 2, - T0 = 3, - T1 = 4, - T2 = 5, - T3 = 6, - T4 = 7, - T5 = 8, - T6 = 9, - T7 = 10, - Fog = 11, // x component - Pts = Fog // y component - }; - - struct UVWQ - { - float u; - float v; - float w; - float q; - - float &operator[](int i) - { - return (&u)[i]; - } - }; - - ALIGN(16, struct Vertex - { - union - { - struct // Fixed semantics - { - union // Position - { - struct - { - float x; - float y; - float z; - float w; - }; - - struct - { - float4 P; - }; - }; - - Color<float> C[2]; // Diffuse and specular color - - UVWQ T[8]; // Texture coordinates - - float f; // Fog - float pSize; // Point size - unsigned char padding0[4]; - unsigned char clipFlags; - unsigned char padding1[3]; - }; - - float4 v[12]; // Generic components using semantic declaration - }; - - struct // Projected coordinates - { - int X; - int Y; - float Z; - float W; - }; - }); - - META_ASSERT((sizeof(Vertex) & 0x0000000F) == 0); -} - -#endif // Vertex_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2011 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef Vertex_hpp +#define Vertex_hpp + +#include "Color.hpp" +#include "Common/MetaMacro.hpp" +#include "Common/Types.hpp" + +namespace sw +{ + enum Out // Default vertex attribute semantic + { + Pos = 0, + D0 = 1, + D1 = 2, + T0 = 3, + T1 = 4, + T2 = 5, + T3 = 6, + T4 = 7, + T5 = 8, + T6 = 9, + T7 = 10, + Fog = 11, // x component + Pts = Fog // y component + }; + + struct UVWQ + { + float u; + float v; + float w; + float q; + + float &operator[](int i) + { + return (&u)[i]; + } + }; + + ALIGN(16, struct Vertex + { + union + { + struct // Fixed semantics + { + union // Position + { + struct + { + float x; + float y; + float z; + float w; + }; + + struct + { + float4 P; + }; + }; + + Color<float> C[2]; // Diffuse and specular color + + UVWQ T[8]; // Texture coordinates + + float f; // Fog + float pSize; // Point size + unsigned char padding0[4]; + unsigned char clipFlags; + unsigned char padding1[3]; + }; + + float4 v[12]; // Generic components using semantic declaration + }; + + struct // Projected coordinates + { + int X; + int Y; + float Z; + float W; + }; + }); + + META_ASSERT((sizeof(Vertex) & 0x0000000F) == 0); +} + +#endif // Vertex_hpp
diff --git a/src/Renderer/VertexProcessor.cpp b/src/Renderer/VertexProcessor.cpp index 6f23be7..c660ef6 100644 --- a/src/Renderer/VertexProcessor.cpp +++ b/src/Renderer/VertexProcessor.cpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2011 TransGaming Inc. +// Copyright(c) 2005-2012 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -11,7 +11,6 @@ #include "VertexProcessor.hpp" -#include "Viewport.hpp" #include "Math.hpp" #include "VertexPipeline.hpp" #include "VertexProgram.hpp" @@ -98,6 +97,7 @@ updateModelMatrix[i] = true; } + precacheDLL = 0; routineCache = 0; setRoutineCacheSize(1024); } @@ -795,11 +795,11 @@ if(context->vertexShader) { - state.shaderHash = context->vertexShader->getHash(); + state.shaderID = context->vertexShader->getSerialID(); } else { - state.shaderHash = 0; + state.shaderID = 0; } state.fixedFunction = !context->vertexShader && context->pixelShaderVersion() < 0x0300; @@ -837,7 +837,6 @@ state.pointScaleActive = context->pointScaleActive(); state.preTransformed = context->preTransformed; - state.postTransform = context->postTransform; state.superSampling = context->renderTarget[0]->getSuperSampleCount() > 1; state.multiSampling = context->renderTarget[0]->getMultiSampleCount() > 1; @@ -895,10 +894,10 @@ for(int stage = 0; stage < 8; stage++) { - if(context->vertexTextureActive(stage, 0)) state.output[T0 + stage].write |= 0x01; - if(context->vertexTextureActive(stage, 1)) state.output[T0 + stage].write |= 0x02; - if(context->vertexTextureActive(stage, 2)) state.output[T0 + stage].write |= 0x04; - if(context->vertexTextureActive(stage, 3)) state.output[T0 + stage].write |= 0x08; + if(context->texCoordActive(stage, 0)) state.output[T0 + stage].write |= 0x01; + if(context->texCoordActive(stage, 1)) state.output[T0 + stage].write |= 0x02; + if(context->texCoordActive(stage, 2)) state.output[T0 + stage].write |= 0x04; + if(context->texCoordActive(stage, 3)) state.output[T0 + stage].write |= 0x08; } if(context->fogActive())
diff --git a/src/Renderer/VertexProcessor.hpp b/src/Renderer/VertexProcessor.hpp index 6738dca..5e3ff96 100644 --- a/src/Renderer/VertexProcessor.hpp +++ b/src/Renderer/VertexProcessor.hpp
@@ -1,313 +1,312 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_VertexProcessor_hpp -#define sw_VertexProcessor_hpp - -#include "Matrix.hpp" -#include "Context.hpp" -#include "LRUCache.hpp" - -namespace sw -{ - class Viewport; - class Routine; - struct DrawData; - - struct VertexCache // FIXME: Variable size - { - void clear(); - - Vertex vertex[16][4]; - unsigned int tag[16]; - - int drawCall; - }; - - struct VertexTask - { - unsigned int count; - VertexCache vertexCache; - }; - - class VertexProcessor - { - public: - struct States - { - unsigned int computeHash(); - - uint64_t shaderHash; - - unsigned int fixedFunction : 1; - unsigned int shaderContainsTexldl : 1; - unsigned int positionRegister : 4; - unsigned int pointSizeRegister : 4; // 0xF signifies no vertex point size - - unsigned int vertexBlendMatrixCount : 3; - unsigned int indexedVertexBlendEnable : 1; - unsigned int vertexNormalActive : 1; - unsigned int normalizeNormals : 1; - unsigned int vertexLightingActive : 1; - unsigned int diffuseActive : 1; - unsigned int specularActive : 1; - unsigned int vertexSpecularActive : 1; - unsigned int vertexLightActive : 8; - unsigned int vertexDiffuseMaterialSourceActive : BITS(Context::MATERIAL_LAST); - unsigned int vertexSpecularMaterialSourceActive : BITS(Context::MATERIAL_LAST); - unsigned int vertexAmbientMaterialSourceActive : BITS(Context::MATERIAL_LAST); - unsigned int vertexEmissiveMaterialSourceActive : BITS(Context::MATERIAL_LAST); - unsigned int fogActive : 1; - unsigned int vertexFogMode : BITS(Context::FOG_LAST); - unsigned int rangeFogActive : 1; - unsigned int localViewerActive : 1; - unsigned int pointSizeActive : 1; - unsigned int pointScaleActive : 1; - - unsigned int preTransformed : 1; - unsigned int postTransform : 1; - unsigned int superSampling : 1; - unsigned int multiSampling : 1; - - struct TextureState - { - unsigned char texGenActive : BITS(Context::TEXGEN_LAST); - unsigned char textureTransformCountActive : 3; - unsigned char texCoordIndexActive : 3; - }; - - TextureState textureState[8]; - - Sampler::State samplerState[4]; - - struct Input - { - operator bool() const // Returns true if stream contains data - { - return count != 0; - } - - unsigned int type : BITS(STREAMTYPE_LAST); - unsigned int count : 3; - unsigned int normalized : 1; - }; - - struct Output - { - union - { - unsigned char write : 4; - - struct - { - unsigned char xWrite : 1; - unsigned char yWrite : 1; - unsigned char zWrite : 1; - unsigned char wWrite : 1; - }; - }; - - union - { - unsigned char clamp : 4; - - struct - { - unsigned char xClamp : 1; - unsigned char yClamp : 1; - unsigned char zClamp : 1; - unsigned char wClamp : 1; - }; - }; - }; - - Input input[16]; - Output output[12]; - }; - - struct State : States - { - State(); - - bool operator==(const State &state) const; - - unsigned int hash; - }; - - struct FixedFunction - { - float4 transformT[12][4]; - float4 cameraTransformT[12][4]; - float4 normalTransformT[12][4]; - float4 textureTransform[8][4]; - - float4 lightPosition[8]; - float4 lightAmbient[8]; - float4 lightSpecular[8]; - float4 lightDiffuse[8]; - float4 attenuationConstant[8]; - float4 attenuationLinear[8]; - float4 attenuationQuadratic[8]; - float lightRange[8]; - float4 materialDiffuse; - float4 materialSpecular; - float materialShininess; - float4 globalAmbient; - float4 materialEmission; - float4 materialAmbient; - }; - - struct PointSprite - { - float4 pointSize; - float pointSizeMin; - float pointSizeMax; - float pointScaleA; - float pointScaleB; - float pointScaleC; - }; - - typedef void (__cdecl *RoutinePointer)(Vertex *output, unsigned int *batch, VertexTask *vertexTask, DrawData *draw); - - VertexProcessor(Context *context); - - virtual ~VertexProcessor(); - - virtual void setInputStream(int index, const Stream &stream); - - virtual void setInputPositionStream(const Stream &stream); - virtual void setInputBlendWeightStream(const Stream &stream); - virtual void setInputBlendIndicesStream(const Stream &stream); - virtual void setInputNormalStream(const Stream &stream); - virtual void setInputPSizeStream(const Stream &stream); - virtual void setInputTexCoordStream(const Stream &stream, int index); - virtual void setInputPositiontStream(const Stream &stream); - virtual void setInputColorStream(const Stream &stream, int index); - - virtual void resetInputStreams(bool preTransformed); - - virtual void setFloatConstant(unsigned int index, const float value[4]); - virtual void setIntegerConstant(unsigned int index, const int integer[4]); - virtual void setBooleanConstant(unsigned int index, int boolean); - - // Transformations - virtual void setModelMatrix(const Matrix &M, int i = 0); - virtual void setViewMatrix(const Matrix &V); - virtual void setBaseMatrix(const Matrix &B); - virtual void setProjectionMatrix(const Matrix &P); - - // Lighting - virtual void setLightingEnable(bool lightingEnable); - virtual void setLightEnable(unsigned int light, bool lightEnable); - virtual void setSpecularEnable(bool specularEnable); - - virtual void setGlobalAmbient(const Color<float> &globalAmbient); - virtual void setLightPosition(unsigned int light, const Point &lightPosition); - virtual void setLightViewPosition(unsigned int light, const Point &lightPosition); - virtual void setLightDiffuse(unsigned int light, const Color<float> &lightDiffuse); - virtual void setLightSpecular(unsigned int light, const Color<float> &lightSpecular); - virtual void setLightAmbient(unsigned int light, const Color<float> &lightAmbient); - virtual void setLightAttenuation(unsigned int light, float constant, float linear, float quadratic); - virtual void setLightRange(unsigned int light, float lightRange); - - virtual void setFogEnable(bool fogEnable); - virtual void setVertexFogMode(Context::FogMode fogMode); - virtual void setRangeFogEnable(bool enable); - - virtual void setColorVertexEnable(bool colorVertexEnable); - virtual void setDiffuseMaterialSource(Context::MaterialSource diffuseMaterialSource); - virtual void setSpecularMaterialSource(Context::MaterialSource specularMaterialSource); - virtual void setAmbientMaterialSource(Context::MaterialSource ambientMaterialSource); - virtual void setEmissiveMaterialSource(Context::MaterialSource emissiveMaterialSource); - - virtual void setMaterialEmission(const Color<float> &emission); - virtual void setMaterialAmbient(const Color<float> &materialAmbient); - virtual void setMaterialDiffuse(const Color<float> &diffuseColor); - virtual void setMaterialSpecular(const Color<float> &specularColor); - virtual void setMaterialShininess(float specularPower); - - virtual void setIndexedVertexBlendEnable(bool indexedVertexBlendEnable); - virtual void setVertexBlendMatrixCount(unsigned int vertexBlendMatrixCount); - - virtual void setTextureWrap(unsigned int stage, int mask); - virtual void setTexGen(unsigned int stage, Context::TexGen texGen); - virtual void setLocalViewer(bool localViewer); - virtual void setNormalizeNormals(bool normalizeNormals); - virtual void setTextureMatrix(int stage, const Matrix &T); - virtual void setTextureTransform(int stage, int count, bool project); - - virtual void setTextureFilter(unsigned int sampler, FilterType textureFilter); - virtual void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter); - virtual void setGatherEnable(unsigned int sampler, bool enable); - virtual void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode); - virtual void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode); - virtual void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode); - virtual void setReadSRGB(unsigned int sampler, bool sRGB); - virtual void setMipmapLOD(unsigned int sampler, float bias); - virtual void setBorderColor(unsigned int sampler, const Color<float> &borderColor); - virtual void setMaxAnisotropy(unsigned int stage, unsigned int maxAnisotropy); - - virtual void setPointSize(float pointSize); - virtual void setPointSizeMin(float pointSizeMin); - virtual void setPointSizeMax(float pointSizeMax); - virtual void setPointScaleA(float pointScaleA); - virtual void setPointScaleB(float pointScaleB); - virtual void setPointScaleC(float pointScaleC); - - protected: - const Matrix &getModelTransform(int i); - const Matrix &getViewTransform(); - - const State update(); - Routine *routine(const State &state); - - bool isFixedFunction(); - void setRoutineCacheSize(int cacheSize); - - // Shader constants - float4 c[256 + 1]; // One extra for indices out of range, c[256] = {0, 0, 0, 0} - int4 i[16]; - bool b[16]; - - PointSprite point; - FixedFunction ff; - - private: - void updateTransform(); - - void setTransform(const Matrix &M, int i); - void setCameraTransform(const Matrix &M, int i); - void setNormalTransform(const Matrix &M, int i); - - Context *const context; - - LRUCache<State, Routine> *routineCache; - - protected: - Matrix M[12]; // Model/Geometry/World matrix - Matrix V; // View/Camera/Eye matrix - Matrix B; // Base matrix - Matrix P; // Projection matrix - Matrix PB; // P * B - Matrix PBV; // P * B * V - Matrix PBVM[12]; // P * B * V * M - - // Update hierarchy - bool updateMatrix; - bool updateModelMatrix[12]; - bool updateViewMatrix; - bool updateBaseMatrix; - bool updateProjectionMatrix; - bool updateLighting; - }; -} - -#endif // sw_VertexProcessor_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2012 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef sw_VertexProcessor_hpp +#define sw_VertexProcessor_hpp + +#include "Matrix.hpp" +#include "Context.hpp" +#include "LRUCache.hpp" + +namespace sw +{ + class Routine; + struct DrawData; + + struct VertexCache // FIXME: Variable size + { + void clear(); + + Vertex vertex[16][4]; + unsigned int tag[16]; + + int drawCall; + }; + + struct VertexTask + { + unsigned int count; + VertexCache vertexCache; + }; + + class VertexProcessor + { + public: + struct States + { + unsigned int computeHash(); + + uint64_t shaderID; + + unsigned int fixedFunction : 1; + unsigned int shaderContainsTexldl : 1; + unsigned int positionRegister : 4; + unsigned int pointSizeRegister : 4; // 0xF signifies no vertex point size + + unsigned int vertexBlendMatrixCount : 3; + unsigned int indexedVertexBlendEnable : 1; + unsigned int vertexNormalActive : 1; + unsigned int normalizeNormals : 1; + unsigned int vertexLightingActive : 1; + unsigned int diffuseActive : 1; + unsigned int specularActive : 1; + unsigned int vertexSpecularActive : 1; + unsigned int vertexLightActive : 8; + unsigned int vertexDiffuseMaterialSourceActive : BITS(Context::MATERIAL_LAST); + unsigned int vertexSpecularMaterialSourceActive : BITS(Context::MATERIAL_LAST); + unsigned int vertexAmbientMaterialSourceActive : BITS(Context::MATERIAL_LAST); + unsigned int vertexEmissiveMaterialSourceActive : BITS(Context::MATERIAL_LAST); + unsigned int fogActive : 1; + unsigned int vertexFogMode : BITS(Context::FOG_LAST); + unsigned int rangeFogActive : 1; + unsigned int localViewerActive : 1; + unsigned int pointSizeActive : 1; + unsigned int pointScaleActive : 1; + + unsigned int preTransformed : 1; + unsigned int superSampling : 1; + unsigned int multiSampling : 1; + + struct TextureState + { + unsigned char texGenActive : BITS(Context::TEXGEN_LAST); + unsigned char textureTransformCountActive : 3; + unsigned char texCoordIndexActive : 3; + }; + + TextureState textureState[8]; + + Sampler::State samplerState[4]; + + struct Input + { + operator bool() const // Returns true if stream contains data + { + return count != 0; + } + + unsigned int type : BITS(STREAMTYPE_LAST); + unsigned int count : 3; + unsigned int normalized : 1; + }; + + struct Output + { + union + { + unsigned char write : 4; + + struct + { + unsigned char xWrite : 1; + unsigned char yWrite : 1; + unsigned char zWrite : 1; + unsigned char wWrite : 1; + }; + }; + + union + { + unsigned char clamp : 4; + + struct + { + unsigned char xClamp : 1; + unsigned char yClamp : 1; + unsigned char zClamp : 1; + unsigned char wClamp : 1; + }; + }; + }; + + Input input[16]; + Output output[12]; + }; + + struct State : States + { + State(); + + bool operator==(const State &state) const; + + unsigned int hash; + }; + + struct FixedFunction + { + float4 transformT[12][4]; + float4 cameraTransformT[12][4]; + float4 normalTransformT[12][4]; + float4 textureTransform[8][4]; + + float4 lightPosition[8]; + float4 lightAmbient[8]; + float4 lightSpecular[8]; + float4 lightDiffuse[8]; + float4 attenuationConstant[8]; + float4 attenuationLinear[8]; + float4 attenuationQuadratic[8]; + float lightRange[8]; + float4 materialDiffuse; + float4 materialSpecular; + float materialShininess; + float4 globalAmbient; + float4 materialEmission; + float4 materialAmbient; + }; + + struct PointSprite + { + float4 pointSize; + float pointSizeMin; + float pointSizeMax; + float pointScaleA; + float pointScaleB; + float pointScaleC; + }; + + typedef void (__cdecl *RoutinePointer)(Vertex *output, unsigned int *batch, VertexTask *vertexTask, DrawData *draw); + + VertexProcessor(Context *context); + + virtual ~VertexProcessor(); + + virtual void setInputStream(int index, const Stream &stream); + + virtual void setInputPositionStream(const Stream &stream); + virtual void setInputBlendWeightStream(const Stream &stream); + virtual void setInputBlendIndicesStream(const Stream &stream); + virtual void setInputNormalStream(const Stream &stream); + virtual void setInputPSizeStream(const Stream &stream); + virtual void setInputTexCoordStream(const Stream &stream, int index); + virtual void setInputPositiontStream(const Stream &stream); + virtual void setInputColorStream(const Stream &stream, int index); + + virtual void resetInputStreams(bool preTransformed); + + virtual void setFloatConstant(unsigned int index, const float value[4]); + virtual void setIntegerConstant(unsigned int index, const int integer[4]); + virtual void setBooleanConstant(unsigned int index, int boolean); + + // Transformations + virtual void setModelMatrix(const Matrix &M, int i = 0); + virtual void setViewMatrix(const Matrix &V); + virtual void setBaseMatrix(const Matrix &B); + virtual void setProjectionMatrix(const Matrix &P); + + // Lighting + virtual void setLightingEnable(bool lightingEnable); + virtual void setLightEnable(unsigned int light, bool lightEnable); + virtual void setSpecularEnable(bool specularEnable); + + virtual void setGlobalAmbient(const Color<float> &globalAmbient); + virtual void setLightPosition(unsigned int light, const Point &lightPosition); + virtual void setLightViewPosition(unsigned int light, const Point &lightPosition); + virtual void setLightDiffuse(unsigned int light, const Color<float> &lightDiffuse); + virtual void setLightSpecular(unsigned int light, const Color<float> &lightSpecular); + virtual void setLightAmbient(unsigned int light, const Color<float> &lightAmbient); + virtual void setLightAttenuation(unsigned int light, float constant, float linear, float quadratic); + virtual void setLightRange(unsigned int light, float lightRange); + + virtual void setFogEnable(bool fogEnable); + virtual void setVertexFogMode(Context::FogMode fogMode); + virtual void setRangeFogEnable(bool enable); + + virtual void setColorVertexEnable(bool colorVertexEnable); + virtual void setDiffuseMaterialSource(Context::MaterialSource diffuseMaterialSource); + virtual void setSpecularMaterialSource(Context::MaterialSource specularMaterialSource); + virtual void setAmbientMaterialSource(Context::MaterialSource ambientMaterialSource); + virtual void setEmissiveMaterialSource(Context::MaterialSource emissiveMaterialSource); + + virtual void setMaterialEmission(const Color<float> &emission); + virtual void setMaterialAmbient(const Color<float> &materialAmbient); + virtual void setMaterialDiffuse(const Color<float> &diffuseColor); + virtual void setMaterialSpecular(const Color<float> &specularColor); + virtual void setMaterialShininess(float specularPower); + + virtual void setIndexedVertexBlendEnable(bool indexedVertexBlendEnable); + virtual void setVertexBlendMatrixCount(unsigned int vertexBlendMatrixCount); + + virtual void setTextureWrap(unsigned int stage, int mask); + virtual void setTexGen(unsigned int stage, Context::TexGen texGen); + virtual void setLocalViewer(bool localViewer); + virtual void setNormalizeNormals(bool normalizeNormals); + virtual void setTextureMatrix(int stage, const Matrix &T); + virtual void setTextureTransform(int stage, int count, bool project); + + virtual void setTextureFilter(unsigned int sampler, FilterType textureFilter); + virtual void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter); + virtual void setGatherEnable(unsigned int sampler, bool enable); + virtual void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode); + virtual void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode); + virtual void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode); + virtual void setReadSRGB(unsigned int sampler, bool sRGB); + virtual void setMipmapLOD(unsigned int sampler, float bias); + virtual void setBorderColor(unsigned int sampler, const Color<float> &borderColor); + virtual void setMaxAnisotropy(unsigned int stage, unsigned int maxAnisotropy); + + virtual void setPointSize(float pointSize); + virtual void setPointSizeMin(float pointSizeMin); + virtual void setPointSizeMax(float pointSizeMax); + virtual void setPointScaleA(float pointScaleA); + virtual void setPointScaleB(float pointScaleB); + virtual void setPointScaleC(float pointScaleC); + + protected: + const Matrix &getModelTransform(int i); + const Matrix &getViewTransform(); + + const State update(); + Routine *routine(const State &state); + + bool isFixedFunction(); + void setRoutineCacheSize(int cacheSize); + + // Shader constants + float4 c[256 + 1]; // One extra for indices out of range, c[256] = {0, 0, 0, 0} + int4 i[16]; + bool b[16]; + + PointSprite point; + FixedFunction ff; + + private: + void updateTransform(); + + void setTransform(const Matrix &M, int i); + void setCameraTransform(const Matrix &M, int i); + void setNormalTransform(const Matrix &M, int i); + + Context *const context; + + LRUCache<State, Routine> *routineCache; + HMODULE precacheDLL; + + protected: + Matrix M[12]; // Model/Geometry/World matrix + Matrix V; // View/Camera/Eye matrix + Matrix B; // Base matrix + Matrix P; // Projection matrix + Matrix PB; // P * B + Matrix PBV; // P * B * V + Matrix PBVM[12]; // P * B * V * M + + // Update hierarchy + bool updateMatrix; + bool updateModelMatrix[12]; + bool updateViewMatrix; + bool updateBaseMatrix; + bool updateProjectionMatrix; + bool updateLighting; + }; +} + +#endif // sw_VertexProcessor_hpp
diff --git a/src/Renderer/Viewport.hpp b/src/Renderer/Viewport.hpp index 010d921..a946c69 100644 --- a/src/Renderer/Viewport.hpp +++ b/src/Renderer/Viewport.hpp
@@ -1,48 +1,48 @@ -// SwiftShader Software Renderer -// -// Copyright(c) 2005-2011 TransGaming Inc. -// -// All rights reserved. No part of this software may be copied, distributed, transmitted, -// transcribed, stored in a retrieval system, translated into any human or computer -// language by any means, or disclosed to third parties without the explicit written -// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express -// or implied, including but not limited to any patent rights, are granted to you. -// - -#ifndef sw_Viewport_hpp -#define sw_Viewport_hpp - -namespace sw -{ - class Viewport - { - public: - Viewport(); - - ~Viewport(); - - void setLeft(float l); - void setTop(float t); - void setWidth(float w); - void setHeight(float h); - void setNear(float n); - void setFar(float f); - - float getLeft() const; - float getTop() const; - float getWidth() const; - float getHeight() const; - float getNear() const; - float getFar() const; - - private: - float left; // Leftmost pixel column - float top; // Highest pixel row - float width; // Width in pixels - float height; // Height in pixels - float min; - float max; - }; -} - -#endif // sw_Viewport_hpp +// SwiftShader Software Renderer +// +// Copyright(c) 2005-2011 TransGaming Inc. +// +// All rights reserved. No part of this software may be copied, distributed, transmitted, +// transcribed, stored in a retrieval system, translated into any human or computer +// language by any means, or disclosed to third parties without the explicit written +// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express +// or implied, including but not limited to any patent rights, are granted to you. +// + +#ifndef sw_Viewport_hpp +#define sw_Viewport_hpp + +namespace sw +{ + class Viewport + { + public: + Viewport(); + + ~Viewport(); + + void setLeft(float l); + void setTop(float t); + void setWidth(float w); + void setHeight(float h); + void setNear(float n); + void setFar(float f); + + float getLeft() const; + float getTop() const; + float getWidth() const; + float getHeight() const; + float getNear() const; + float getFar() const; + + private: + float left; // Leftmost pixel column + float top; // Highest pixel row + float width; // Width in pixels + float height; // Height in pixels + float min; + float max; + }; +} + +#endif // sw_Viewport_hpp