OSDN Git Service

Make Function variadic and take a function signature.
authorNicolas Capens <capn@google.com>
Thu, 5 Feb 2015 17:36:46 +0000 (12:36 -0500)
committerNicolas Capens <capn@google.com>
Thu, 14 Jan 2016 14:17:54 +0000 (14:17 +0000)
Change-Id: If36ea6e74311f54bb4c2b0bc1b5b7ccd0e97d74b
Reviewed-on: https://swiftshader-review.googlesource.com/4548
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
src/Main/FrameBuffer.cpp
src/Reactor/Nucleus.hpp
src/Renderer/Blitter.cpp
src/Renderer/QuadRasterizer.cpp
src/Shader/SetupRoutine.cpp
src/Shader/VertexRoutine.cpp

index bb1151f..cd387c8 100644 (file)
@@ -234,7 +234,7 @@ namespace sw
                        bool validKey = ValidateSerialNumber(validationKey, CHECKSUM_KEY, SERIAL_PREFIX);
                #endif
 
-               Function<Void, Pointer<Byte>, Pointer<Byte> > function;
+               Function<Void(Pointer<Byte>, Pointer<Byte>)> function;
                {
                        Pointer<Byte> dst(function.arg(0));
                        Pointer<Byte> src(function.arg(1));
index e84f57d..b4758c0 100644 (file)
@@ -2475,8 +2475,13 @@ namespace sw
        template<class T>\r
        void Return(RValue<Pointer<T> > ret);\r
 \r
-       template<class R = Void, class A1 = Void, class A2 = Void, class A3 = Void, class A4 = Void>\r
-       class Function\r
+       // Generic template, leave undefined!\r
+       template<typename FunctionType>\r
+       class Function;\r
+\r
+       // Specialized for function types\r
+       template<typename Return, typename... Arguments>\r
+       class Function<Return(Arguments...)>\r
        {\r
        public:\r
                Function();\r
@@ -2917,34 +2922,35 @@ namespace sw
                Nucleus::setInsertBlock(Nucleus::createBasicBlock());\r
        }\r
 \r
-       template<class R, class A1, class A2, class A3, class A4>\r
-       Function<R, A1, A2, A3, A4>::Function()\r
+       template<typename Return, typename... Arguments>\r
+       Function<Return(Arguments...)>::Function()\r
        {\r
                core = new Nucleus();\r
 \r
-               if(!A1::isVoid()) arguments.push_back(A1::getType());\r
-               if(!A2::isVoid()) arguments.push_back(A2::getType());\r
-               if(!A3::isVoid()) arguments.push_back(A3::getType());\r
-               if(!A4::isVoid()) arguments.push_back(A4::getType());\r
+               llvm::Type *types[] = {Arguments::getType()...};\r
+               for(llvm::Type *type : types)\r
+               {\r
+                       arguments.push_back(type);\r
+               } \r
 \r
-               function = Nucleus::createFunction(R::getType(), arguments);\r
+               function = Nucleus::createFunction(Return::getType(), arguments);\r
                Nucleus::setFunction(function);\r
        }\r
 \r
-       template<class R, class A1, class A2, class A3, class A4>\r
-       Function<R, A1, A2, A3, A4>::~Function()\r
+       template<typename Return, typename... Arguments>\r
+       Function<Return(Arguments...)>::~Function()\r
        {\r
                delete core;\r
        }\r
 \r
-       template<class R, class A1, class A2, class A3, class A4>\r
-       llvm::Argument *Function<R, A1, A2, A3, A4>::arg(int index)\r
+       template<typename Return, typename... Arguments>\r
+       llvm::Argument *Function<Return(Arguments...)>::arg(int index)\r
        {\r
                return Nucleus::getArgument(function, index);\r
        }\r
 \r
-       template<class R, class A1, class A2, class A3, class A4>\r
-       Routine *Function<R, A1, A2, A3, A4>::operator()(const wchar_t *name, ...)\r
+       template<typename Return, typename... Arguments>\r
+       Routine *Function<Return(Arguments...)>::operator()(const wchar_t *name, ...)\r
        {\r
                wchar_t fullName[1024 + 1];\r
 \r
index df934f3..677b343 100644 (file)
@@ -964,7 +964,7 @@ namespace sw
 
        Routine *Blitter::generate(BlitState &state)
        {
-               Function<Void, Pointer<Byte> > function;
+               Function<Void(Pointer<Byte>)> function;
                {
                        Pointer<Byte> blit(function.arg(0));
 
index 40c84e9..dfee2f6 100644 (file)
@@ -47,7 +47,7 @@ namespace sw
 
        void QuadRasterizer::generate()
        {
-               Function<Void, Pointer<Byte>, Int, Int, Pointer<Byte> > function;
+               Function<Void(Pointer<Byte>, Int, Int, Pointer<Byte>)> function;
                {
                        #if PERF_PROFILE
                                Long pixelTime = Ticks();
index 675d8a0..08cdf59 100644 (file)
@@ -34,7 +34,7 @@ namespace sw
 
        void SetupRoutine::generate()
        {
-               Function<Bool, Pointer<Byte>, Pointer<Byte>, Pointer<Byte>, Pointer<Byte> > function;
+               Function<Bool(Pointer<Byte>, Pointer<Byte>, Pointer<Byte>, Pointer<Byte>)> function;
                {
                        Pointer<Byte> primitive(function.arg(0));
                        Pointer<Byte> tri(function.arg(1));
index e6806a1..60b193d 100644 (file)
@@ -34,7 +34,7 @@ namespace sw
 
        void VertexRoutine::generate()
        {
-               Function<Void, Pointer<Byte>, Pointer<Byte>, Pointer<Byte>, Pointer<Byte> > function;
+               Function<Void(Pointer<Byte>, Pointer<Byte>, Pointer<Byte>, Pointer<Byte>)> function;
                {
                        Pointer<Byte> vertex(function.arg(0));
                        Pointer<Byte> batch(function.arg(1));