From 43acc10bd087ae1f8feacaa1814fc6921995aad2 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Thu, 5 Nov 2020 09:58:21 +0200 Subject: [PATCH] intel/common: store sample position in plain arrays Allows to extract the values in different ways than just the genxml format. v2 (Jason Ekstrand): - Add a struct gen_sample_location so that we can re-use the array macros from the earlier commit. Signed-off-by: Lionel Landwerlin Reviewed-by: Jason Ekstrand Part-of: --- src/intel/Makefile.sources | 1 + src/intel/common/gen_sample_positions.c | 130 ++++++++++++++++++++++++++ src/intel/common/gen_sample_positions.h | 161 +++++++------------------------- src/intel/common/meson.build | 1 + 4 files changed, 167 insertions(+), 126 deletions(-) create mode 100644 src/intel/common/gen_sample_positions.c diff --git a/src/intel/Makefile.sources b/src/intel/Makefile.sources index df0de75..752abec 100644 --- a/src/intel/Makefile.sources +++ b/src/intel/Makefile.sources @@ -24,6 +24,7 @@ COMMON_FILES = \ common/gen_l3_config.c \ common/gen_l3_config.h \ common/gen_urb_config.c \ + common/gen_sample_positions.c \ common/gen_sample_positions.h \ common/gen_uuid.c \ common/gen_uuid.h diff --git a/src/intel/common/gen_sample_positions.c b/src/intel/common/gen_sample_positions.c new file mode 100644 index 0000000..043c8db --- /dev/null +++ b/src/intel/common/gen_sample_positions.c @@ -0,0 +1,130 @@ +/* + * Copyright © 2020 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "gen_sample_positions.h" + +/** + * 1x MSAA has a single sample at the center: (0.5, 0.5) -> (0x8, 0x8). + */ +const struct gen_sample_position gen_sample_positions_1x[] = { + { 0.5, 0.5, }, +}; + +/** + * 2x MSAA sample positions are (0.25, 0.25) and (0.75, 0.75): + * 4 c + * 4 0 + * c 1 + */ +const struct gen_sample_position gen_sample_positions_2x[] = { + { 0.75, 0.75 }, + { 0.25, 0.25 }, +}; + +/** + * Sample positions: + * 2 6 a e + * 2 0 + * 6 1 + * a 2 + * e 3 + */ +const struct gen_sample_position gen_sample_positions_4x[] = { + { 0.375, 0.125 }, + { 0.875, 0.375 }, + { 0.125, 0.625 }, + { 0.625, 0.875 }, +}; + +/** + * Sample positions: + * + * From the Ivy Bridge PRM, Vol2 Part1 p304 (3DSTATE_MULTISAMPLE: + * Programming Notes): + * "When programming the sample offsets (for NUMSAMPLES_4 or _8 and + * MSRASTMODE_xxx_PATTERN), the order of the samples 0 to 3 (or 7 + * for 8X) must have monotonically increasing distance from the + * pixel center. This is required to get the correct centroid + * computation in the device." + * + * Sample positions: + * 1 3 5 7 9 b d f + * 1 7 + * 3 3 + * 5 0 + * 7 5 + * 9 2 + * b 1 + * d 4 + * f 6 + */ +const struct gen_sample_position gen_sample_positions_8x[] = { + { 0.5625, 0.3125 }, + { 0.4375, 0.6875 }, + { 0.8125, 0.5625 }, + { 0.3125, 0.1875 }, + { 0.1875, 0.8125 }, + { 0.0625, 0.4375 }, + { 0.6875, 0.9375 }, + { 0.9375, 0.0625 }, +}; + +/** + * Sample positions: + * + * 0 1 2 3 4 5 6 7 8 9 a b c d e f + * 0 15 + * 1 9 + * 2 10 + * 3 7 + * 4 13 + * 5 1 + * 6 4 + * 7 3 + * 8 12 + * 9 0 + * a 2 + * b 6 + * c 11 + * d 5 + * e 8 + * f 14 + */ +const struct gen_sample_position gen_sample_positions_16x[] = { + { 0.5625, 0.5625 }, + { 0.4375, 0.3125 }, + { 0.3125, 0.6250 }, + { 0.7500, 0.4375 }, + { 0.1875, 0.3750 }, + { 0.6250, 0.8125 }, + { 0.8125, 0.6875 }, + { 0.6875, 0.1875 }, + { 0.3750, 0.8750 }, + { 0.5000, 0.0625 }, + { 0.2500, 0.1250 }, + { 0.1250, 0.7500 }, + { 0.0000, 0.5000 }, + { 0.9375, 0.2500 }, + { 0.8750, 0.9375 }, + { 0.0625, 0.0000 }, +}; diff --git a/src/intel/common/gen_sample_positions.h b/src/intel/common/gen_sample_positions.h index d4149fc..ea7f4f8 100644 --- a/src/intel/common/gen_sample_positions.h +++ b/src/intel/common/gen_sample_positions.h @@ -23,11 +23,37 @@ #ifndef GEN_SAMPLE_POSITIONS_H #define GEN_SAMPLE_POSITIONS_H +#include + /* * This file defines the standard multisample positions used by both GL and * Vulkan. These correspond to the Vulkan "standard sample locations". */ +struct gen_sample_position { + float x; + float y; +}; + +extern const struct gen_sample_position gen_sample_positions_1x[]; +extern const struct gen_sample_position gen_sample_positions_2x[]; +extern const struct gen_sample_position gen_sample_positions_4x[]; +extern const struct gen_sample_position gen_sample_positions_8x[]; +extern const struct gen_sample_position gen_sample_positions_16x[]; + +static inline const struct gen_sample_position * +gen_get_sample_positions(int samples) +{ + switch (samples) { + case 1: return gen_sample_positions_1x; + case 2: return gen_sample_positions_2x; + case 4: return gen_sample_positions_4x; + case 8: return gen_sample_positions_8x; + case 16: return gen_sample_positions_16x; + default: unreachable("Invalid sample count"); + } +} + /* Examples: * in case of GEN_GEN < 8: * GEN_SAMPLE_POS_ELEM(ms.Sample, info->pSampleLocations, 0); expands to: @@ -85,136 +111,19 @@ prefix##sample_idx##YOffset = arr[sample_idx].y; GEN_SAMPLE_POS_ELEM(prefix, arr, 14); \ GEN_SAMPLE_POS_ELEM(prefix, arr, 15); -/** - * 1x MSAA has a single sample at the center: (0.5, 0.5) -> (0x8, 0x8). - */ #define GEN_SAMPLE_POS_1X(prefix) \ -prefix##0XOffset = 0.5; \ -prefix##0YOffset = 0.5; - -/** - * 2x MSAA sample positions are (0.25, 0.25) and (0.75, 0.75): - * 4 c - * 4 0 - * c 1 - */ + GEN_SAMPLE_POS_1X_ARRAY(prefix, gen_sample_positions_1x) + #define GEN_SAMPLE_POS_2X(prefix) \ -prefix##0XOffset = 0.75; \ -prefix##0YOffset = 0.75; \ -prefix##1XOffset = 0.25; \ -prefix##1YOffset = 0.25; - -/** - * Sample positions: - * 2 6 a e - * 2 0 - * 6 1 - * a 2 - * e 3 - */ + GEN_SAMPLE_POS_2X_ARRAY(prefix, gen_sample_positions_2x) + #define GEN_SAMPLE_POS_4X(prefix) \ -prefix##0XOffset = 0.375; \ -prefix##0YOffset = 0.125; \ -prefix##1XOffset = 0.875; \ -prefix##1YOffset = 0.375; \ -prefix##2XOffset = 0.125; \ -prefix##2YOffset = 0.625; \ -prefix##3XOffset = 0.625; \ -prefix##3YOffset = 0.875; - -/** - * Sample positions: - * - * From the Ivy Bridge PRM, Vol2 Part1 p304 (3DSTATE_MULTISAMPLE: - * Programming Notes): - * "When programming the sample offsets (for NUMSAMPLES_4 or _8 and - * MSRASTMODE_xxx_PATTERN), the order of the samples 0 to 3 (or 7 - * for 8X) must have monotonically increasing distance from the - * pixel center. This is required to get the correct centroid - * computation in the device." - * - * Sample positions: - * 1 3 5 7 9 b d f - * 1 7 - * 3 3 - * 5 0 - * 7 5 - * 9 2 - * b 1 - * d 4 - * f 6 - */ + GEN_SAMPLE_POS_4X_ARRAY(prefix, gen_sample_positions_4x) + #define GEN_SAMPLE_POS_8X(prefix) \ -prefix##0XOffset = 0.5625; \ -prefix##0YOffset = 0.3125; \ -prefix##1XOffset = 0.4375; \ -prefix##1YOffset = 0.6875; \ -prefix##2XOffset = 0.8125; \ -prefix##2YOffset = 0.5625; \ -prefix##3XOffset = 0.3125; \ -prefix##3YOffset = 0.1875; \ -prefix##4XOffset = 0.1875; \ -prefix##4YOffset = 0.8125; \ -prefix##5XOffset = 0.0625; \ -prefix##5YOffset = 0.4375; \ -prefix##6XOffset = 0.6875; \ -prefix##6YOffset = 0.9375; \ -prefix##7XOffset = 0.9375; \ -prefix##7YOffset = 0.0625; - -/** - * Sample positions: - * - * 0 1 2 3 4 5 6 7 8 9 a b c d e f - * 0 15 - * 1 9 - * 2 10 - * 3 7 - * 4 13 - * 5 1 - * 6 4 - * 7 3 - * 8 12 - * 9 0 - * a 2 - * b 6 - * c 11 - * d 5 - * e 8 - * f 14 - */ + GEN_SAMPLE_POS_8X_ARRAY(prefix, gen_sample_positions_8x) + #define GEN_SAMPLE_POS_16X(prefix) \ -prefix##0XOffset = 0.5625; \ -prefix##0YOffset = 0.5625; \ -prefix##1XOffset = 0.4375; \ -prefix##1YOffset = 0.3125; \ -prefix##2XOffset = 0.3125; \ -prefix##2YOffset = 0.6250; \ -prefix##3XOffset = 0.7500; \ -prefix##3YOffset = 0.4375; \ -prefix##4XOffset = 0.1875; \ -prefix##4YOffset = 0.3750; \ -prefix##5XOffset = 0.6250; \ -prefix##5YOffset = 0.8125; \ -prefix##6XOffset = 0.8125; \ -prefix##6YOffset = 0.6875; \ -prefix##7XOffset = 0.6875; \ -prefix##7YOffset = 0.1875; \ -prefix##8XOffset = 0.3750; \ -prefix##8YOffset = 0.8750; \ -prefix##9XOffset = 0.5000; \ -prefix##9YOffset = 0.0625; \ -prefix##10XOffset = 0.2500; \ -prefix##10YOffset = 0.1250; \ -prefix##11XOffset = 0.1250; \ -prefix##11YOffset = 0.7500; \ -prefix##12XOffset = 0.0000; \ -prefix##12YOffset = 0.5000; \ -prefix##13XOffset = 0.9375; \ -prefix##13YOffset = 0.2500; \ -prefix##14XOffset = 0.8750; \ -prefix##14YOffset = 0.9375; \ -prefix##15XOffset = 0.0625; \ -prefix##15YOffset = 0.0000; + GEN_SAMPLE_POS_16X_ARRAY(prefix, gen_sample_positions_16x) #endif /* GEN_SAMPLE_POSITIONS_H */ diff --git a/src/intel/common/meson.build b/src/intel/common/meson.build index 4d08a62..f4ebe49 100644 --- a/src/intel/common/meson.build +++ b/src/intel/common/meson.build @@ -36,6 +36,7 @@ files_libintel_common = files( 'gen_l3_config.c', 'gen_l3_config.h', 'gen_urb_config.c', + 'gen_sample_positions.c', 'gen_sample_positions.h', 'gen_uuid.c', 'gen_uuid.h', -- 2.7.4