xref: /aosp_15_r20/external/mesa3d/src/nouveau/nil/tic.rs (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker // Copyright © 2024 Collabora, Ltd.
2*61046927SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
3*61046927SAndroid Build Coastguard Worker 
4*61046927SAndroid Build Coastguard Worker #![allow(unused_macros)]
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker extern crate bitview;
7*61046927SAndroid Build Coastguard Worker extern crate nvidia_headers;
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker use bitview::*;
10*61046927SAndroid Build Coastguard Worker use nil_rs_bindings::*;
11*61046927SAndroid Build Coastguard Worker use nvidia_headers::classes::cl9097::tex as cl9097;
12*61046927SAndroid Build Coastguard Worker use nvidia_headers::classes::cl9097::FERMI_A;
13*61046927SAndroid Build Coastguard Worker use nvidia_headers::classes::clb097::tex as clb097;
14*61046927SAndroid Build Coastguard Worker use nvidia_headers::classes::clb097::MAXWELL_A;
15*61046927SAndroid Build Coastguard Worker use nvidia_headers::classes::clc097::tex as clc097;
16*61046927SAndroid Build Coastguard Worker use nvidia_headers::classes::clc097::PASCAL_A;
17*61046927SAndroid Build Coastguard Worker use nvidia_headers::classes::clc397::VOLTA_A;
18*61046927SAndroid Build Coastguard Worker use paste::paste;
19*61046927SAndroid Build Coastguard Worker use std::ops::Range;
20*61046927SAndroid Build Coastguard Worker 
21*61046927SAndroid Build Coastguard Worker use crate::extent::{units, Extent4D};
22*61046927SAndroid Build Coastguard Worker use crate::format::Format;
23*61046927SAndroid Build Coastguard Worker use crate::image::Image;
24*61046927SAndroid Build Coastguard Worker use crate::image::ImageDim;
25*61046927SAndroid Build Coastguard Worker use crate::image::SampleLayout;
26*61046927SAndroid Build Coastguard Worker use crate::image::View;
27*61046927SAndroid Build Coastguard Worker use crate::image::ViewType;
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker macro_rules! set_enum {
30*61046927SAndroid Build Coastguard Worker     ($th:expr, $cls:ident, $field:ident, $enum:ident) => {
31*61046927SAndroid Build Coastguard Worker         paste! {
32*61046927SAndroid Build Coastguard Worker             $th.set_field($cls::$field, $cls::[<$field _ $enum>])
33*61046927SAndroid Build Coastguard Worker         }
34*61046927SAndroid Build Coastguard Worker     };
35*61046927SAndroid Build Coastguard Worker }
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker trait SetUFixed {
set_ufixed(&mut self, range: Range<usize>, val: f32)38*61046927SAndroid Build Coastguard Worker     fn set_ufixed(&mut self, range: Range<usize>, val: f32);
39*61046927SAndroid Build Coastguard Worker }
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker const FIXED_FRAC_BITS: u32 = 8;
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker impl<T: SetFieldU64> SetUFixed for T {
set_ufixed(&mut self, range: Range<usize>, val: f32)44*61046927SAndroid Build Coastguard Worker     fn set_ufixed(&mut self, range: Range<usize>, val: f32) {
45*61046927SAndroid Build Coastguard Worker         assert!(range.len() >= FIXED_FRAC_BITS as usize);
46*61046927SAndroid Build Coastguard Worker         let scaled = val * ((1 << FIXED_FRAC_BITS) as f32);
47*61046927SAndroid Build Coastguard Worker         let scaled_max = ((1 << range.len()) - 1) as f32;
48*61046927SAndroid Build Coastguard Worker         let u_val = scaled.clamp(0.0, scaled_max).round() as u32;
49*61046927SAndroid Build Coastguard Worker         self.set_field(range, u_val);
50*61046927SAndroid Build Coastguard Worker     }
51*61046927SAndroid Build Coastguard Worker }
52*61046927SAndroid Build Coastguard Worker 
nv9097_th_v2_source( fmt: &nil_tic_format, swizzle: pipe_swizzle, is_int: bool, ) -> u3253*61046927SAndroid Build Coastguard Worker fn nv9097_th_v2_source(
54*61046927SAndroid Build Coastguard Worker     fmt: &nil_tic_format,
55*61046927SAndroid Build Coastguard Worker     swizzle: pipe_swizzle,
56*61046927SAndroid Build Coastguard Worker     is_int: bool,
57*61046927SAndroid Build Coastguard Worker ) -> u32 {
58*61046927SAndroid Build Coastguard Worker     match swizzle {
59*61046927SAndroid Build Coastguard Worker         PIPE_SWIZZLE_X => fmt.src_x(),
60*61046927SAndroid Build Coastguard Worker         PIPE_SWIZZLE_Y => fmt.src_y(),
61*61046927SAndroid Build Coastguard Worker         PIPE_SWIZZLE_Z => fmt.src_z(),
62*61046927SAndroid Build Coastguard Worker         PIPE_SWIZZLE_W => fmt.src_w(),
63*61046927SAndroid Build Coastguard Worker         PIPE_SWIZZLE_0 => cl9097::TEXHEADV2_X_SOURCE_IN_ZERO,
64*61046927SAndroid Build Coastguard Worker         PIPE_SWIZZLE_1 => {
65*61046927SAndroid Build Coastguard Worker             if is_int {
66*61046927SAndroid Build Coastguard Worker                 cl9097::TEXHEADV2_X_SOURCE_IN_ONE_INT
67*61046927SAndroid Build Coastguard Worker             } else {
68*61046927SAndroid Build Coastguard Worker                 cl9097::TEXHEADV2_X_SOURCE_IN_ONE_FLOAT
69*61046927SAndroid Build Coastguard Worker             }
70*61046927SAndroid Build Coastguard Worker         }
71*61046927SAndroid Build Coastguard Worker         other => panic!("Invalid component swizzle {}", other),
72*61046927SAndroid Build Coastguard Worker     }
73*61046927SAndroid Build Coastguard Worker }
74*61046927SAndroid Build Coastguard Worker 
nvb097_th_bl_source( fmt: &nil_tic_format, swizzle: pipe_swizzle, is_int: bool, ) -> u3275*61046927SAndroid Build Coastguard Worker fn nvb097_th_bl_source(
76*61046927SAndroid Build Coastguard Worker     fmt: &nil_tic_format,
77*61046927SAndroid Build Coastguard Worker     swizzle: pipe_swizzle,
78*61046927SAndroid Build Coastguard Worker     is_int: bool,
79*61046927SAndroid Build Coastguard Worker ) -> u32 {
80*61046927SAndroid Build Coastguard Worker     match swizzle {
81*61046927SAndroid Build Coastguard Worker         PIPE_SWIZZLE_X => fmt.src_x(),
82*61046927SAndroid Build Coastguard Worker         PIPE_SWIZZLE_Y => fmt.src_y(),
83*61046927SAndroid Build Coastguard Worker         PIPE_SWIZZLE_Z => fmt.src_z(),
84*61046927SAndroid Build Coastguard Worker         PIPE_SWIZZLE_W => fmt.src_w(),
85*61046927SAndroid Build Coastguard Worker         PIPE_SWIZZLE_0 => clb097::TEXHEADV2_X_SOURCE_IN_ZERO,
86*61046927SAndroid Build Coastguard Worker         PIPE_SWIZZLE_1 => {
87*61046927SAndroid Build Coastguard Worker             if is_int {
88*61046927SAndroid Build Coastguard Worker                 clb097::TEXHEADV2_X_SOURCE_IN_ONE_INT
89*61046927SAndroid Build Coastguard Worker             } else {
90*61046927SAndroid Build Coastguard Worker                 clb097::TEXHEADV2_X_SOURCE_IN_ONE_FLOAT
91*61046927SAndroid Build Coastguard Worker             }
92*61046927SAndroid Build Coastguard Worker         }
93*61046927SAndroid Build Coastguard Worker         other => panic!("Invalid component swizzle {}", other),
94*61046927SAndroid Build Coastguard Worker     }
95*61046927SAndroid Build Coastguard Worker }
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker type THBitView<'a> = BitMutView<'a, [u32; 8]>;
98*61046927SAndroid Build Coastguard Worker 
nv9097_set_th_v2_0<'a>( th: &mut THBitView<'a>, format: &Format, swizzle: [nil_rs_bindings::pipe_swizzle; 4], )99*61046927SAndroid Build Coastguard Worker fn nv9097_set_th_v2_0<'a>(
100*61046927SAndroid Build Coastguard Worker     th: &mut THBitView<'a>,
101*61046927SAndroid Build Coastguard Worker     format: &Format,
102*61046927SAndroid Build Coastguard Worker     swizzle: [nil_rs_bindings::pipe_swizzle; 4],
103*61046927SAndroid Build Coastguard Worker ) {
104*61046927SAndroid Build Coastguard Worker     let fmt = &format.info().tic;
105*61046927SAndroid Build Coastguard Worker     let is_int = format.is_integer();
106*61046927SAndroid Build Coastguard Worker     let source = [
107*61046927SAndroid Build Coastguard Worker         nv9097_th_v2_source(fmt, swizzle[0], is_int),
108*61046927SAndroid Build Coastguard Worker         nv9097_th_v2_source(fmt, swizzle[1], is_int),
109*61046927SAndroid Build Coastguard Worker         nv9097_th_v2_source(fmt, swizzle[2], is_int),
110*61046927SAndroid Build Coastguard Worker         nv9097_th_v2_source(fmt, swizzle[3], is_int),
111*61046927SAndroid Build Coastguard Worker     ];
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_COMPONENT_SIZES, fmt.comp_sizes());
114*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_R_DATA_TYPE, fmt.type_r());
115*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_G_DATA_TYPE, fmt.type_g());
116*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_B_DATA_TYPE, fmt.type_b());
117*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_A_DATA_TYPE, fmt.type_a());
118*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_X_SOURCE, source[0]);
119*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_Y_SOURCE, source[1]);
120*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_Z_SOURCE, source[2]);
121*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_W_SOURCE, source[3]);
122*61046927SAndroid Build Coastguard Worker }
123*61046927SAndroid Build Coastguard Worker 
nvb097_set_th_bl_0<'a>( th: &mut THBitView<'a>, format: &Format, swizzle: [nil_rs_bindings::pipe_swizzle; 4], )124*61046927SAndroid Build Coastguard Worker fn nvb097_set_th_bl_0<'a>(
125*61046927SAndroid Build Coastguard Worker     th: &mut THBitView<'a>,
126*61046927SAndroid Build Coastguard Worker     format: &Format,
127*61046927SAndroid Build Coastguard Worker     swizzle: [nil_rs_bindings::pipe_swizzle; 4],
128*61046927SAndroid Build Coastguard Worker ) {
129*61046927SAndroid Build Coastguard Worker     let fmt = &format.info().tic;
130*61046927SAndroid Build Coastguard Worker     let is_int = format.is_integer();
131*61046927SAndroid Build Coastguard Worker     let source = [
132*61046927SAndroid Build Coastguard Worker         nvb097_th_bl_source(fmt, swizzle[0], is_int),
133*61046927SAndroid Build Coastguard Worker         nvb097_th_bl_source(fmt, swizzle[1], is_int),
134*61046927SAndroid Build Coastguard Worker         nvb097_th_bl_source(fmt, swizzle[2], is_int),
135*61046927SAndroid Build Coastguard Worker         nvb097_th_bl_source(fmt, swizzle[3], is_int),
136*61046927SAndroid Build Coastguard Worker     ];
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_COMPONENTS, fmt.comp_sizes());
139*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_R_DATA_TYPE, fmt.type_r());
140*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_G_DATA_TYPE, fmt.type_g());
141*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_B_DATA_TYPE, fmt.type_b());
142*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_A_DATA_TYPE, fmt.type_a());
143*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_X_SOURCE, source[0]);
144*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_Y_SOURCE, source[1]);
145*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_Z_SOURCE, source[2]);
146*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_W_SOURCE, source[3]);
147*61046927SAndroid Build Coastguard Worker }
148*61046927SAndroid Build Coastguard Worker 
pipe_to_nv_texture_type(ty: ViewType) -> u32149*61046927SAndroid Build Coastguard Worker fn pipe_to_nv_texture_type(ty: ViewType) -> u32 {
150*61046927SAndroid Build Coastguard Worker     match ty {
151*61046927SAndroid Build Coastguard Worker         ViewType::_1D => clb097::TEXHEAD_BL_TEXTURE_TYPE_ONE_D,
152*61046927SAndroid Build Coastguard Worker         ViewType::_2D => clb097::TEXHEAD_BL_TEXTURE_TYPE_TWO_D,
153*61046927SAndroid Build Coastguard Worker         ViewType::_3D | ViewType::_3DSliced => {
154*61046927SAndroid Build Coastguard Worker             clb097::TEXHEAD_BL_TEXTURE_TYPE_THREE_D
155*61046927SAndroid Build Coastguard Worker         }
156*61046927SAndroid Build Coastguard Worker         ViewType::Cube => clb097::TEXHEAD_BL_TEXTURE_TYPE_CUBEMAP,
157*61046927SAndroid Build Coastguard Worker         ViewType::_1DArray => clb097::TEXHEAD_BL_TEXTURE_TYPE_ONE_D_ARRAY,
158*61046927SAndroid Build Coastguard Worker         ViewType::_2DArray => clb097::TEXHEAD_BL_TEXTURE_TYPE_TWO_D_ARRAY,
159*61046927SAndroid Build Coastguard Worker         ViewType::CubeArray => clb097::TEXHEAD_BL_TEXTURE_TYPE_CUBEMAP_ARRAY,
160*61046927SAndroid Build Coastguard Worker     }
161*61046927SAndroid Build Coastguard Worker }
162*61046927SAndroid Build Coastguard Worker 
nil_rs_to_nv9097_multi_sample_count(sample_layout: SampleLayout) -> u32163*61046927SAndroid Build Coastguard Worker fn nil_rs_to_nv9097_multi_sample_count(sample_layout: SampleLayout) -> u32 {
164*61046927SAndroid Build Coastguard Worker     match sample_layout {
165*61046927SAndroid Build Coastguard Worker         SampleLayout::_1x1 => cl9097::TEXHEADV2_MULTI_SAMPLE_COUNT_MODE_1X1,
166*61046927SAndroid Build Coastguard Worker         SampleLayout::_2x1 => cl9097::TEXHEADV2_MULTI_SAMPLE_COUNT_MODE_2X1,
167*61046927SAndroid Build Coastguard Worker         SampleLayout::_2x2 => cl9097::TEXHEADV2_MULTI_SAMPLE_COUNT_MODE_2X2,
168*61046927SAndroid Build Coastguard Worker         SampleLayout::_4x2 => cl9097::TEXHEADV2_MULTI_SAMPLE_COUNT_MODE_4X2,
169*61046927SAndroid Build Coastguard Worker         SampleLayout::_4x4 => cl9097::TEXHEADV2_MULTI_SAMPLE_COUNT_MODE_4X4,
170*61046927SAndroid Build Coastguard Worker         SampleLayout::Invalid => panic!("Invalid sample layout"),
171*61046927SAndroid Build Coastguard Worker     }
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker 
nil_rs_to_nvb097_multi_sample_count(sample_layout: SampleLayout) -> u32174*61046927SAndroid Build Coastguard Worker fn nil_rs_to_nvb097_multi_sample_count(sample_layout: SampleLayout) -> u32 {
175*61046927SAndroid Build Coastguard Worker     match sample_layout {
176*61046927SAndroid Build Coastguard Worker         SampleLayout::_1x1 => clb097::TEXHEAD_BL_MULTI_SAMPLE_COUNT_MODE_1X1,
177*61046927SAndroid Build Coastguard Worker         SampleLayout::_2x1 => clb097::TEXHEAD_BL_MULTI_SAMPLE_COUNT_MODE_2X1,
178*61046927SAndroid Build Coastguard Worker         SampleLayout::_2x2 => clb097::TEXHEAD_BL_MULTI_SAMPLE_COUNT_MODE_2X2,
179*61046927SAndroid Build Coastguard Worker         SampleLayout::_4x2 => clb097::TEXHEAD_BL_MULTI_SAMPLE_COUNT_MODE_4X2,
180*61046927SAndroid Build Coastguard Worker         SampleLayout::_4x4 => clb097::TEXHEAD_BL_MULTI_SAMPLE_COUNT_MODE_4X4,
181*61046927SAndroid Build Coastguard Worker         SampleLayout::Invalid => panic!("Invalid sample layout"),
182*61046927SAndroid Build Coastguard Worker     }
183*61046927SAndroid Build Coastguard Worker }
184*61046927SAndroid Build Coastguard Worker 
nil_rs_max_mip_level(image: &Image, view: &View) -> u32185*61046927SAndroid Build Coastguard Worker fn nil_rs_max_mip_level(image: &Image, view: &View) -> u32 {
186*61046927SAndroid Build Coastguard Worker     if view.view_type != ViewType::_3D
187*61046927SAndroid Build Coastguard Worker         && view.array_len == 1
188*61046927SAndroid Build Coastguard Worker         && view.base_level == 0
189*61046927SAndroid Build Coastguard Worker         && view.num_levels == 1
190*61046927SAndroid Build Coastguard Worker     {
191*61046927SAndroid Build Coastguard Worker         // The Unnormalized coordinates bit in the sampler gets ignored if the
192*61046927SAndroid Build Coastguard Worker         // referenced image has more than one miplevel.  Fortunately, Vulkan has
193*61046927SAndroid Build Coastguard Worker         // restrictions requiring the view to be a single-layer single-LOD view
194*61046927SAndroid Build Coastguard Worker         // in order to use nonnormalizedCoordinates = VK_TRUE in the sampler.
195*61046927SAndroid Build Coastguard Worker         // From the Vulkan 1.3.255 spec:
196*61046927SAndroid Build Coastguard Worker         //
197*61046927SAndroid Build Coastguard Worker         //  "When unnormalizedCoordinates is VK_TRUE, images the sampler is
198*61046927SAndroid Build Coastguard Worker         //  used with in the shader have the following requirements:
199*61046927SAndroid Build Coastguard Worker         //
200*61046927SAndroid Build Coastguard Worker         //      - The viewType must be either VK_IMAGE_VIEW_TYPE_1D or
201*61046927SAndroid Build Coastguard Worker         //        VK_IMAGE_VIEW_TYPE_2D.
202*61046927SAndroid Build Coastguard Worker         //      - The image view must have a single layer and a single mip
203*61046927SAndroid Build Coastguard Worker         //        level."
204*61046927SAndroid Build Coastguard Worker         //
205*61046927SAndroid Build Coastguard Worker         // Under these conditions, the view is simply LOD 0 of a single array
206*61046927SAndroid Build Coastguard Worker         // slice so we don't need to care about aray stride between slices so
207*61046927SAndroid Build Coastguard Worker         // it's safe to set the number of miplevels to 0 regardless of how many
208*61046927SAndroid Build Coastguard Worker         // the image actually has.
209*61046927SAndroid Build Coastguard Worker         0
210*61046927SAndroid Build Coastguard Worker     } else {
211*61046927SAndroid Build Coastguard Worker         image.num_levels - 1
212*61046927SAndroid Build Coastguard Worker     }
213*61046927SAndroid Build Coastguard Worker }
214*61046927SAndroid Build Coastguard Worker 
normalize_extent(image: &Image, view: &View) -> Extent4D<units::Pixels>215*61046927SAndroid Build Coastguard Worker fn normalize_extent(image: &Image, view: &View) -> Extent4D<units::Pixels> {
216*61046927SAndroid Build Coastguard Worker     let mut extent = image.extent_px;
217*61046927SAndroid Build Coastguard Worker     match view.view_type {
218*61046927SAndroid Build Coastguard Worker         ViewType::_1D
219*61046927SAndroid Build Coastguard Worker         | ViewType::_2D
220*61046927SAndroid Build Coastguard Worker         | ViewType::_1DArray
221*61046927SAndroid Build Coastguard Worker         | ViewType::_2DArray => {
222*61046927SAndroid Build Coastguard Worker             assert!(image.extent_px.depth == 1);
223*61046927SAndroid Build Coastguard Worker             extent.depth = view.array_len;
224*61046927SAndroid Build Coastguard Worker         }
225*61046927SAndroid Build Coastguard Worker         ViewType::_3D => {
226*61046927SAndroid Build Coastguard Worker             assert!(image.dim == ImageDim::_3D);
227*61046927SAndroid Build Coastguard Worker             extent.depth = image.extent_px.depth;
228*61046927SAndroid Build Coastguard Worker         }
229*61046927SAndroid Build Coastguard Worker         ViewType::Cube | ViewType::CubeArray => {
230*61046927SAndroid Build Coastguard Worker             assert!(image.dim == ImageDim::_2D);
231*61046927SAndroid Build Coastguard Worker             assert!(view.array_len % 6 == 0);
232*61046927SAndroid Build Coastguard Worker             extent.depth = view.array_len / 6;
233*61046927SAndroid Build Coastguard Worker         }
234*61046927SAndroid Build Coastguard Worker         ViewType::_3DSliced => {
235*61046927SAndroid Build Coastguard Worker             assert!(image.dim == ImageDim::_3D);
236*61046927SAndroid Build Coastguard Worker             extent.depth = view.array_len;
237*61046927SAndroid Build Coastguard Worker         }
238*61046927SAndroid Build Coastguard Worker     }
239*61046927SAndroid Build Coastguard Worker     extent.array_len = 0;
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker     extent
242*61046927SAndroid Build Coastguard Worker }
243*61046927SAndroid Build Coastguard Worker 
nv9097_fill_tic( image: &Image, view: &View, base_address: u64, desc_out: &mut [u32; 8], )244*61046927SAndroid Build Coastguard Worker fn nv9097_fill_tic(
245*61046927SAndroid Build Coastguard Worker     image: &Image,
246*61046927SAndroid Build Coastguard Worker     view: &View,
247*61046927SAndroid Build Coastguard Worker     base_address: u64,
248*61046927SAndroid Build Coastguard Worker     desc_out: &mut [u32; 8],
249*61046927SAndroid Build Coastguard Worker ) {
250*61046927SAndroid Build Coastguard Worker     assert!(image.format.el_size_B() == view.format.el_size_B());
251*61046927SAndroid Build Coastguard Worker     assert!(view.base_level + view.num_levels <= image.num_levels);
252*61046927SAndroid Build Coastguard Worker     assert!(
253*61046927SAndroid Build Coastguard Worker         view.base_array_layer + view.array_len <= image.extent_px.array_len
254*61046927SAndroid Build Coastguard Worker     );
255*61046927SAndroid Build Coastguard Worker 
256*61046927SAndroid Build Coastguard Worker     *desc_out = [0u32; 8];
257*61046927SAndroid Build Coastguard Worker     let mut th = BitMutView::new(desc_out);
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_USE_TEXTURE_HEADER_VERSION2, true);
260*61046927SAndroid Build Coastguard Worker     nv9097_set_th_v2_0(&mut th, &view.format, view.swizzle);
261*61046927SAndroid Build Coastguard Worker 
262*61046927SAndroid Build Coastguard Worker     // There's no base layer field in the texture header
263*61046927SAndroid Build Coastguard Worker     let layer_address = base_address
264*61046927SAndroid Build Coastguard Worker         + u64::from(view.base_array_layer)
265*61046927SAndroid Build Coastguard Worker         + u64::from(image.array_stride_B);
266*61046927SAndroid Build Coastguard Worker 
267*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_OFFSET_LOWER, layer_address as u32);
268*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_OFFSET_UPPER, (layer_address >> 32) as u32);
269*61046927SAndroid Build Coastguard Worker 
270*61046927SAndroid Build Coastguard Worker     let tiling = &image.levels[0].tiling;
271*61046927SAndroid Build Coastguard Worker 
272*61046927SAndroid Build Coastguard Worker     if tiling.is_tiled {
273*61046927SAndroid Build Coastguard Worker         set_enum!(th, cl9097, TEXHEADV2_MEMORY_LAYOUT, BLOCKLINEAR);
274*61046927SAndroid Build Coastguard Worker 
275*61046927SAndroid Build Coastguard Worker         assert!(tiling.gob_height_is_8);
276*61046927SAndroid Build Coastguard Worker         assert!(tiling.x_log2 == 0);
277*61046927SAndroid Build Coastguard Worker         set_enum!(th, cl9097, TEXHEADV2_GOBS_PER_BLOCK_WIDTH, ONE_GOB);
278*61046927SAndroid Build Coastguard Worker         th.set_field(cl9097::TEXHEADV2_GOBS_PER_BLOCK_HEIGHT, tiling.y_log2);
279*61046927SAndroid Build Coastguard Worker         th.set_field(cl9097::TEXHEADV2_GOBS_PER_BLOCK_DEPTH, tiling.z_log2);
280*61046927SAndroid Build Coastguard Worker 
281*61046927SAndroid Build Coastguard Worker         let nv_tex_type = pipe_to_nv_texture_type(view.view_type);
282*61046927SAndroid Build Coastguard Worker         th.set_field(cl9097::TEXHEADV2_TEXTURE_TYPE, nv_tex_type);
283*61046927SAndroid Build Coastguard Worker     } else {
284*61046927SAndroid Build Coastguard Worker         set_enum!(th, cl9097, TEXHEADV2_MEMORY_LAYOUT, PITCH);
285*61046927SAndroid Build Coastguard Worker 
286*61046927SAndroid Build Coastguard Worker         let pitch = image.levels[0].row_stride_B;
287*61046927SAndroid Build Coastguard Worker         th.set_field(cl9097::TEXHEADV2_PITCH, pitch);
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker         assert!(
290*61046927SAndroid Build Coastguard Worker             view.view_type == ViewType::_2D
291*61046927SAndroid Build Coastguard Worker                 || view.view_type == ViewType::_2DArray
292*61046927SAndroid Build Coastguard Worker         );
293*61046927SAndroid Build Coastguard Worker         assert!(image.sample_layout == SampleLayout::_1x1);
294*61046927SAndroid Build Coastguard Worker         assert!(view.num_levels == 1);
295*61046927SAndroid Build Coastguard Worker         set_enum!(th, cl9097, TEXHEADV2_TEXTURE_TYPE, TWO_D_NO_MIPMAP);
296*61046927SAndroid Build Coastguard Worker     }
297*61046927SAndroid Build Coastguard Worker 
298*61046927SAndroid Build Coastguard Worker     set_enum!(th, cl9097, TEXHEADV2_LOD_ANISO_QUALITY, LOD_QUALITY_HIGH);
299*61046927SAndroid Build Coastguard Worker     set_enum!(th, cl9097, TEXHEADV2_LOD_ISO_QUALITY, LOD_QUALITY_HIGH);
300*61046927SAndroid Build Coastguard Worker     set_enum!(
301*61046927SAndroid Build Coastguard Worker         th,
302*61046927SAndroid Build Coastguard Worker         cl9097,
303*61046927SAndroid Build Coastguard Worker         TEXHEADV2_ANISO_COARSE_SPREAD_MODIFIER,
304*61046927SAndroid Build Coastguard Worker         SPREAD_MODIFIER_NONE
305*61046927SAndroid Build Coastguard Worker     );
306*61046927SAndroid Build Coastguard Worker 
307*61046927SAndroid Build Coastguard Worker     let extent = normalize_extent(image, view);
308*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_WIDTH, extent.width);
309*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_HEIGHT, extent.height);
310*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_DEPTH, extent.depth);
311*61046927SAndroid Build Coastguard Worker 
312*61046927SAndroid Build Coastguard Worker     let max_mip_level = nil_rs_max_mip_level(image, view);
313*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_MAX_MIP_LEVEL, max_mip_level);
314*61046927SAndroid Build Coastguard Worker 
315*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_S_R_G_B_CONVERSION, view.format.is_srgb());
316*61046927SAndroid Build Coastguard Worker 
317*61046927SAndroid Build Coastguard Worker     set_enum!(th, cl9097, TEXHEADV2_BORDER_SOURCE, BORDER_COLOR);
318*61046927SAndroid Build Coastguard Worker 
319*61046927SAndroid Build Coastguard Worker     // In the sampler, the two options for FLOAT_COORD_NORMALIZATION are:
320*61046927SAndroid Build Coastguard Worker     //
321*61046927SAndroid Build Coastguard Worker     // - FORCE_UNNORMALIZED_COORDS
322*61046927SAndroid Build Coastguard Worker     // - USE_HEADER_SETTING
323*61046927SAndroid Build Coastguard Worker     //
324*61046927SAndroid Build Coastguard Worker     // So we set it to normalized in the header and let the sampler select that
325*61046927SAndroid Build Coastguard Worker     // or force non-normalized.
326*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_NORMALIZED_COORDS, true);
327*61046927SAndroid Build Coastguard Worker 
328*61046927SAndroid Build Coastguard Worker     set_enum!(
329*61046927SAndroid Build Coastguard Worker         th,
330*61046927SAndroid Build Coastguard Worker         cl9097,
331*61046927SAndroid Build Coastguard Worker         TEXHEADV2_ANISO_FINE_SPREAD_FUNC,
332*61046927SAndroid Build Coastguard Worker         SPREAD_FUNC_TWO
333*61046927SAndroid Build Coastguard Worker     );
334*61046927SAndroid Build Coastguard Worker     set_enum!(
335*61046927SAndroid Build Coastguard Worker         th,
336*61046927SAndroid Build Coastguard Worker         cl9097,
337*61046927SAndroid Build Coastguard Worker         TEXHEADV2_ANISO_COARSE_SPREAD_FUNC,
338*61046927SAndroid Build Coastguard Worker         SPREAD_FUNC_ONE
339*61046927SAndroid Build Coastguard Worker     );
340*61046927SAndroid Build Coastguard Worker 
341*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_RES_VIEW_MIN_MIP_LEVEL, view.base_level);
342*61046927SAndroid Build Coastguard Worker     th.set_field(
343*61046927SAndroid Build Coastguard Worker         cl9097::TEXHEADV2_RES_VIEW_MAX_MIP_LEVEL,
344*61046927SAndroid Build Coastguard Worker         view.num_levels + view.base_level - 1,
345*61046927SAndroid Build Coastguard Worker     );
346*61046927SAndroid Build Coastguard Worker 
347*61046927SAndroid Build Coastguard Worker     let msc = nil_rs_to_nv9097_multi_sample_count(image.sample_layout);
348*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_MULTI_SAMPLE_COUNT, msc);
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker     let min_lod_clamp = view.min_lod_clamp - (view.base_level as f32);
351*61046927SAndroid Build Coastguard Worker     th.set_ufixed(cl9097::TEXHEADV2_MIN_LOD_CLAMP, min_lod_clamp);
352*61046927SAndroid Build Coastguard Worker }
353*61046927SAndroid Build Coastguard Worker 
nvb097_fill_tic( dev: &nil_rs_bindings::nv_device_info, image: &Image, view: &View, base_address: u64, desc_out: &mut [u32; 8], )354*61046927SAndroid Build Coastguard Worker fn nvb097_fill_tic(
355*61046927SAndroid Build Coastguard Worker     dev: &nil_rs_bindings::nv_device_info,
356*61046927SAndroid Build Coastguard Worker     image: &Image,
357*61046927SAndroid Build Coastguard Worker     view: &View,
358*61046927SAndroid Build Coastguard Worker     base_address: u64,
359*61046927SAndroid Build Coastguard Worker     desc_out: &mut [u32; 8],
360*61046927SAndroid Build Coastguard Worker ) {
361*61046927SAndroid Build Coastguard Worker     assert!(image.format.el_size_B() == view.format.el_size_B());
362*61046927SAndroid Build Coastguard Worker     assert!(view.base_level + view.num_levels <= image.num_levels);
363*61046927SAndroid Build Coastguard Worker 
364*61046927SAndroid Build Coastguard Worker     *desc_out = [0u32; 8];
365*61046927SAndroid Build Coastguard Worker     let mut th = BitMutView::new(desc_out);
366*61046927SAndroid Build Coastguard Worker 
367*61046927SAndroid Build Coastguard Worker     nvb097_set_th_bl_0(&mut th, &view.format, view.swizzle);
368*61046927SAndroid Build Coastguard Worker 
369*61046927SAndroid Build Coastguard Worker     let tiling = &image.levels[0].tiling;
370*61046927SAndroid Build Coastguard Worker 
371*61046927SAndroid Build Coastguard Worker     // There's no base layer field in the texture header
372*61046927SAndroid Build Coastguard Worker     let mut layer_address = base_address;
373*61046927SAndroid Build Coastguard Worker     if view.view_type == ViewType::_3DSliced {
374*61046927SAndroid Build Coastguard Worker         assert!(view.num_levels == 1);
375*61046927SAndroid Build Coastguard Worker         assert!(
376*61046927SAndroid Build Coastguard Worker             view.base_array_layer + view.array_len <= image.extent_px.depth
377*61046927SAndroid Build Coastguard Worker         );
378*61046927SAndroid Build Coastguard Worker 
379*61046927SAndroid Build Coastguard Worker         layer_address +=
380*61046927SAndroid Build Coastguard Worker             image.level_z_offset_B(view.base_level, view.base_array_layer);
381*61046927SAndroid Build Coastguard Worker     } else {
382*61046927SAndroid Build Coastguard Worker         assert!(
383*61046927SAndroid Build Coastguard Worker             view.base_array_layer + view.array_len <= image.extent_px.array_len
384*61046927SAndroid Build Coastguard Worker         );
385*61046927SAndroid Build Coastguard Worker         layer_address +=
386*61046927SAndroid Build Coastguard Worker             u64::from(view.base_array_layer) * u64::from(image.array_stride_B);
387*61046927SAndroid Build Coastguard Worker     }
388*61046927SAndroid Build Coastguard Worker 
389*61046927SAndroid Build Coastguard Worker     if tiling.is_tiled {
390*61046927SAndroid Build Coastguard Worker         set_enum!(th, clb097, TEXHEAD_BL_HEADER_VERSION, SELECT_BLOCKLINEAR);
391*61046927SAndroid Build Coastguard Worker 
392*61046927SAndroid Build Coastguard Worker         let addr = BitView::new(&layer_address);
393*61046927SAndroid Build Coastguard Worker         assert!(addr.get_bit_range_u64(0..9) == 0);
394*61046927SAndroid Build Coastguard Worker         th.set_field(
395*61046927SAndroid Build Coastguard Worker             clb097::TEXHEAD_BL_ADDRESS_BITS31TO9,
396*61046927SAndroid Build Coastguard Worker             addr.get_bit_range_u64(9..32),
397*61046927SAndroid Build Coastguard Worker         );
398*61046927SAndroid Build Coastguard Worker         th.set_field(
399*61046927SAndroid Build Coastguard Worker             clb097::TEXHEAD_BL_ADDRESS_BITS47TO32,
400*61046927SAndroid Build Coastguard Worker             addr.get_bit_range_u64(32..48),
401*61046927SAndroid Build Coastguard Worker         );
402*61046927SAndroid Build Coastguard Worker         assert!(addr.get_bit_range_u64(48..64) == 0);
403*61046927SAndroid Build Coastguard Worker 
404*61046927SAndroid Build Coastguard Worker         assert!(tiling.gob_height_is_8);
405*61046927SAndroid Build Coastguard Worker 
406*61046927SAndroid Build Coastguard Worker         set_enum!(th, clb097, TEXHEAD_BL_GOBS_PER_BLOCK_WIDTH, ONE_GOB);
407*61046927SAndroid Build Coastguard Worker         th.set_field(clb097::TEXHEAD_BL_GOBS_PER_BLOCK_HEIGHT, tiling.y_log2);
408*61046927SAndroid Build Coastguard Worker         th.set_field(clb097::TEXHEAD_BL_GOBS_PER_BLOCK_DEPTH, tiling.z_log2);
409*61046927SAndroid Build Coastguard Worker         th.set_field(clb097::TEXHEAD_BL_TILE_WIDTH_IN_GOBS, tiling.x_log2);
410*61046927SAndroid Build Coastguard Worker 
411*61046927SAndroid Build Coastguard Worker         let nv_text_type = pipe_to_nv_texture_type(view.view_type);
412*61046927SAndroid Build Coastguard Worker         th.set_field(clb097::TEXHEAD_BL_TEXTURE_TYPE, nv_text_type);
413*61046927SAndroid Build Coastguard Worker     } else {
414*61046927SAndroid Build Coastguard Worker         set_enum!(th, clb097, TEXHEAD_BL_HEADER_VERSION, SELECT_PITCH);
415*61046927SAndroid Build Coastguard Worker 
416*61046927SAndroid Build Coastguard Worker         let addr = BitView::new(&layer_address);
417*61046927SAndroid Build Coastguard Worker         assert!(addr.get_bit_range_u64(0..5) == 0);
418*61046927SAndroid Build Coastguard Worker         th.set_field(
419*61046927SAndroid Build Coastguard Worker             clb097::TEXHEAD_PITCH_ADDRESS_BITS31TO5,
420*61046927SAndroid Build Coastguard Worker             addr.get_bit_range_u64(5..32),
421*61046927SAndroid Build Coastguard Worker         );
422*61046927SAndroid Build Coastguard Worker         th.set_field(
423*61046927SAndroid Build Coastguard Worker             clb097::TEXHEAD_PITCH_ADDRESS_BITS47TO32,
424*61046927SAndroid Build Coastguard Worker             addr.get_bit_range_u64(32..48),
425*61046927SAndroid Build Coastguard Worker         );
426*61046927SAndroid Build Coastguard Worker         assert!(addr.get_bit_range_u64(48..64) == 0);
427*61046927SAndroid Build Coastguard Worker 
428*61046927SAndroid Build Coastguard Worker         let pitch = image.levels[0].row_stride_B;
429*61046927SAndroid Build Coastguard Worker         let pitch = BitView::new(&pitch);
430*61046927SAndroid Build Coastguard Worker         assert!(pitch.get_bit_range_u64(0..5) == 0);
431*61046927SAndroid Build Coastguard Worker         assert!(pitch.get_bit_range_u64(21..32) == 0);
432*61046927SAndroid Build Coastguard Worker         th.set_field(
433*61046927SAndroid Build Coastguard Worker             clb097::TEXHEAD_PITCH_PITCH_BITS20TO5,
434*61046927SAndroid Build Coastguard Worker             pitch.get_bit_range_u64(5..21),
435*61046927SAndroid Build Coastguard Worker         );
436*61046927SAndroid Build Coastguard Worker 
437*61046927SAndroid Build Coastguard Worker         assert!(
438*61046927SAndroid Build Coastguard Worker             view.view_type == ViewType::_2D
439*61046927SAndroid Build Coastguard Worker                 || view.view_type == ViewType::_2DArray
440*61046927SAndroid Build Coastguard Worker         );
441*61046927SAndroid Build Coastguard Worker         assert!(image.sample_layout == SampleLayout::_1x1);
442*61046927SAndroid Build Coastguard Worker         assert!(view.num_levels == 1);
443*61046927SAndroid Build Coastguard Worker         set_enum!(th, clb097, TEXHEAD_PITCH_TEXTURE_TYPE, TWO_D_NO_MIPMAP);
444*61046927SAndroid Build Coastguard Worker     }
445*61046927SAndroid Build Coastguard Worker 
446*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_LOD_ANISO_QUALITY2, true);
447*61046927SAndroid Build Coastguard Worker     set_enum!(th, clb097, TEXHEAD_BL_LOD_ANISO_QUALITY, LOD_QUALITY_HIGH);
448*61046927SAndroid Build Coastguard Worker     set_enum!(th, clb097, TEXHEAD_BL_LOD_ISO_QUALITY, LOD_QUALITY_HIGH);
449*61046927SAndroid Build Coastguard Worker     set_enum!(
450*61046927SAndroid Build Coastguard Worker         th,
451*61046927SAndroid Build Coastguard Worker         clb097,
452*61046927SAndroid Build Coastguard Worker         TEXHEAD_BL_ANISO_COARSE_SPREAD_MODIFIER,
453*61046927SAndroid Build Coastguard Worker         SPREAD_MODIFIER_NONE
454*61046927SAndroid Build Coastguard Worker     );
455*61046927SAndroid Build Coastguard Worker 
456*61046927SAndroid Build Coastguard Worker     let extent = normalize_extent(image, view);
457*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_WIDTH_MINUS_ONE, extent.width - 1);
458*61046927SAndroid Build Coastguard Worker 
459*61046927SAndroid Build Coastguard Worker     if dev.cls_eng3d >= PASCAL_A {
460*61046927SAndroid Build Coastguard Worker         let height_1 = extent.height - 1;
461*61046927SAndroid Build Coastguard Worker         let depth_1 = extent.depth - 1;
462*61046927SAndroid Build Coastguard Worker         th.set_field(clc097::TEXHEAD_BL_HEIGHT_MINUS_ONE, height_1 & 0xffff);
463*61046927SAndroid Build Coastguard Worker         th.set_field(clc097::TEXHEAD_BL_HEIGHT_MINUS_ONE_BIT16, height_1 >> 16);
464*61046927SAndroid Build Coastguard Worker         th.set_field(clc097::TEXHEAD_BL_DEPTH_MINUS_ONE, depth_1 & 0x3fff);
465*61046927SAndroid Build Coastguard Worker         th.set_field(clc097::TEXHEAD_BL_DEPTH_MINUS_ONE_BIT14, depth_1 >> 14);
466*61046927SAndroid Build Coastguard Worker     } else {
467*61046927SAndroid Build Coastguard Worker         th.set_field(clb097::TEXHEAD_BL_HEIGHT_MINUS_ONE, extent.height - 1);
468*61046927SAndroid Build Coastguard Worker         th.set_field(clb097::TEXHEAD_BL_DEPTH_MINUS_ONE, extent.depth - 1);
469*61046927SAndroid Build Coastguard Worker     }
470*61046927SAndroid Build Coastguard Worker 
471*61046927SAndroid Build Coastguard Worker     let max_mip_level = nil_rs_max_mip_level(image, view);
472*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_MAX_MIP_LEVEL, max_mip_level);
473*61046927SAndroid Build Coastguard Worker 
474*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_S_R_G_B_CONVERSION, view.format.is_srgb());
475*61046927SAndroid Build Coastguard Worker 
476*61046927SAndroid Build Coastguard Worker     set_enum!(th, clb097, TEXHEAD_BL_SECTOR_PROMOTION, PROMOTE_TO_2_V);
477*61046927SAndroid Build Coastguard Worker     set_enum!(th, clb097, TEXHEAD_BL_BORDER_SIZE, BORDER_SAMPLER_COLOR);
478*61046927SAndroid Build Coastguard Worker 
479*61046927SAndroid Build Coastguard Worker     // In the sampler, the two options for FLOAT_COORD_NORMALIZATION are:
480*61046927SAndroid Build Coastguard Worker     //
481*61046927SAndroid Build Coastguard Worker     // - FORCE_UNNORMALIZED_COORDS
482*61046927SAndroid Build Coastguard Worker     // - USE_HEADER_SETTING
483*61046927SAndroid Build Coastguard Worker     //
484*61046927SAndroid Build Coastguard Worker     // So we set it to normalized in the header and let the sampler select that
485*61046927SAndroid Build Coastguard Worker     // or force non-normalized.
486*61046927SAndroid Build Coastguard Worker 
487*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_NORMALIZED_COORDS, true);
488*61046927SAndroid Build Coastguard Worker     set_enum!(
489*61046927SAndroid Build Coastguard Worker         th,
490*61046927SAndroid Build Coastguard Worker         clb097,
491*61046927SAndroid Build Coastguard Worker         TEXHEAD_BL_ANISO_FINE_SPREAD_FUNC,
492*61046927SAndroid Build Coastguard Worker         SPREAD_FUNC_TWO
493*61046927SAndroid Build Coastguard Worker     );
494*61046927SAndroid Build Coastguard Worker     set_enum!(
495*61046927SAndroid Build Coastguard Worker         th,
496*61046927SAndroid Build Coastguard Worker         clb097,
497*61046927SAndroid Build Coastguard Worker         TEXHEAD_BL_ANISO_COARSE_SPREAD_FUNC,
498*61046927SAndroid Build Coastguard Worker         SPREAD_FUNC_ONE
499*61046927SAndroid Build Coastguard Worker     );
500*61046927SAndroid Build Coastguard Worker 
501*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_RES_VIEW_MIN_MIP_LEVEL, view.base_level);
502*61046927SAndroid Build Coastguard Worker 
503*61046927SAndroid Build Coastguard Worker     let max_mip_level = view.num_levels + view.base_level - 1;
504*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_RES_VIEW_MAX_MIP_LEVEL, max_mip_level);
505*61046927SAndroid Build Coastguard Worker 
506*61046927SAndroid Build Coastguard Worker     let msc = nil_rs_to_nvb097_multi_sample_count(image.sample_layout);
507*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_MULTI_SAMPLE_COUNT, msc);
508*61046927SAndroid Build Coastguard Worker 
509*61046927SAndroid Build Coastguard Worker     let min_lod_clamp = view.min_lod_clamp - (view.base_level as f32);
510*61046927SAndroid Build Coastguard Worker     th.set_ufixed(clb097::TEXHEAD_BL_MIN_LOD_CLAMP, min_lod_clamp);
511*61046927SAndroid Build Coastguard Worker }
512*61046927SAndroid Build Coastguard Worker 
513*61046927SAndroid Build Coastguard Worker pub const IDENTITY_SWIZZLE: [nil_rs_bindings::pipe_swizzle; 4] = [
514*61046927SAndroid Build Coastguard Worker     nil_rs_bindings::PIPE_SWIZZLE_X,
515*61046927SAndroid Build Coastguard Worker     nil_rs_bindings::PIPE_SWIZZLE_Y,
516*61046927SAndroid Build Coastguard Worker     nil_rs_bindings::PIPE_SWIZZLE_Z,
517*61046927SAndroid Build Coastguard Worker     nil_rs_bindings::PIPE_SWIZZLE_W,
518*61046927SAndroid Build Coastguard Worker ];
519*61046927SAndroid Build Coastguard Worker 
nv9097_nil_fill_buffer_tic( base_address: u64, format: Format, num_elements: u32, desc_out: &mut [u32; 8], )520*61046927SAndroid Build Coastguard Worker fn nv9097_nil_fill_buffer_tic(
521*61046927SAndroid Build Coastguard Worker     base_address: u64,
522*61046927SAndroid Build Coastguard Worker     format: Format,
523*61046927SAndroid Build Coastguard Worker     num_elements: u32,
524*61046927SAndroid Build Coastguard Worker     desc_out: &mut [u32; 8],
525*61046927SAndroid Build Coastguard Worker ) {
526*61046927SAndroid Build Coastguard Worker     *desc_out = [0u32; 8];
527*61046927SAndroid Build Coastguard Worker     let mut th = BitMutView::new(desc_out);
528*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_USE_TEXTURE_HEADER_VERSION2, true);
529*61046927SAndroid Build Coastguard Worker 
530*61046927SAndroid Build Coastguard Worker     assert!(format.supports_buffer());
531*61046927SAndroid Build Coastguard Worker     nv9097_set_th_v2_0(&mut th, &format, IDENTITY_SWIZZLE);
532*61046927SAndroid Build Coastguard Worker 
533*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_OFFSET_LOWER, base_address as u32);
534*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_OFFSET_UPPER, (base_address >> 32) as u32);
535*61046927SAndroid Build Coastguard Worker 
536*61046927SAndroid Build Coastguard Worker     set_enum!(th, cl9097, TEXHEADV2_MEMORY_LAYOUT, PITCH);
537*61046927SAndroid Build Coastguard Worker 
538*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_WIDTH, num_elements);
539*61046927SAndroid Build Coastguard Worker 
540*61046927SAndroid Build Coastguard Worker     set_enum!(th, cl9097, TEXHEADV2_TEXTURE_TYPE, ONE_D_BUFFER);
541*61046927SAndroid Build Coastguard Worker }
542*61046927SAndroid Build Coastguard Worker 
nvb097_nil_fill_buffer_tic( base_address: u64, format: Format, num_elements: u32, desc_out: &mut [u32; 8], )543*61046927SAndroid Build Coastguard Worker fn nvb097_nil_fill_buffer_tic(
544*61046927SAndroid Build Coastguard Worker     base_address: u64,
545*61046927SAndroid Build Coastguard Worker     format: Format,
546*61046927SAndroid Build Coastguard Worker     num_elements: u32,
547*61046927SAndroid Build Coastguard Worker     desc_out: &mut [u32; 8],
548*61046927SAndroid Build Coastguard Worker ) {
549*61046927SAndroid Build Coastguard Worker     *desc_out = [0u32; 8];
550*61046927SAndroid Build Coastguard Worker     let mut th = BitMutView::new(desc_out);
551*61046927SAndroid Build Coastguard Worker 
552*61046927SAndroid Build Coastguard Worker     assert!(format.supports_buffer());
553*61046927SAndroid Build Coastguard Worker     nvb097_set_th_bl_0(&mut th, &format, IDENTITY_SWIZZLE);
554*61046927SAndroid Build Coastguard Worker 
555*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_1D_ADDRESS_BITS31TO0, base_address as u32);
556*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_1D_ADDRESS_BITS47TO32, base_address >> 32);
557*61046927SAndroid Build Coastguard Worker 
558*61046927SAndroid Build Coastguard Worker     set_enum!(th, clb097, TEXHEAD_1D_HEADER_VERSION, SELECT_ONE_D_BUFFER);
559*61046927SAndroid Build Coastguard Worker 
560*61046927SAndroid Build Coastguard Worker     th.set_field(
561*61046927SAndroid Build Coastguard Worker         clb097::TEXHEAD_1D_WIDTH_MINUS_ONE_BITS15TO0,
562*61046927SAndroid Build Coastguard Worker         (num_elements - 1) & 0xffff,
563*61046927SAndroid Build Coastguard Worker     );
564*61046927SAndroid Build Coastguard Worker     th.set_field(
565*61046927SAndroid Build Coastguard Worker         clb097::TEXHEAD_1D_WIDTH_MINUS_ONE_BITS31TO16,
566*61046927SAndroid Build Coastguard Worker         (num_elements - 1) >> 16,
567*61046927SAndroid Build Coastguard Worker     );
568*61046927SAndroid Build Coastguard Worker 
569*61046927SAndroid Build Coastguard Worker     set_enum!(th, clb097, TEXHEAD_1D_TEXTURE_TYPE, ONE_D_BUFFER);
570*61046927SAndroid Build Coastguard Worker 
571*61046927SAndroid Build Coastguard Worker     // TODO: Do we need this?
572*61046927SAndroid Build Coastguard Worker     set_enum!(th, clb097, TEXHEAD_1D_SECTOR_PROMOTION, PROMOTE_TO_2_V);
573*61046927SAndroid Build Coastguard Worker }
574*61046927SAndroid Build Coastguard Worker 
575*61046927SAndroid Build Coastguard Worker impl Image {
576*61046927SAndroid Build Coastguard Worker     #[no_mangle]
nil_image_fill_tic( &self, dev: &nil_rs_bindings::nv_device_info, view: &View, base_address: u64, desc_out: &mut [u32; 8], )577*61046927SAndroid Build Coastguard Worker     pub extern "C" fn nil_image_fill_tic(
578*61046927SAndroid Build Coastguard Worker         &self,
579*61046927SAndroid Build Coastguard Worker         dev: &nil_rs_bindings::nv_device_info,
580*61046927SAndroid Build Coastguard Worker         view: &View,
581*61046927SAndroid Build Coastguard Worker         base_address: u64,
582*61046927SAndroid Build Coastguard Worker         desc_out: &mut [u32; 8],
583*61046927SAndroid Build Coastguard Worker     ) {
584*61046927SAndroid Build Coastguard Worker         self.fill_tic(dev, view, base_address, desc_out);
585*61046927SAndroid Build Coastguard Worker     }
586*61046927SAndroid Build Coastguard Worker 
fill_tic( &self, dev: &nil_rs_bindings::nv_device_info, view: &View, base_address: u64, desc_out: &mut [u32; 8], )587*61046927SAndroid Build Coastguard Worker     pub fn fill_tic(
588*61046927SAndroid Build Coastguard Worker         &self,
589*61046927SAndroid Build Coastguard Worker         dev: &nil_rs_bindings::nv_device_info,
590*61046927SAndroid Build Coastguard Worker         view: &View,
591*61046927SAndroid Build Coastguard Worker         base_address: u64,
592*61046927SAndroid Build Coastguard Worker         desc_out: &mut [u32; 8],
593*61046927SAndroid Build Coastguard Worker     ) {
594*61046927SAndroid Build Coastguard Worker         if dev.cls_eng3d >= MAXWELL_A {
595*61046927SAndroid Build Coastguard Worker             nvb097_fill_tic(dev, self, view, base_address, desc_out);
596*61046927SAndroid Build Coastguard Worker         } else if dev.cls_eng3d >= FERMI_A {
597*61046927SAndroid Build Coastguard Worker             nv9097_fill_tic(self, view, base_address, desc_out);
598*61046927SAndroid Build Coastguard Worker         } else {
599*61046927SAndroid Build Coastguard Worker             panic!("Tesla and older not supported");
600*61046927SAndroid Build Coastguard Worker         }
601*61046927SAndroid Build Coastguard Worker     }
602*61046927SAndroid Build Coastguard Worker }
603*61046927SAndroid Build Coastguard Worker 
604*61046927SAndroid Build Coastguard Worker #[no_mangle]
nil_buffer_fill_tic( dev: &nil_rs_bindings::nv_device_info, base_address: u64, format: Format, num_elements: u32, desc_out: &mut [u32; 8], )605*61046927SAndroid Build Coastguard Worker pub extern "C" fn nil_buffer_fill_tic(
606*61046927SAndroid Build Coastguard Worker     dev: &nil_rs_bindings::nv_device_info,
607*61046927SAndroid Build Coastguard Worker     base_address: u64,
608*61046927SAndroid Build Coastguard Worker     format: Format,
609*61046927SAndroid Build Coastguard Worker     num_elements: u32,
610*61046927SAndroid Build Coastguard Worker     desc_out: &mut [u32; 8],
611*61046927SAndroid Build Coastguard Worker ) {
612*61046927SAndroid Build Coastguard Worker     fill_buffer_tic(dev, base_address, format, num_elements, desc_out);
613*61046927SAndroid Build Coastguard Worker }
614*61046927SAndroid Build Coastguard Worker 
fill_buffer_tic( dev: &nil_rs_bindings::nv_device_info, base_address: u64, format: Format, num_elements: u32, desc_out: &mut [u32; 8], )615*61046927SAndroid Build Coastguard Worker pub fn fill_buffer_tic(
616*61046927SAndroid Build Coastguard Worker     dev: &nil_rs_bindings::nv_device_info,
617*61046927SAndroid Build Coastguard Worker     base_address: u64,
618*61046927SAndroid Build Coastguard Worker     format: Format,
619*61046927SAndroid Build Coastguard Worker     num_elements: u32,
620*61046927SAndroid Build Coastguard Worker     desc_out: &mut [u32; 8],
621*61046927SAndroid Build Coastguard Worker ) {
622*61046927SAndroid Build Coastguard Worker     if dev.cls_eng3d >= MAXWELL_A {
623*61046927SAndroid Build Coastguard Worker         nvb097_nil_fill_buffer_tic(base_address, format, num_elements, desc_out)
624*61046927SAndroid Build Coastguard Worker     } else if dev.cls_eng3d >= FERMI_A {
625*61046927SAndroid Build Coastguard Worker         nv9097_nil_fill_buffer_tic(base_address, format, num_elements, desc_out)
626*61046927SAndroid Build Coastguard Worker     } else {
627*61046927SAndroid Build Coastguard Worker         panic!("Tesla and older not supported");
628*61046927SAndroid Build Coastguard Worker     }
629*61046927SAndroid Build Coastguard Worker }
630*61046927SAndroid Build Coastguard Worker 
631*61046927SAndroid Build Coastguard Worker pub const ZERO_SWIZZLE: [nil_rs_bindings::pipe_swizzle; 4] = [
632*61046927SAndroid Build Coastguard Worker     nil_rs_bindings::PIPE_SWIZZLE_0,
633*61046927SAndroid Build Coastguard Worker     nil_rs_bindings::PIPE_SWIZZLE_0,
634*61046927SAndroid Build Coastguard Worker     nil_rs_bindings::PIPE_SWIZZLE_0,
635*61046927SAndroid Build Coastguard Worker     nil_rs_bindings::PIPE_SWIZZLE_0,
636*61046927SAndroid Build Coastguard Worker ];
637*61046927SAndroid Build Coastguard Worker 
nv9097_fill_null_tic(zero_page_address: u64, desc_out: &mut [u32; 8])638*61046927SAndroid Build Coastguard Worker fn nv9097_fill_null_tic(zero_page_address: u64, desc_out: &mut [u32; 8]) {
639*61046927SAndroid Build Coastguard Worker     *desc_out = [0u32; 8];
640*61046927SAndroid Build Coastguard Worker     let mut th = BitMutView::new(desc_out);
641*61046927SAndroid Build Coastguard Worker 
642*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_USE_TEXTURE_HEADER_VERSION2, true);
643*61046927SAndroid Build Coastguard Worker     let format = Format::try_from(PIPE_FORMAT_R8_UNORM).unwrap();
644*61046927SAndroid Build Coastguard Worker     nvb097_set_th_bl_0(&mut th, &format, ZERO_SWIZZLE);
645*61046927SAndroid Build Coastguard Worker 
646*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_OFFSET_LOWER, zero_page_address as u32);
647*61046927SAndroid Build Coastguard Worker     th.set_field(
648*61046927SAndroid Build Coastguard Worker         cl9097::TEXHEADV2_OFFSET_UPPER,
649*61046927SAndroid Build Coastguard Worker         (zero_page_address >> 32) as u32,
650*61046927SAndroid Build Coastguard Worker     );
651*61046927SAndroid Build Coastguard Worker 
652*61046927SAndroid Build Coastguard Worker     set_enum!(th, cl9097, TEXHEADV2_MEMORY_LAYOUT, BLOCKLINEAR);
653*61046927SAndroid Build Coastguard Worker     set_enum!(th, cl9097, TEXHEADV2_TEXTURE_TYPE, TWO_D_ARRAY);
654*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_NORMALIZED_COORDS, true);
655*61046927SAndroid Build Coastguard Worker 
656*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_RES_VIEW_MIN_MIP_LEVEL, 1_u8);
657*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_RES_VIEW_MAX_MIP_LEVEL, 0_u8);
658*61046927SAndroid Build Coastguard Worker }
659*61046927SAndroid Build Coastguard Worker 
nvb097_fill_null_tic(zero_page_address: u64, desc_out: &mut [u32; 8])660*61046927SAndroid Build Coastguard Worker fn nvb097_fill_null_tic(zero_page_address: u64, desc_out: &mut [u32; 8]) {
661*61046927SAndroid Build Coastguard Worker     *desc_out = [0u32; 8];
662*61046927SAndroid Build Coastguard Worker     let mut th = BitMutView::new(desc_out);
663*61046927SAndroid Build Coastguard Worker 
664*61046927SAndroid Build Coastguard Worker     let format = Format::try_from(PIPE_FORMAT_R8_UNORM).unwrap();
665*61046927SAndroid Build Coastguard Worker     nvb097_set_th_bl_0(&mut th, &format, ZERO_SWIZZLE);
666*61046927SAndroid Build Coastguard Worker 
667*61046927SAndroid Build Coastguard Worker     set_enum!(th, clb097, TEXHEAD_BL_HEADER_VERSION, SELECT_BLOCKLINEAR);
668*61046927SAndroid Build Coastguard Worker 
669*61046927SAndroid Build Coastguard Worker     let addr = BitView::new(&zero_page_address);
670*61046927SAndroid Build Coastguard Worker     assert!(addr.get_bit_range_u64(0..9) == 0);
671*61046927SAndroid Build Coastguard Worker     th.set_field(
672*61046927SAndroid Build Coastguard Worker         clb097::TEXHEAD_BL_ADDRESS_BITS31TO9,
673*61046927SAndroid Build Coastguard Worker         addr.get_bit_range_u64(9..32),
674*61046927SAndroid Build Coastguard Worker     );
675*61046927SAndroid Build Coastguard Worker     th.set_field(
676*61046927SAndroid Build Coastguard Worker         clb097::TEXHEAD_BL_ADDRESS_BITS47TO32,
677*61046927SAndroid Build Coastguard Worker         addr.get_bit_range_u64(32..48),
678*61046927SAndroid Build Coastguard Worker     );
679*61046927SAndroid Build Coastguard Worker     assert!(addr.get_bit_range_u64(48..64) == 0);
680*61046927SAndroid Build Coastguard Worker 
681*61046927SAndroid Build Coastguard Worker     set_enum!(th, clb097, TEXHEAD_BL_TEXTURE_TYPE, TWO_D_ARRAY);
682*61046927SAndroid Build Coastguard Worker     set_enum!(th, clb097, TEXHEAD_BL_BORDER_SIZE, BORDER_SAMPLER_COLOR);
683*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_NORMALIZED_COORDS, true);
684*61046927SAndroid Build Coastguard Worker 
685*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_RES_VIEW_MIN_MIP_LEVEL, 1_u8);
686*61046927SAndroid Build Coastguard Worker     th.set_field(cl9097::TEXHEADV2_RES_VIEW_MAX_MIP_LEVEL, 0_u8);
687*61046927SAndroid Build Coastguard Worker 
688*61046927SAndroid Build Coastguard Worker     // This is copied from the D3D12 driver. I have no idea what these bits do
689*61046927SAndroid Build Coastguard Worker     // or if they even do anything.
690*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_RESERVED4A, 0x4_u8);
691*61046927SAndroid Build Coastguard Worker     th.set_field(clb097::TEXHEAD_BL_RESERVED7Y, 0x80_u8);
692*61046927SAndroid Build Coastguard Worker }
693*61046927SAndroid Build Coastguard Worker 
fill_null_tic( dev: &nil_rs_bindings::nv_device_info, zero_page_address: u64, desc_out: &mut [u32; 8], )694*61046927SAndroid Build Coastguard Worker pub fn fill_null_tic(
695*61046927SAndroid Build Coastguard Worker     dev: &nil_rs_bindings::nv_device_info,
696*61046927SAndroid Build Coastguard Worker     zero_page_address: u64,
697*61046927SAndroid Build Coastguard Worker     desc_out: &mut [u32; 8],
698*61046927SAndroid Build Coastguard Worker ) {
699*61046927SAndroid Build Coastguard Worker     if dev.cls_eng3d >= VOLTA_A {
700*61046927SAndroid Build Coastguard Worker         // On Volta+, we can just fill with zeros
701*61046927SAndroid Build Coastguard Worker         *desc_out = [0; 8]
702*61046927SAndroid Build Coastguard Worker     } else if dev.cls_eng3d >= MAXWELL_A {
703*61046927SAndroid Build Coastguard Worker         nvb097_fill_null_tic(zero_page_address, desc_out)
704*61046927SAndroid Build Coastguard Worker     } else if dev.cls_eng3d >= FERMI_A {
705*61046927SAndroid Build Coastguard Worker         nv9097_fill_null_tic(zero_page_address, desc_out)
706*61046927SAndroid Build Coastguard Worker     } else {
707*61046927SAndroid Build Coastguard Worker         panic!("Tesla and older not supported");
708*61046927SAndroid Build Coastguard Worker     }
709*61046927SAndroid Build Coastguard Worker }
710*61046927SAndroid Build Coastguard Worker 
711*61046927SAndroid Build Coastguard Worker #[no_mangle]
nil_fill_null_tic( dev: &nil_rs_bindings::nv_device_info, zero_page_address: u64, desc_out: &mut [u32; 8], )712*61046927SAndroid Build Coastguard Worker pub extern "C" fn nil_fill_null_tic(
713*61046927SAndroid Build Coastguard Worker     dev: &nil_rs_bindings::nv_device_info,
714*61046927SAndroid Build Coastguard Worker     zero_page_address: u64,
715*61046927SAndroid Build Coastguard Worker     desc_out: &mut [u32; 8],
716*61046927SAndroid Build Coastguard Worker ) {
717*61046927SAndroid Build Coastguard Worker     fill_null_tic(dev, zero_page_address, desc_out);
718*61046927SAndroid Build Coastguard Worker }
719