1/* 2 * Copyright © 2020 Google LLC 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24#include "freedreno_layout.h" 25#include "fd_layout_test.h" 26#include "adreno_common.xml.h" 27#include "adreno_pm4.xml.h" 28#include "a6xx.xml.h" 29 30#include <stdio.h> 31 32bool 33fdl_test_layout(const struct testcase *testcase, int gpu_id) 34{ 35 struct fdl_layout layout = { 36 .ubwc = testcase->layout.ubwc, 37 .tile_mode = testcase->layout.tile_mode, 38 }; 39 bool ok = true; 40 41 int max_size = MAX2(testcase->layout.width0, testcase->layout.height0); 42 int mip_levels = 1; 43 while (max_size > 1 && testcase->layout.slices[mip_levels].pitch) { 44 mip_levels++; 45 max_size = u_minify(max_size, 1); 46 } 47 48 if (gpu_id >= 600) { 49 fdl6_layout(&layout, testcase->format, 50 MAX2(testcase->layout.nr_samples, 1), testcase->layout.width0, 51 MAX2(testcase->layout.height0, 1), 52 MAX2(testcase->layout.depth0, 1), mip_levels, 53 MAX2(testcase->array_size, 1), testcase->is_3d, NULL); 54 } else { 55 assert(gpu_id >= 500); 56 fdl5_layout(&layout, testcase->format, 57 MAX2(testcase->layout.nr_samples, 1), testcase->layout.width0, 58 MAX2(testcase->layout.height0, 1), 59 MAX2(testcase->layout.depth0, 1), mip_levels, 60 MAX2(testcase->array_size, 1), testcase->is_3d); 61 } 62 63 /* fdl lays out UBWC data before the color data, while all we have 64 * recorded in this testcase are the color offsets (other than the UBWC 65 * buffer sharing test). Shift the fdl layout down so we can compare 66 * color offsets. 67 */ 68 if (layout.ubwc && !testcase->layout.slices[0].offset) { 69 for (int l = 1; l < mip_levels; l++) 70 layout.slices[l].offset -= layout.slices[0].offset; 71 layout.slices[0].offset = 0; 72 } 73 74 for (int l = 0; l < mip_levels; l++) { 75 if (layout.slices[l].offset != testcase->layout.slices[l].offset) { 76 fprintf(stderr, "%s %dx%dx%d@%dx lvl%d: offset 0x%x != 0x%x\n", 77 util_format_short_name(testcase->format), layout.width0, 78 layout.height0, layout.depth0, layout.nr_samples, l, 79 layout.slices[l].offset, testcase->layout.slices[l].offset); 80 ok = false; 81 } 82 if (fdl_pitch(&layout, l) != testcase->layout.slices[l].pitch) { 83 fprintf(stderr, "%s %dx%dx%d@%dx lvl%d: pitch %d != %d\n", 84 util_format_short_name(testcase->format), layout.width0, 85 layout.height0, layout.depth0, layout.nr_samples, l, 86 fdl_pitch(&layout, l), testcase->layout.slices[l].pitch); 87 ok = false; 88 } 89 90 if (layout.ubwc_slices[l].offset != 91 testcase->layout.ubwc_slices[l].offset) { 92 fprintf(stderr, "%s %dx%dx%d@%dx lvl%d: UBWC offset 0x%x != 0x%x\n", 93 util_format_short_name(testcase->format), layout.width0, 94 layout.height0, layout.depth0, layout.nr_samples, l, 95 layout.ubwc_slices[l].offset, 96 testcase->layout.ubwc_slices[l].offset); 97 ok = false; 98 } 99 if (fdl_ubwc_pitch(&layout, l) != testcase->layout.ubwc_slices[l].pitch) { 100 fprintf(stderr, "%s %dx%dx%d@%dx lvl%d: UBWC pitch %d != %d\n", 101 util_format_short_name(testcase->format), layout.width0, 102 layout.height0, layout.depth0, layout.nr_samples, l, 103 fdl_ubwc_pitch(&layout, l), 104 testcase->layout.ubwc_slices[l].pitch); 105 ok = false; 106 } 107 } 108 109 if (!ok) 110 fprintf(stderr, "\n"); 111 112 return ok; 113} 114