1/****************************************************************************
2* Copyright (C) 2014-2015 Intel Corporation.   All Rights Reserved.
3*
4* Permission is hereby granted, free of charge, to any person obtaining a
5* copy of this software and associated documentation files (the "Software"),
6* to deal in the Software without restriction, including without limitation
7* the rights to use, copy, modify, merge, publish, distribute, sublicense,
8* and/or sell copies of the Software, and to permit persons to whom the
9* Software is furnished to do so, subject to the following conditions:
10*
11* The above copyright notice and this permission notice (including the next
12* paragraph) shall be included in all copies or substantial portions of the
13* Software.
14*
15* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21* IN THE SOFTWARE.
22*
23* @file fetch_jit.h
24*
25* @brief Definition of the fetch jitter
26*
27* Notes:
28*
29******************************************************************************/
30#pragma once
31
32#include "common/formats.h"
33#include "core/state.h"
34
35//////////////////////////////////////////////////////////////////////////
36/// INPUT_ELEMENT_DESC
37//////////////////////////////////////////////////////////////////////////
38struct INPUT_ELEMENT_DESC
39{
40    union
41    {
42        struct
43        {
44            uint32_t            AlignedByteOffset : 12;
45            uint32_t            Format : 10;
46            uint32_t            StreamIndex : 6;
47            uint32_t            InstanceEnable : 1;
48            uint32_t            ComponentControl0 : 3;
49            uint32_t            ComponentControl1 : 3;
50            uint32_t            ComponentControl2 : 3;
51            uint32_t            ComponentControl3 : 3;
52            uint32_t            ComponentPacking : 4;
53            uint32_t            _reserved : 19;
54        };
55        uint64_t bits;
56    };
57    uint32_t InstanceDataStepRate;
58};
59
60// used to set ComponentPacking
61enum ComponentEnable
62{
63    NONE = 0x0,
64    X    = 0x1,
65    Y    = 0x2,
66    XY   = 0x3,
67    Z    = 0x4,
68    XZ   = 0x5,
69    YZ   = 0x6,
70    XYZ  = 0x7,
71    W    = 0x8,
72    XW   = 0x9,
73    YW   = 0xA,
74    XYW  = 0xB,
75    ZW   = 0xC,
76    XZW  = 0xD,
77    YZW  = 0xE,
78    XYZW = 0xF,
79};
80
81enum ComponentControl
82{
83    NoStore         = 0,
84    StoreSrc        = 1,
85    Store0          = 2,
86    Store1Fp        = 3,
87    Store1Int       = 4,
88    StoreVertexId   = 5,
89    StoreInstanceId = 6
90};
91
92//////////////////////////////////////////////////////////////////////////
93/// State required for fetch shader jit compile.
94//////////////////////////////////////////////////////////////////////////
95struct FETCH_COMPILE_STATE
96{
97    uint32_t numAttribs;
98    INPUT_ELEMENT_DESC layout[KNOB_NUM_ATTRIBUTES];
99    SWR_FORMAT indexType;
100    uint32_t cutIndex{ 0xffffffff };
101
102    // Options that effect the JIT'd code
103    bool bDisableVGATHER;                   // If enabled, FetchJit will generate loads/shuffles instead of VGATHERs
104    bool bDisableIndexOOBCheck;             // If enabled, FetchJit will exclude index OOB check
105    bool bEnableCutIndex{ false };          // Compares indices with the cut index and returns a cut mask
106    bool bVertexIDOffsetEnable{ false };    // Offset vertexID by StartVertex for non-indexed draws or BaseVertex for indexed draws
107
108    FETCH_COMPILE_STATE(bool disableVGATHER = false, bool diableIndexOOBCheck = false):
109        bDisableVGATHER(disableVGATHER), bDisableIndexOOBCheck(diableIndexOOBCheck){ };
110
111    bool operator==(const FETCH_COMPILE_STATE &other) const
112    {
113        if (numAttribs != other.numAttribs) return false;
114        if (indexType != other.indexType) return false;
115        if (bDisableVGATHER != other.bDisableVGATHER) return false;
116        if (bDisableIndexOOBCheck != other.bDisableIndexOOBCheck) return false;
117        if (bEnableCutIndex != other.bEnableCutIndex) return false;
118        if (cutIndex != other.cutIndex) return false;
119        if (bVertexIDOffsetEnable != other.bVertexIDOffsetEnable) return false;
120
121        for(uint32_t i = 0; i < numAttribs; ++i)
122        {
123            if((layout[i].bits != other.layout[i].bits) ||
124               ((layout[i].InstanceEnable == 1) &&
125                (layout[i].InstanceDataStepRate != other.layout[i].InstanceDataStepRate))){
126                return false;
127            }
128        }
129
130        return true;
131    }
132};
133