fixed ISPCSync functionality
This commit is contained in:
@@ -102,7 +102,8 @@ define i32 @__lanemask_lt() nounwind readnone alwaysinline
|
|||||||
|
|
||||||
define i8* @ISPCAlloc(i8**, i64, i32) nounwind alwaysinline
|
define i8* @ISPCAlloc(i8**, i64, i32) nounwind alwaysinline
|
||||||
{
|
{
|
||||||
ret i8* null
|
%ptr = inttoptr i64 1 to i8*
|
||||||
|
ret i8* %ptr
|
||||||
}
|
}
|
||||||
|
|
||||||
;; this call allocate parameter buffer for kernel launch
|
;; this call allocate parameter buffer for kernel launch
|
||||||
|
|||||||
48
ctx.cpp
48
ctx.cpp
@@ -3673,29 +3673,43 @@ FunctionEmitContext::LaunchInst(llvm::Value *callee,
|
|||||||
|
|
||||||
void
|
void
|
||||||
FunctionEmitContext::SyncInst() {
|
FunctionEmitContext::SyncInst() {
|
||||||
llvm::Value *launchGroupHandle = LoadInst(launchGroupHandlePtr);
|
if (!g->target->isPTX())
|
||||||
llvm::Value *nullPtrValue =
|
{
|
||||||
|
llvm::Value *launchGroupHandle = LoadInst(launchGroupHandlePtr);
|
||||||
|
llvm::Value *nullPtrValue =
|
||||||
llvm::Constant::getNullValue(LLVMTypes::VoidPointerType);
|
llvm::Constant::getNullValue(LLVMTypes::VoidPointerType);
|
||||||
llvm::Value *nonNull = CmpInst(llvm::Instruction::ICmp,
|
llvm::Value *nonNull = CmpInst(llvm::Instruction::ICmp,
|
||||||
llvm::CmpInst::ICMP_NE,
|
llvm::CmpInst::ICMP_NE,
|
||||||
launchGroupHandle, nullPtrValue);
|
launchGroupHandle, nullPtrValue);
|
||||||
llvm::BasicBlock *bSync = CreateBasicBlock("call_sync");
|
llvm::BasicBlock *bSync = CreateBasicBlock("call_sync");
|
||||||
llvm::BasicBlock *bPostSync = CreateBasicBlock("post_sync");
|
llvm::BasicBlock *bPostSync = CreateBasicBlock("post_sync");
|
||||||
BranchInst(bSync, bPostSync, nonNull);
|
BranchInst(bSync, bPostSync, nonNull);
|
||||||
|
|
||||||
SetCurrentBasicBlock(bSync);
|
SetCurrentBasicBlock(bSync);
|
||||||
llvm::Function *fsync = m->module->getFunction("ISPCSync");
|
llvm::Function *fsync = m->module->getFunction("ISPCSync");
|
||||||
if (fsync == NULL)
|
if (fsync == NULL)
|
||||||
FATAL("Couldn't find ISPCSync declaration?!");
|
FATAL("Couldn't find ISPCSync declaration?!");
|
||||||
CallInst(fsync, NULL, launchGroupHandle, "");
|
CallInst(fsync, NULL, launchGroupHandle, "");
|
||||||
|
|
||||||
// zero out the handle so that if ISPCLaunch is called again in this
|
// zero out the handle so that if ISPCLaunch is called again in this
|
||||||
// function, it knows it's starting out from scratch
|
// function, it knows it's starting out from scratch
|
||||||
StoreInst(nullPtrValue, launchGroupHandlePtr);
|
StoreInst(nullPtrValue, launchGroupHandlePtr);
|
||||||
|
|
||||||
BranchInst(bPostSync);
|
BranchInst(bPostSync);
|
||||||
|
|
||||||
SetCurrentBasicBlock(bPostSync);
|
SetCurrentBasicBlock(bPostSync);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
llvm::Value *launchGroupHandle = LoadInst(launchGroupHandlePtr);
|
||||||
|
llvm::Value *nullPtrValue =
|
||||||
|
llvm::Constant::getNullValue(LLVMTypes::VoidPointerType);
|
||||||
|
llvm::Function *fsync = m->module->getFunction("ISPCSync");
|
||||||
|
if (fsync == NULL)
|
||||||
|
FATAL("Couldn't find ISPCSync declaration?!");
|
||||||
|
CallInst(fsync, NULL, launchGroupHandle, "");
|
||||||
|
StoreInst(nullPtrValue, launchGroupHandlePtr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -313,5 +313,4 @@ export void ao_ispc_tasks(uniform int w, uniform int h, uniform int nsubsamples,
|
|||||||
const uniform int ntilex = (w+TILEX-1)/TILEX;
|
const uniform int ntilex = (w+TILEX-1)/TILEX;
|
||||||
const uniform int ntiley = (h+TILEY-1)/TILEY;
|
const uniform int ntiley = (h+TILEY-1)/TILEY;
|
||||||
launch[ntilex,ntiley] ao_task(w, h, nsubsamples, image);
|
launch[ntilex,ntiley] ao_task(w, h, nsubsamples, image);
|
||||||
sync;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user