mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 00:38:48 +02:00
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 <bruce.cherniak@intel.com>
This commit is contained in:
parent
1eb72673fc
commit
d73082b98b
5 changed files with 210 additions and 4 deletions
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
136
src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.cpp
Normal file
136
src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.cpp
Normal file
|
|
@ -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<uint32_t> &offset, const llvm::Twine& name, JIT_MEM_CLIENT usage)
|
||||
{
|
||||
return Builder::LOAD(BasePtr, offset, name);
|
||||
}
|
||||
|
||||
}
|
||||
67
src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.h
Normal file
67
src/gallium/drivers/swr/rasterizer/jitter/builder_gfx_mem.h
Normal file
|
|
@ -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<uint32_t> &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;
|
||||
};
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue