Derive VertexRoutine from Function<>. Bug 22652760 Change-Id: I48e9e1f3ff677429eff1aea2f80b1e384a537a14 Reviewed-on: https://swiftshader-review.googlesource.com/4557 Tested-by: Nicolas Capens <capn@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/VertexProcessor.cpp b/src/Renderer/VertexProcessor.cpp index 30e8cd5..5517820 100644 --- a/src/Renderer/VertexProcessor.cpp +++ b/src/Renderer/VertexProcessor.cpp
@@ -73,7 +73,7 @@ P = 0; PB = 0; PBV = 0; - + for(int i = 0; i < 12; i++) { PBVM[i] = 0; @@ -271,7 +271,7 @@ { if(light < 8) { - ff.attenuationConstant[light] = replicate(constant); + ff.attenuationConstant[light] = replicate(constant); ff.attenuationLinear[light] = replicate(linear); ff.attenuationQuadratic[light] = replicate(quadratic); } @@ -707,7 +707,7 @@ { PB = P * B; PBV = PB * V; - + for(int i = 0; i < activeMatrices; i++) { PBVM[i] = PBV * M[i]; @@ -723,7 +723,7 @@ { PB = P * B; PBV = PB * V; - + for(int i = 0; i < activeMatrices; i++) { PBVM[i] = PBV * M[i]; @@ -737,7 +737,7 @@ if(updateViewMatrix) { PBV = PB * V; - + for(int i = 0; i < activeMatrices; i++) { PBVM[i] = PBV * M[i]; @@ -808,7 +808,7 @@ state.shaderContainsTexldl = context->vertexShader ? context->vertexShader->containsTexldl() : false; state.positionRegister = context->vertexShader ? context->vertexShader->positionRegister : Pos; state.pointSizeRegister = context->vertexShader ? context->vertexShader->pointSizeRegister : Pts; - + state.vertexBlendMatrixCount = context->vertexBlendMatrixCountActive(); state.indexedVertexBlendEnable = context->indexedVertexBlendActive(); state.vertexNormalActive = context->vertexNormalActive(); @@ -888,7 +888,7 @@ { state.output[D0].write = 0xF; } - + if(context->specularActive()) { state.output[D1].write = 0xF; @@ -968,7 +968,7 @@ } generator->generate(); - routine = generator->getRoutine(); + routine = (*generator)(L"VertexRoutine_%0.8X", state.shaderID); delete generator; routineCache->add(state, routine);
diff --git a/src/Shader/VertexRoutine.cpp b/src/Shader/VertexRoutine.cpp index b875517..d41b2b7 100644 --- a/src/Shader/VertexRoutine.cpp +++ b/src/Shader/VertexRoutine.cpp
@@ -23,9 +23,8 @@ extern bool halfIntegerCoordinates; // Pixel centers are not at integer coordinates extern bool symmetricNormalizedDepth; // [-1, 1] instead of [0, 1] - VertexRoutine::VertexRoutine(const VertexProcessor::State &state, const VertexShader *shader) : state(state), shader(shader) + VertexRoutine::VertexRoutine(const VertexProcessor::State &state, const VertexShader *shader) : r(shader), state(state), shader(shader) { - routine = 0; } VertexRoutine::~VertexRoutine() @@ -34,67 +33,56 @@ void VertexRoutine::generate() { - Function<Void(Pointer<Byte>, Pointer<Byte>, Pointer<Byte>, Pointer<Byte>)> function; + Pointer<Byte> vertex(Arg<0>()); + Pointer<Byte> batch(Arg<1>()); + Pointer<Byte> task(Arg<2>()); + Pointer<Byte> data(Arg<3>()); + + const bool texldl = state.shaderContainsTexldl; + + Pointer<Byte> cache = task + OFFSET(VertexTask,vertexCache); + Pointer<Byte> vertexCache = cache + OFFSET(VertexCache,vertex); + Pointer<Byte> tagCache = cache + OFFSET(VertexCache,tag); + + UInt vertexCount = *Pointer<UInt>(task + OFFSET(VertexTask,vertexCount)); + + r.data = data; + r.constants = *Pointer<Pointer<Byte> >(data + OFFSET(DrawData,constants)); + if(shader && shader->instanceIdDeclared) { - Pointer<Byte> vertex(function.Arg<0>()); - Pointer<Byte> batch(function.Arg<1>()); - Pointer<Byte> task(function.Arg<2>()); - Pointer<Byte> data(function.Arg<3>()); - - const bool texldl = state.shaderContainsTexldl; - - Pointer<Byte> cache = task + OFFSET(VertexTask,vertexCache); - Pointer<Byte> vertexCache = cache + OFFSET(VertexCache,vertex); - Pointer<Byte> tagCache = cache + OFFSET(VertexCache,tag); - - UInt vertexCount = *Pointer<UInt>(task + OFFSET(VertexTask,vertexCount)); - - Registers r(shader); - r.data = data; - r.constants = *Pointer<Pointer<Byte> >(data + OFFSET(DrawData,constants)); - if(shader && shader->instanceIdDeclared) - { - r.instanceID = *Pointer<Int>(data + OFFSET(DrawData, instanceID)); - } - - Do - { - UInt index = *Pointer<UInt>(batch); - UInt tagIndex = index & 0x0000003C; - UInt indexQ = !texldl ? UInt(index & 0xFFFFFFFC) : index; // FIXME: TEXLDL hack to have independent LODs, hurts performance. - - If(*Pointer<UInt>(tagCache + tagIndex) != indexQ) - { - *Pointer<UInt>(tagCache + tagIndex) = indexQ; - - readInput(r, indexQ); - pipeline(r); - postTransform(r); - computeClipFlags(r); - - Pointer<Byte> cacheLine0 = vertexCache + tagIndex * UInt((int)sizeof(Vertex)); - writeCache(cacheLine0, r); - } - - UInt cacheIndex = index & 0x0000003F; - Pointer<Byte> cacheLine = vertexCache + cacheIndex * UInt((int)sizeof(Vertex)); - writeVertex(vertex, cacheLine); - - vertex += sizeof(Vertex); - batch += sizeof(unsigned int); - vertexCount--; - } - Until(vertexCount == 0) - - Return(); + r.instanceID = *Pointer<Int>(data + OFFSET(DrawData, instanceID)); } - routine = function(L"VertexRoutine_%0.8X", state.shaderID); - } + Do + { + UInt index = *Pointer<UInt>(batch); + UInt tagIndex = index & 0x0000003C; + UInt indexQ = !texldl ? UInt(index & 0xFFFFFFFC) : index; // FIXME: TEXLDL hack to have independent LODs, hurts performance. - Routine *VertexRoutine::getRoutine() - { - return routine; + If(*Pointer<UInt>(tagCache + tagIndex) != indexQ) + { + *Pointer<UInt>(tagCache + tagIndex) = indexQ; + + readInput(r, indexQ); + pipeline(r); + postTransform(r); + computeClipFlags(r); + + Pointer<Byte> cacheLine0 = vertexCache + tagIndex * UInt((int)sizeof(Vertex)); + writeCache(cacheLine0, r); + } + + UInt cacheIndex = index & 0x0000003F; + Pointer<Byte> cacheLine = vertexCache + cacheIndex * UInt((int)sizeof(Vertex)); + writeVertex(vertex, cacheLine); + + vertex += sizeof(Vertex); + batch += sizeof(unsigned int); + vertexCount--; + } + Until(vertexCount == 0) + + Return(); } void VertexRoutine::readInput(Registers &r, UInt &index) @@ -242,7 +230,7 @@ v.y = Float4(*Pointer<Short4>(source1)); v.z = Float4(*Pointer<Short4>(source2)); v.w = Float4(*Pointer<Short4>(source3)); - + transpose4xN(v.x, v.y, v.z, v.w, stream.count); if(stream.normalized) @@ -251,7 +239,7 @@ if(stream.count >= 2) v.y *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleShort)); if(stream.count >= 3) v.z *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleShort)); if(stream.count >= 4) v.w *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleShort)); - } + } } break; case STREAMTYPE_USHORT: @@ -260,7 +248,7 @@ v.y = Float4(*Pointer<UShort4>(source1)); v.z = Float4(*Pointer<UShort4>(source2)); v.w = Float4(*Pointer<UShort4>(source3)); - + transpose4xN(v.x, v.y, v.z, v.w, stream.count); if(stream.normalized) @@ -277,7 +265,7 @@ // FIXME: Vectorize { Int x, y, z; - + x = y = z = *Pointer<Int>(source0); v.x.x = Float(x & 0x000003FF); @@ -287,7 +275,7 @@ { Int x, y, z; - + x = y = z = *Pointer<Int>(source1); v.y.x = Float(x & 0x000003FF); @@ -297,7 +285,7 @@ { Int x, y, z; - + x = y = z = *Pointer<Int>(source2); v.z.x = Float(x & 0x000003FF); @@ -307,7 +295,7 @@ { Int x, y, z; - + x = y = z = *Pointer<Int>(source3); v.w.x = Float(x & 0x000003FF); @@ -326,7 +314,7 @@ // FIXME: Vectorize { Int x, y, z; - + x = y = z = *Pointer<Int>(source0); v.x.x = Float((x << 22) & 0xFFC00000); @@ -336,7 +324,7 @@ { Int x, y, z; - + x = y = z = *Pointer<Int>(source1); v.y.x = Float((x << 22) & 0xFFC00000); @@ -346,7 +334,7 @@ { Int x, y, z; - + x = y = z = *Pointer<Int>(source2); v.z.x = Float((x << 22) & 0xFFC00000); @@ -356,7 +344,7 @@ { Int x, y, z; - + x = y = z = *Pointer<Int>(source3); v.w.x = Float((x << 22) & 0xFFC00000);
diff --git a/src/Shader/VertexRoutine.hpp b/src/Shader/VertexRoutine.hpp index 26663d7..55b1018 100644 --- a/src/Shader/VertexRoutine.hpp +++ b/src/Shader/VertexRoutine.hpp
@@ -19,7 +19,7 @@ namespace sw { - class VertexRoutine + class VertexRoutine : public Function<Void(Pointer<Byte>, Pointer<Byte>, Pointer<Byte>, Pointer<Byte>)> { protected: struct Registers @@ -31,7 +31,7 @@ { loopDepth = -1; enableStack[0] = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); - + if(shader && shader->containsBreakInstruction()) { enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); @@ -71,31 +71,30 @@ Int instanceID; }; + Registers r; + public: VertexRoutine(const VertexProcessor::State &state, const VertexShader *shader); virtual ~VertexRoutine(); void generate(); - Routine *getRoutine(); protected: const VertexProcessor::State &state; const VertexShader *const shader; - private: + private: virtual void pipeline(Registers &r) = 0; typedef VertexProcessor::State::Input Stream; - + Vector4f readStream(Registers &r, Pointer<Byte> &buffer, UInt &stride, const Stream &stream, const UInt &index); void readInput(Registers &r, UInt &index); void computeClipFlags(Registers &r); void postTransform(Registers &r); void writeCache(Pointer<Byte> &cacheLine, Registers &r); void writeVertex(Pointer<Byte> &vertex, Pointer<Byte> &cacheLine); - - Routine *routine; }; }