-// SwiftShader Software Renderer
+// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
-// Copyright(c) 2005-2013 TransGaming Inc.
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
//
-// 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.
+// http://www.apache.org/licenses/LICENSE-2.0
//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
#ifndef sw_VertexRoutine_hpp
#define sw_VertexRoutine_hpp
namespace sw
{
- class VertexRoutine
+ class VertexRoutinePrototype : public Function<Void(Pointer<Byte>, Pointer<Byte>, Pointer<Byte>, Pointer<Byte>)>
{
- protected:
- struct Registers
- {
- Registers(const VertexShader *shader) :
- r(shader && shader->dynamicallyIndexedTemporaries),
- v(shader && shader->dynamicallyIndexedInput),
- o(shader && shader->dynamicallyIndexedOutput)
- {
- loopDepth = -1;
- enableStack[0] = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
-
- if(shader && shader->containsBreakInstruction())
- {
- enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
- }
-
- if(shader && shader->containsContinueInstruction())
- {
- enableContinue = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
- }
- }
-
- Pointer<Byte> data;
- Pointer<Byte> constants;
-
- Int clipFlags;
-
- RegisterArray<16> v;
- RegisterArray<4096> r;
- RegisterArray<12> o;
- Vector4f a0;
- Array<Int, 4> aL;
- Vector4f p0;
-
- Array<Int, 4> increment;
- Array<Int, 4> iteration;
-
- Int loopDepth;
- Int stackIndex; // FIXME: Inc/decrement callStack
- Array<UInt, 16> callStack;
+ public:
+ VertexRoutinePrototype() : vertex(Arg<0>()), batch(Arg<1>()), task(Arg<2>()), data(Arg<3>()) {}
+ virtual ~VertexRoutinePrototype() {};
- Int enableIndex;
- Array<Int4, 1 + 24> enableStack;
- Int4 enableBreak;
- Int4 enableContinue;
- Int4 enableLeave;
- };
+ protected:
+ Pointer<Byte> vertex;
+ Pointer<Byte> batch;
+ Pointer<Byte> task;
+ Pointer<Byte> data;
+ };
+ class VertexRoutine : public VertexRoutinePrototype
+ {
public:
VertexRoutine(const VertexProcessor::State &state, const VertexShader *shader);
-
virtual ~VertexRoutine();
void generate();
- Routine *getRoutine();
protected:
+ Pointer<Byte> constants;
+
+ Int clipFlags;
+
+ RegisterArray<MAX_VERTEX_INPUTS> v; // Input registers
+ RegisterArray<MAX_VERTEX_OUTPUTS> o; // Output registers
+
const VertexProcessor::State &state;
- const VertexShader *const shader;
- private:
- virtual void pipeline(Registers &r) = 0;
+ private:
+ virtual void pipeline(UInt &index) = 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;
+ Vector4f readStream(Pointer<Byte> &buffer, UInt &stride, const Stream &stream, const UInt &index);
+ void readInput(UInt &index);
+ void computeClipFlags();
+ void postTransform();
+ void writeCache(Pointer<Byte> &cacheLine);
+ void writeVertex(const Pointer<Byte> &vertex, Pointer<Byte> &cacheLine);
+ void transformFeedback(const Pointer<Byte> &vertex, const UInt &primitiveNumber, const UInt &indexInPrimitive);
};
}