swr/rast: Use metadata to communicate between passes
[mesa.git] / src / gallium / drivers / swr / rasterizer / jitter / builder.h
index 8210e49b18527f422b6f376f9597384f396a6ebd..08a3a6e473424004d7a60589feb8947afb272ee1 100644 (file)
 
 namespace SwrJit
 {
+    ///@todo Move this to better place
+    enum SHADER_STATS_COUNTER_TYPE
+    {
+        STATS_INST_EXECUTED = 0,
+        STATS_SAMPLE_EXECUTED = 1,
+        STATS_SAMPLE_L_EXECUTED = 2,
+        STATS_SAMPLE_B_EXECUTED = 3,
+        STATS_SAMPLE_C_EXECUTED = 4,
+        STATS_SAMPLE_C_LZ_EXECUTED = 5,
+        STATS_SAMPLE_C_D_EXECUTED = 6,
+        STATS_LOD_EXECUTED = 7,
+        STATS_GATHER4_EXECUTED = 8,
+        STATS_GATHER4_C_EXECUTED = 9,
+        STATS_GATHER4_C_PO_EXECUTED = 10,
+        STATS_GATHER4_C_PO_C_EXECUTED = 11,
+        STATS_LOAD_RAW_UAV = 12,
+        STATS_LOAD_RAW_RESOURCE = 13,
+        STATS_STORE_RAW_UAV = 14,
+        STATS_STORE_TGSM = 15,
+        STATS_DISCARD = 16,
+        STATS_BARRIER = 17,
+    };
+
     using namespace llvm;
     struct Builder
     {
         Builder(JitManager *pJitMgr);
-        IRBuilder<>* IRB() { return mpIRBuilder; };
-        JitManager* JM() { return mpJitMgr; }
+        virtual ~Builder() {}
+
+        IRBuilder<> *IRB() { return mpIRBuilder; };
+        JitManager *JM() { return mpJitMgr; }
 
-        JitManagermpJitMgr;
-        IRBuilder<>mpIRBuilder;
+        JitManager *mpJitMgr;
+        IRBuilder<> *mpIRBuilder;
 
-        uint32_t             mVWidth;
+        uint32_t             mVWidth;   // vector width target simd
+        uint32_t             mVWidth16; // vector width simd16
+
+        // Built in types: scalar
 
-        // Built in types.
         Type*                mVoidTy;
         Type*                mInt1Ty;
         Type*                mInt8Ty;
@@ -61,6 +88,11 @@ namespace SwrJit
         Type*                mInt8PtrTy;
         Type*                mInt16PtrTy;
         Type*                mInt32PtrTy;
+
+        Type*                mSimd4FP64Ty;
+
+        // Built in types: target SIMD
+
         Type*                mSimdFP16Ty;
         Type*                mSimdFP32Ty;
         Type*                mSimdInt1Ty;
@@ -70,10 +102,76 @@ namespace SwrJit
         Type*                mSimdIntPtrTy;
         Type*                mSimdVectorTy;
         Type*                mSimdVectorTRTy;
+        Type*                mSimdVectorIntTy;
+
+        // Built in types: simd16
+
+        Type*                mSimd16FP16Ty;
+        Type*                mSimd16FP32Ty;
+        Type*                mSimd16Int1Ty;
+        Type*                mSimd16Int16Ty;
+        Type*                mSimd16Int32Ty;
+        Type*                mSimd16Int64Ty;
+        Type*                mSimd16IntPtrTy;
+        Type*                mSimd16VectorTy;
+        Type*                mSimd16VectorTRTy;
+
+        Type*                mSimd32Int8Ty;
+
+        void SetTargetWidth(uint32_t width);
+        void SetTempAlloca(Value* inst);
+        bool IsTempAlloca(Value* inst);
+        bool SetTexelMaskEvaluate(Instruction* inst);
+        bool IsTexelMaskEvaluate(Instruction* inst);
+        Type* GetVectorType(Type* pType);
+        void SetMetadata(StringRef s, uint32_t val)
+        {
+            llvm::NamedMDNode *metaData = mpJitMgr->mpCurrentModule->getOrInsertNamedMetadata(s);
+            Constant* cval = mpIRBuilder->getInt32(val);
+            llvm::MDNode *mdNode = llvm::MDNode::get(mpJitMgr->mpCurrentModule->getContext(), llvm::ConstantAsMetadata::get(cval));
+            if (metaData->getNumOperands())
+            {
+                metaData->setOperand(0, mdNode);
+            }
+            else
+            {
+                metaData->addOperand(mdNode);
+            }
+        }
+        uint32_t GetMetadata(StringRef s)
+        {
+            NamedMDNode* metaData = mpJitMgr->mpCurrentModule->getNamedMetadata(s);
+            if (metaData)
+            {
+                MDNode* mdNode = metaData->getOperand(0);
+                Metadata* val = mdNode->getOperand(0);
+                return mdconst::dyn_extract<ConstantInt>(val)->getZExtValue();
+            }
+            else
+            {
+                return 0;
+            }
+        }
 
 #include "gen_builder.hpp"
-#include "gen_builder_x86.hpp"
+#include "gen_builder_meta.hpp"
+#include "gen_builder_intrin.hpp"
 #include "builder_misc.h"
 #include "builder_math.h"
+#include "builder_mem.h"
+
+    protected:
+
+        void SetPrivateContext(Value* pPrivateContext) 
+        { 
+            mpPrivateContext = pPrivateContext; 
+            NotifyPrivateContextSet();
+        }
+        virtual void NotifyPrivateContextSet() {}
+        inline Value* GetPrivateContext() { return mpPrivateContext; }
+
+    private: 
+        Value* mpPrivateContext;
+
     };
 }