• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 //////////////////////////////////////////////////////////////////////////
38 struct 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            InstanceStrideEnable : 1;
49             uint32_t            ComponentControl0 : 4;
50             uint32_t            ComponentControl1 : 4;
51             uint32_t            ComponentControl2 : 4;
52             uint32_t            ComponentControl3 : 4;
53             uint32_t            ComponentPacking : 4;
54             uint32_t            _reserved : 14;
55         };
56         uint64_t bits;
57     };
58     uint32_t InstanceAdvancementState;
59 };
60 
61 // used to set ComponentPacking
62 enum ComponentEnable
63 {
64     NONE = 0x0,
65     X    = 0x1,
66     Y    = 0x2,
67     XY   = 0x3,
68     Z    = 0x4,
69     XZ   = 0x5,
70     YZ   = 0x6,
71     XYZ  = 0x7,
72     W    = 0x8,
73     XW   = 0x9,
74     YW   = 0xA,
75     XYW  = 0xB,
76     ZW   = 0xC,
77     XZW  = 0xD,
78     YZW  = 0xE,
79     XYZW = 0xF,
80 };
81 
82 enum ComponentControl
83 {
84     NoStore         = 0,
85     StoreSrc        = 1,
86     Store0          = 2,
87     Store1Fp        = 3,
88     Store1Int       = 4,
89     StoreVertexId   = 5,
90     StoreInstanceId = 6,
91 };
92 
93 //////////////////////////////////////////////////////////////////////////
94 /// State required for fetch shader jit compile.
95 //////////////////////////////////////////////////////////////////////////
96 struct FETCH_COMPILE_STATE
97 {
98     uint32_t numAttribs{ 0 };
99     INPUT_ELEMENT_DESC layout[SWR_VTX_NUM_SLOTS];
100     SWR_FORMAT indexType;
101     uint32_t cutIndex{ 0xffffffff };
102 
103     // Options that effect the JIT'd code
104     bool bDisableVGATHER;                   // If enabled, FetchJit will generate loads/shuffles instead of VGATHERs
105     bool bDisableIndexOOBCheck;             // If enabled, FetchJit will exclude index OOB check
106     bool bEnableCutIndex{ false };          // Compares indices with the cut index and returns a cut mask
107     bool bVertexIDOffsetEnable{ false };    // Offset vertexID by StartVertex for non-indexed draws or BaseVertex for indexed draws
108     bool bPartialVertexBuffer{ false };     // for indexed draws, map illegal indices to a known resident vertex
109 
110     bool bForceSequentialAccessEnable{ false };
111     bool bInstanceIDOffsetEnable{ false };
112 
113     FETCH_COMPILE_STATE(bool disableVGATHER = false, bool diableIndexOOBCheck = false):
bDisableVGATHERFETCH_COMPILE_STATE114         bDisableVGATHER(disableVGATHER), bDisableIndexOOBCheck(diableIndexOOBCheck){ };
115 
116     bool operator==(const FETCH_COMPILE_STATE &other) const
117     {
118         if (numAttribs != other.numAttribs) return false;
119         if (indexType != other.indexType) return false;
120         if (bDisableVGATHER != other.bDisableVGATHER) return false;
121         if (bDisableIndexOOBCheck != other.bDisableIndexOOBCheck) return false;
122         if (bEnableCutIndex != other.bEnableCutIndex) return false;
123         if (cutIndex != other.cutIndex) return false;
124         if (bVertexIDOffsetEnable != other.bVertexIDOffsetEnable) return false;
125         if (bPartialVertexBuffer != other.bPartialVertexBuffer) return false;
126         if (bForceSequentialAccessEnable != other.bForceSequentialAccessEnable) return false;
127         if (bInstanceIDOffsetEnable != other.bInstanceIDOffsetEnable) return false;
128 
129         for (uint32_t i = 0; i < numAttribs; ++i)
130         {
131             if ((layout[i].bits != other.layout[i].bits) ||
132                (((layout[i].InstanceEnable == 1) || (layout[i].InstanceStrideEnable == 1)) &&
133                 (layout[i].InstanceAdvancementState != other.layout[i].InstanceAdvancementState))){
134                 return false;
135             }
136         }
137 
138         return true;
139     }
140 };
141