Because kernel will write 64bits address when reloc, so when reloc argument in the curbe bo, the pointer need 8 byte curbe.
Signed-off-by: Yang Rong <[email protected]> --- backend/src/backend/gen8_context.hpp | 2 ++ backend/src/backend/gen_context.cpp | 9 +++++---- backend/src/backend/gen_context.hpp | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/backend/src/backend/gen8_context.hpp b/backend/src/backend/gen8_context.hpp index 3269eeb..684a366 100644 --- a/backend/src/backend/gen8_context.hpp +++ b/backend/src/backend/gen8_context.hpp @@ -47,6 +47,8 @@ namespace gbe //Because the allocate is use uint16_t, so clamp it, need refine return std::min(GEN8_SCRATCH_SIZE, 0x7fff); } + /*! Get the pointer argument size for curbe alloc */ + virtual uint32_t getPointerSize(void) { return 8; } protected: virtual GenEncoder* generateEncoder(void) { diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp index 1d0cf10..81758eb 100644 --- a/backend/src/backend/gen_context.cpp +++ b/backend/src/backend/gen_context.cpp @@ -1794,7 +1794,7 @@ namespace gbe } void GenContext::buildPatchList(void) { - const uint32_t ptrSize = unit.getPointerSize() == ir::POINTER_32_BITS ? 4u : 8u; + const uint32_t ptrSize = this->getPointerSize(); kernel->curbeSize = 0u; auto &stackUse = dag->getUse(ir::ocl::stackptr); @@ -1816,12 +1816,13 @@ namespace gbe // For pointers and values, we have nothing to do. We just push the values if (arg.type == ir::FunctionArgument::GLOBAL_POINTER || arg.type == ir::FunctionArgument::LOCAL_POINTER || - arg.type == ir::FunctionArgument::CONSTANT_POINTER || - arg.type == ir::FunctionArgument::VALUE || + arg.type == ir::FunctionArgument::CONSTANT_POINTER) + this->insertCurbeReg(arg.reg, this->newCurbeEntry(GBE_CURBE_KERNEL_ARGUMENT, argID, ptrSize, ptrSize)); + if (arg.type == ir::FunctionArgument::VALUE || arg.type == ir::FunctionArgument::STRUCTURE || arg.type == ir::FunctionArgument::IMAGE || arg.type == ir::FunctionArgument::SAMPLER) - this->insertCurbeReg(arg.reg, this->newCurbeEntry(GBE_CURBE_KERNEL_ARGUMENT, argID, arg.size, ptrSize)); + this->insertCurbeReg(arg.reg, this->newCurbeEntry(GBE_CURBE_KERNEL_ARGUMENT, argID, arg.size, arg.size)); } // Go over all the instructions and find the special register we need diff --git a/backend/src/backend/gen_context.hpp b/backend/src/backend/gen_context.hpp index 0e0e728..0be225a 100644 --- a/backend/src/backend/gen_context.hpp +++ b/backend/src/backend/gen_context.hpp @@ -76,6 +76,8 @@ namespace gbe virtual uint32_t alignScratchSize(uint32_t size); /*! Get the device's max srcatch size */ virtual uint32_t getScratchSize(void) { return GEN7_SCRATCH_SIZE; } + /*! Get the pointer argument size for curbe alloc */ + virtual uint32_t getPointerSize(void) { return 4; } /*! Function we emit code for */ INLINE const ir::Function &getFunction(void) const { return fn; } /*! Simd width chosen for the current function */ -- 1.8.3.2 _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
