From: George Kyriazis Date: Wed, 18 Apr 2018 20:17:04 +0000 (-0500) Subject: swr/rast: WIP Translation handling X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3f008c5505178c9e980b37f58164832077b0da20;p=mesa.git swr/rast: WIP Translation handling Reviewed-by: Bruce Cherniak --- diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.cpp b/src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.cpp index 6ecd96978dd..9b707162b3f 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.cpp +++ b/src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.cpp @@ -160,14 +160,6 @@ namespace SwrJit return Builder::LOAD(Ptr, Name); } - LoadInst* BuilderGfxMem::LOAD(Type *Ty, Value *Ptr, const Twine &Name, JIT_MEM_CLIENT usage) - { - AssertGFXMemoryParams(Ptr, usage); - - Ptr = TranslationHelper(Ptr, Ty); - return Builder::LOAD(Ty, Ptr, Name); - } - LoadInst* BuilderGfxMem::LOAD(Value *Ptr, bool isVolatile, const Twine &Name, Type *Ty, JIT_MEM_CLIENT usage) { AssertGFXMemoryParams(Ptr, usage); @@ -180,12 +172,25 @@ namespace SwrJit { AssertGFXMemoryParams(BasePtr, usage); - // This call is just a pass through to the base class. - // It needs to be here to compile due to the combination of virtual overrides and signature overloads. - // It doesn't do anything meaningful because the implementation in the base class is going to call - // another version of LOAD inside itself where the actual per offset translation will take place - // and we can't just translate the BasePtr once, each address needs individual translation. - return Builder::LOAD(BasePtr, offset, name, Ty, usage); + bool bNeedTranslation = false; + if (BasePtr->getType() == mInt64Ty) + { + SWR_ASSERT(Ty); + BasePtr = INT_TO_PTR(BasePtr, Ty, name); + bNeedTranslation = true; + } + std::vector valIndices; + for (auto i : offset) + { + valIndices.push_back(C(i)); + } + BasePtr = Builder::GEPA(BasePtr, valIndices, name); + if (bNeedTranslation) + { + BasePtr = PTR_TO_INT(BasePtr, mInt64Ty, name); + } + + return LOAD(BasePtr, name, Ty, usage); } CallInst* BuilderGfxMem::MASKED_LOAD(Value *Ptr, unsigned Align, Value *Mask, Value *PassThru, const Twine &Name, Type *Ty, JIT_MEM_CLIENT usage) @@ -196,8 +201,12 @@ namespace SwrJit return Builder::MASKED_LOAD(Ptr, Align, Mask, PassThru, Name, Ty, usage); } - Value* BuilderGfxMem::TranslateGfxAddress(Value* xpGfxAddress) + Value* BuilderGfxMem::TranslateGfxAddress(Value* xpGfxAddress, Type* PtrTy, const Twine &Name) { - return INT_TO_PTR(xpGfxAddress, PointerType::get(mInt8Ty, 0)); + if (PtrTy == nullptr) + { + PtrTy = mInt8PtrTy; + } + return INT_TO_PTR(xpGfxAddress, PtrTy, Name); } } diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.h b/src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.h index f8ec0acdec3..effbe05da13 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.h +++ b/src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.h @@ -48,7 +48,6 @@ namespace SwrJit virtual LoadInst* LOAD(Value *Ptr, const char *Name, Type *Ty = nullptr, JIT_MEM_CLIENT usage = MEM_CLIENT_INTERNAL); virtual LoadInst* LOAD(Value *Ptr, const Twine &Name = "", Type *Ty = nullptr, JIT_MEM_CLIENT usage = MEM_CLIENT_INTERNAL); - virtual LoadInst* LOAD(Type *Ty, Value *Ptr, const Twine &Name = "", JIT_MEM_CLIENT usage = MEM_CLIENT_INTERNAL); virtual LoadInst* LOAD(Value *Ptr, bool isVolatile, const Twine &Name = "", Type *Ty = nullptr, JIT_MEM_CLIENT usage = MEM_CLIENT_INTERNAL); virtual LoadInst* LOAD(Value *BasePtr, const std::initializer_list &offset, const llvm::Twine& Name = "", Type *Ty = nullptr, JIT_MEM_CLIENT usage = MEM_CLIENT_INTERNAL); @@ -58,7 +57,7 @@ namespace SwrJit virtual Value *GATHERDD(Value* src, Value* pBase, Value* indices, Value* mask, uint8_t scale = 1, JIT_MEM_CLIENT usage = MEM_CLIENT_INTERNAL); - Value* TranslateGfxAddress(Value* xpGfxAddress); + Value* TranslateGfxAddress(Value* xpGfxAddress, Type* PtrTy = nullptr, const Twine &Name = ""); protected: