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