swr: [rasterizer jitter] fix logic op to work with unorm/snorm
[mesa.git] / src / gallium / drivers / swr / rasterizer / jitter / fetch_jit.h
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 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
61 enum 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
81 enum 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 //////////////////////////////////////////////////////////////////////////
95 struct 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 };