From d73082b98b884d6ffb72fe81a9b7c7f392aa1391 Mon Sep 17 00:00:00 2001 From: George Kyriazis Date: Mon, 26 Mar 2018 13:29:04 -0500 Subject: [PATCH] swr/rast: Add builder_gfx_mem.{h|cpp} Abstract usage scenarios for memory accesses into builder_gfx_mem. Builder_gfx_mem will convert gfxptr_t from 64-bit int to regular pointer types for use by builder_mem. v2: reworded commit message; renamed enum more appropriately Reviewed-by: Bruce Cherniak --- src/gallium/drivers/swr/Makefile.sources | 2 + src/gallium/drivers/swr/meson.build | 2 + .../swr/rasterizer/jitter/builder_gfx_mem.cpp | 136 ++++++++++++++++++ .../swr/rasterizer/jitter/builder_gfx_mem.h | 67 +++++++++ .../swr/rasterizer/jitter/fetch_jit.cpp | 7 +- 5 files changed, 210 insertions(+), 4 deletions(-) create mode 100644 src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.cpp create mode 100644 src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.h diff --git a/src/gallium/drivers/swr/Makefile.sources b/src/gallium/drivers/swr/Makefile.sources index a7fcba84042..dd815dcb581 100644 --- a/src/gallium/drivers/swr/Makefile.sources +++ b/src/gallium/drivers/swr/Makefile.sources @@ -142,6 +142,8 @@ JITTER_CXX_SOURCES := \ rasterizer/jitter/builder_math.h \ rasterizer/jitter/builder_mem.cpp \ rasterizer/jitter/builder_mem.h \ + rasterizer/jitter/builder_gfx_mem.cpp \ + rasterizer/jitter/builder_gfx_mem.h \ rasterizer/jitter/builder_misc.cpp \ rasterizer/jitter/builder_misc.h \ rasterizer/jitter/fetch_jit.cpp \ diff --git a/src/gallium/drivers/swr/meson.build b/src/gallium/drivers/swr/meson.build index 7703a6c4831..575133def56 100644 --- a/src/gallium/drivers/swr/meson.build +++ b/src/gallium/drivers/swr/meson.build @@ -70,6 +70,8 @@ files_swr_mesa = files( 'rasterizer/jitter/builder_math.h', 'rasterizer/jitter/builder_mem.cpp', 'rasterizer/jitter/builder_mem.h', + 'rasterizer/jitter/builder_gfx_mem.cpp', + 'rasterizer/jitter/builder_gfx_mem.h', 'rasterizer/jitter/builder_misc.cpp', 'rasterizer/jitter/builder_misc.h', 'rasterizer/jitter/fetch_jit.cpp', diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.cpp b/src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.cpp new file mode 100644 index 00000000000..e097bd1f6f7 --- /dev/null +++ b/src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.cpp @@ -0,0 +1,136 @@ +/**************************************************************************** +* Copyright (C) 2014-2018 Intel Corporation. All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice (including the next +* paragraph) shall be included in all copies or substantial portions of the +* Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +* IN THE SOFTWARE. +* +* @file builder_gfx_mem.cpp +* +* @brief Definition of the gfx mem builder +* +* Notes: +* +******************************************************************************/ +#include "jit_pch.hpp" +#include "builder.h" +#include "common/rdtsc_buckets.h" +#include "builder_gfx_mem.h" + + +namespace SwrJit +{ + using namespace llvm; + + BuilderGfxMem::BuilderGfxMem(JitManager* pJitMgr) : + Builder(pJitMgr) + { + mpfnTranslateGfxAddress = nullptr; + mpParamSimDC = nullptr; + } + + void BuilderGfxMem::NotifyPrivateContextSet() + { + } + + void BuilderGfxMem::AssertGFXMemoryParams(Value* ptr, Builder::JIT_MEM_CLIENT usage) + { + SWR_ASSERT(ptr->getType() == mInt64Ty, "GFX addresses must be gfxptr_t and not converted to system pointers."); + SWR_ASSERT(usage != MEM_CLIENT_INTERNAL, "Internal memory should not go through the translation path and should not be gfxptr_t."); + } + + ////////////////////////////////////////////////////////////////////////// + /// @brief Generate a masked gather operation in LLVM IR. If not + /// supported on the underlying platform, emulate it with loads + /// @param vSrc - SIMD wide value that will be loaded if mask is invalid + /// @param pBase - Int8* base VB address pointer value + /// @param vIndices - SIMD wide value of VB byte offsets + /// @param vMask - SIMD wide mask that controls whether to access memory or the src values + /// @param scale - value to scale indices by + Value *BuilderGfxMem::GATHERPS(Value *vSrc, Value *pBase, Value *vIndices, Value *vMask, uint8_t scale, JIT_MEM_CLIENT usage) + { + Value *vGather; + + // address may be coming in as 64bit int now so get the pointer + if (pBase->getType() == mInt64Ty) + { + pBase = INT_TO_PTR(pBase, PointerType::get(mInt8Ty, 0)); + } + + vGather = Builder::GATHERPS(vSrc, pBase, vIndices, vMask, scale); + return vGather; + } + + ////////////////////////////////////////////////////////////////////////// + /// @brief Generate a masked gather operation in LLVM IR. If not + /// supported on the underlying platform, emulate it with loads + /// @param vSrc - SIMD wide value that will be loaded if mask is invalid + /// @param pBase - Int8* base VB address pointer value + /// @param vIndices - SIMD wide value of VB byte offsets + /// @param vMask - SIMD wide mask that controls whether to access memory or the src values + /// @param scale - value to scale indices by + Value *BuilderGfxMem::GATHERDD(Value* vSrc, Value* pBase, Value* vIndices, Value* vMask, uint8_t scale, JIT_MEM_CLIENT usage) + { + Value* vGather = VIMMED1(0.0f); + + + // address may be coming in as 64bit int now so get the pointer + if (pBase->getType() == mInt64Ty) + { + pBase = INT_TO_PTR(pBase, PointerType::get(mInt8Ty, 0)); + } + + vGather = Builder::GATHERDD(vSrc, pBase, vIndices, vMask, scale); + return vGather; + } + + + Value* BuilderGfxMem::OFFSET_TO_NEXT_COMPONENT(Value* base, Constant *offset) + { + return ADD(base, offset); + } + + LoadInst* BuilderGfxMem::LOAD(Value *Ptr, const char *Name, JIT_MEM_CLIENT usage) + { + // the 64 bit gfx pointers are not yet propagated up the stack + // so there is some casting in here and the test for type is not yet enabled + + return Builder::LOAD(Ptr, Name); + } + + LoadInst* BuilderGfxMem::LOAD(Value *Ptr, const Twine &Name, JIT_MEM_CLIENT usage) + { + return Builder::LOAD(Ptr, Name); + } + + LoadInst* BuilderGfxMem::LOAD(Type *Ty, Value *Ptr, const Twine &Name, JIT_MEM_CLIENT usage) + { + return Builder::LOAD(Ty, Ptr, Name); + } + + LoadInst* BuilderGfxMem::LOAD(Value *Ptr, bool isVolatile, const Twine &Name, JIT_MEM_CLIENT usage) + { + return Builder::LOAD(Ptr, isVolatile, Name); + } + + LoadInst *BuilderGfxMem::LOAD(Value *BasePtr, const std::initializer_list &offset, const llvm::Twine& name, JIT_MEM_CLIENT usage) + { + return Builder::LOAD(BasePtr, offset, 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 new file mode 100644 index 00000000000..837de444306 --- /dev/null +++ b/src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.h @@ -0,0 +1,67 @@ +/**************************************************************************** +* Copyright (C) 2014-2018 Intel Corporation. All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice (including the next +* paragraph) shall be included in all copies or substantial portions of the +* Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +* IN THE SOFTWARE. +* +* @file builder_gfx_mem.h +* +* @brief Definition of the builder to support different translation types for gfx memory access +* +* Notes: +* +******************************************************************************/ +#pragma once + +#include "builder.h" + +namespace SwrJit +{ + using namespace llvm; + + class BuilderGfxMem : public Builder + { + public: + BuilderGfxMem(JitManager* pJitMgr); + virtual ~BuilderGfxMem() {} + + virtual LoadInst* LOAD(Value *Ptr, const char *Name, JIT_MEM_CLIENT usage = MEM_CLIENT_INTERNAL); + virtual LoadInst* LOAD(Value *Ptr, const Twine &Name = "", 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 = "", JIT_MEM_CLIENT usage = MEM_CLIENT_INTERNAL); + virtual LoadInst* LOAD(Value *BasePtr, const std::initializer_list &offset, const llvm::Twine& Name = "", JIT_MEM_CLIENT usage = MEM_CLIENT_INTERNAL); + + virtual Value *GATHERPS(Value *src, Value *pBase, Value *indices, Value *mask, uint8_t scale = 1, JIT_MEM_CLIENT usage = MEM_CLIENT_INTERNAL); + + virtual Value *GATHERDD(Value* src, Value* pBase, Value* indices, Value* mask, uint8_t scale = 1, JIT_MEM_CLIENT usage = MEM_CLIENT_INTERNAL); + + protected: + + void AssertGFXMemoryParams(Value* ptr, Builder::JIT_MEM_CLIENT usage); + + virtual void NotifyPrivateContextSet(); + + virtual Value* OFFSET_TO_NEXT_COMPONENT(Value* base, Constant *offset); + + private: + + Value* mpfnTranslateGfxAddress; + Value* mpParamSimDC; + }; +} diff --git a/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp b/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp index da6d982d0e3..92c308ebfdd 100644 --- a/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp +++ b/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp @@ -28,7 +28,7 @@ * ******************************************************************************/ #include "jit_pch.hpp" -#include "builder.h" +#include "builder_gfx_mem.h" #include "jit_api.h" #include "fetch_jit.h" #include "gen_state_llvm.h" @@ -56,11 +56,10 @@ enum ConversionType ////////////////////////////////////////////////////////////////////////// /// Interface to Jitting a fetch shader ////////////////////////////////////////////////////////////////////////// -struct FetchJit : - public Builder +struct FetchJit : public BuilderGfxMem { FetchJit(JitManager* pJitMgr) : - Builder(pJitMgr) + BuilderGfxMem(pJitMgr) {} Function* Create(const FETCH_COMPILE_STATE& fetchState); -- 2.30.2