From: Nicolas Capens Date: Thu, 5 Feb 2015 17:36:46 +0000 (-0500) Subject: Make Function variadic and take a function signature. X-Git-Tag: android-x86-7.1-r1~701 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=2ab859f2de2d8282111376603602e0ebaa8a6037;p=android-x86%2Fexternal-swiftshader.git Make Function variadic and take a function signature. Change-Id: If36ea6e74311f54bb4c2b0bc1b5b7ccd0e97d74b Reviewed-on: https://swiftshader-review.googlesource.com/4548 Reviewed-by: Alexis Hétu Reviewed-by: Nicolas Capens Tested-by: Nicolas Capens --- diff --git a/src/Main/FrameBuffer.cpp b/src/Main/FrameBuffer.cpp index bb1151fb2..cd387c8d8 100644 --- a/src/Main/FrameBuffer.cpp +++ b/src/Main/FrameBuffer.cpp @@ -234,7 +234,7 @@ namespace sw bool validKey = ValidateSerialNumber(validationKey, CHECKSUM_KEY, SERIAL_PREFIX); #endif - Function, Pointer > function; + Function, Pointer)> function; { Pointer dst(function.arg(0)); Pointer src(function.arg(1)); diff --git a/src/Reactor/Nucleus.hpp b/src/Reactor/Nucleus.hpp index e84f57d1f..b4758c06e 100644 --- a/src/Reactor/Nucleus.hpp +++ b/src/Reactor/Nucleus.hpp @@ -2475,8 +2475,13 @@ namespace sw template void Return(RValue > ret); - template - class Function + // Generic template, leave undefined! + template + class Function; + + // Specialized for function types + template + class Function { public: Function(); @@ -2917,34 +2922,35 @@ namespace sw Nucleus::setInsertBlock(Nucleus::createBasicBlock()); } - template - Function::Function() + template + Function::Function() { core = new Nucleus(); - if(!A1::isVoid()) arguments.push_back(A1::getType()); - if(!A2::isVoid()) arguments.push_back(A2::getType()); - if(!A3::isVoid()) arguments.push_back(A3::getType()); - if(!A4::isVoid()) arguments.push_back(A4::getType()); + llvm::Type *types[] = {Arguments::getType()...}; + for(llvm::Type *type : types) + { + arguments.push_back(type); + } - function = Nucleus::createFunction(R::getType(), arguments); + function = Nucleus::createFunction(Return::getType(), arguments); Nucleus::setFunction(function); } - template - Function::~Function() + template + Function::~Function() { delete core; } - template - llvm::Argument *Function::arg(int index) + template + llvm::Argument *Function::arg(int index) { return Nucleus::getArgument(function, index); } - template - Routine *Function::operator()(const wchar_t *name, ...) + template + Routine *Function::operator()(const wchar_t *name, ...) { wchar_t fullName[1024 + 1]; diff --git a/src/Renderer/Blitter.cpp b/src/Renderer/Blitter.cpp index df934f345..677b343dd 100644 --- a/src/Renderer/Blitter.cpp +++ b/src/Renderer/Blitter.cpp @@ -964,7 +964,7 @@ namespace sw Routine *Blitter::generate(BlitState &state) { - Function > function; + Function)> function; { Pointer blit(function.arg(0)); diff --git a/src/Renderer/QuadRasterizer.cpp b/src/Renderer/QuadRasterizer.cpp index 40c84e9c4..dfee2f643 100644 --- a/src/Renderer/QuadRasterizer.cpp +++ b/src/Renderer/QuadRasterizer.cpp @@ -47,7 +47,7 @@ namespace sw void QuadRasterizer::generate() { - Function, Int, Int, Pointer > function; + Function, Int, Int, Pointer)> function; { #if PERF_PROFILE Long pixelTime = Ticks(); diff --git a/src/Shader/SetupRoutine.cpp b/src/Shader/SetupRoutine.cpp index 675d8a088..08cdf5903 100644 --- a/src/Shader/SetupRoutine.cpp +++ b/src/Shader/SetupRoutine.cpp @@ -34,7 +34,7 @@ namespace sw void SetupRoutine::generate() { - Function, Pointer, Pointer, Pointer > function; + Function, Pointer, Pointer, Pointer)> function; { Pointer primitive(function.arg(0)); Pointer tri(function.arg(1)); diff --git a/src/Shader/VertexRoutine.cpp b/src/Shader/VertexRoutine.cpp index e6806a1e7..60b193d0c 100644 --- a/src/Shader/VertexRoutine.cpp +++ b/src/Shader/VertexRoutine.cpp @@ -34,7 +34,7 @@ namespace sw void VertexRoutine::generate() { - Function, Pointer, Pointer, Pointer > function; + Function, Pointer, Pointer, Pointer)> function; { Pointer vertex(function.arg(0)); Pointer batch(function.arg(1));