From 5ddf7ad9d2098d21e1346b8ceb2756901ae1b0c1 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 18 Feb 2020 12:07:47 -0500 Subject: [PATCH] panfrost: Move checksum routines to root panfrost These are Gallium-independent and clean code; as is tradition, let's hoist them up out of the Gallium driver as a bit of yak shaving as we prepare to untangle the monster that is pan_resource.c Signed-off-by: Alyssa Rosenzweig Reviewed-by: Boris Brezillon Part-of: --- src/gallium/drivers/panfrost/pan_resource.c | 25 +-------- src/gallium/drivers/panfrost/pan_resource.h | 19 +------ src/panfrost/Makefile.sources | 1 + src/panfrost/encoder/meson.build | 1 + src/panfrost/encoder/pan_encoder.h | 2 + src/panfrost/encoder/pan_texture.c | 54 +++++++++++++++++++ src/panfrost/encoder/pan_texture.h | 57 +++++++++++++++++++++ 7 files changed, 117 insertions(+), 42 deletions(-) create mode 100644 src/panfrost/encoder/pan_texture.c create mode 100644 src/panfrost/encoder/pan_texture.h diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index 483450af9f8..5c90a5e9b4c 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -235,29 +235,6 @@ panfrost_create_scanout_res(struct pipe_screen *screen, return res; } -/* Computes sizes for checksumming, which is 8 bytes per 16x16 tile */ - -#define CHECKSUM_TILE_WIDTH 16 -#define CHECKSUM_TILE_HEIGHT 16 -#define CHECKSUM_BYTES_PER_TILE 8 - -static unsigned -panfrost_compute_checksum_sizes( - struct panfrost_slice *slice, - unsigned width, - unsigned height) -{ - unsigned aligned_width = ALIGN_POT(width, CHECKSUM_TILE_WIDTH); - unsigned aligned_height = ALIGN_POT(height, CHECKSUM_TILE_HEIGHT); - - unsigned tile_count_x = aligned_width / CHECKSUM_TILE_WIDTH; - unsigned tile_count_y = aligned_height / CHECKSUM_TILE_HEIGHT; - - slice->checksum_stride = tile_count_x * CHECKSUM_BYTES_PER_TILE; - - return slice->checksum_stride * tile_count_y; -} - /* Setup the mip tree given a particular layout, possibly with checksumming */ static void @@ -349,7 +326,7 @@ panfrost_setup_slices(struct panfrost_resource *pres, size_t *bo_size) if (pres->checksummed) { slice->checksum_offset = offset; - unsigned size = panfrost_compute_checksum_sizes( + unsigned size = panfrost_compute_checksum_size( slice, width, height); offset += size; diff --git a/src/gallium/drivers/panfrost/pan_resource.h b/src/gallium/drivers/panfrost/pan_resource.h index f3ba339add7..2af06208f2c 100644 --- a/src/gallium/drivers/panfrost/pan_resource.h +++ b/src/gallium/drivers/panfrost/pan_resource.h @@ -29,27 +29,10 @@ #include #include "pan_screen.h" #include "pan_allocate.h" +#include "pan_texture.h" #include "drm-uapi/drm.h" #include "util/u_range.h" -struct panfrost_slice { - unsigned offset; - unsigned stride; - unsigned size0; - - /* If there is a header preceding each slice, how big is - * that header? Used for AFBC */ - unsigned header_size; - - /* If checksumming is enabled following the slice, what - * is its offset/stride? */ - unsigned checksum_offset; - unsigned checksum_stride; - - /* Has anything been written to this slice? */ - bool initialized; -}; - struct panfrost_resource { struct pipe_resource base; struct { diff --git a/src/panfrost/Makefile.sources b/src/panfrost/Makefile.sources index ea61d42b240..b7314645c1c 100644 --- a/src/panfrost/Makefile.sources +++ b/src/panfrost/Makefile.sources @@ -21,6 +21,7 @@ encoder_FILES := \ encoder/pan_props.c \ encoder/pan_sampler.c \ encoder/pan_tiler.c \ + encoder/pan_texture.c \ encoder/pan_scratch.c midgard_FILES := \ diff --git a/src/panfrost/encoder/meson.build b/src/panfrost/encoder/meson.build index e203e911de8..d1335ab8f02 100644 --- a/src/panfrost/encoder/meson.build +++ b/src/panfrost/encoder/meson.build @@ -26,6 +26,7 @@ libpanfrost_encoder_files = files( 'pan_invocation.c', 'pan_sampler.c', 'pan_tiler.c', + 'pan_texture.c', 'pan_scratch.c', 'pan_props.c', ) diff --git a/src/panfrost/encoder/pan_encoder.h b/src/panfrost/encoder/pan_encoder.h index 2f3ab0d10a9..42ec8320acb 100644 --- a/src/panfrost/encoder/pan_encoder.h +++ b/src/panfrost/encoder/pan_encoder.h @@ -107,4 +107,6 @@ void panfrost_instance_id(unsigned padded_count, union mali_attr *attr); enum mali_func panfrost_flip_compare_func(enum mali_func f); + + #endif diff --git a/src/panfrost/encoder/pan_texture.c b/src/panfrost/encoder/pan_texture.c new file mode 100644 index 00000000000..8e4b00e9055 --- /dev/null +++ b/src/panfrost/encoder/pan_texture.c @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2008 VMware, Inc. + * Copyright (C) 2014 Broadcom + * Copyright (C) 2018-2019 Alyssa Rosenzweig + * Copyright (C) 2019-2020 Collabora, Ltd. + * + * 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 "util/macros.h" +#include "pan_texture.h" + +/* Computes sizes for checksumming, which is 8 bytes per 16x16 tile. + * Checksumming is believed to be a CRC variant (CRC64 based on the size?). + * This feature is also known as "transaction elimination". */ + +#define CHECKSUM_TILE_WIDTH 16 +#define CHECKSUM_TILE_HEIGHT 16 +#define CHECKSUM_BYTES_PER_TILE 8 + +unsigned +panfrost_compute_checksum_size( + struct panfrost_slice *slice, + unsigned width, + unsigned height) +{ + unsigned aligned_width = ALIGN_POT(width, CHECKSUM_TILE_WIDTH); + unsigned aligned_height = ALIGN_POT(height, CHECKSUM_TILE_HEIGHT); + + unsigned tile_count_x = aligned_width / CHECKSUM_TILE_WIDTH; + unsigned tile_count_y = aligned_height / CHECKSUM_TILE_HEIGHT; + + slice->checksum_stride = tile_count_x * CHECKSUM_BYTES_PER_TILE; + + return slice->checksum_stride * tile_count_y; +} diff --git a/src/panfrost/encoder/pan_texture.h b/src/panfrost/encoder/pan_texture.h new file mode 100644 index 00000000000..54b2e39122e --- /dev/null +++ b/src/panfrost/encoder/pan_texture.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2008 VMware, Inc. + * Copyright (C) 2014 Broadcom + * Copyright (C) 2018-2019 Alyssa Rosenzweig + * Copyright (C) 2019-2020 Collabora, Ltd. + * + * 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. + * + */ + +#ifndef __PAN_TEXTURE_H +#define __PAN_TEXTURE_H + +#include + +struct panfrost_slice { + unsigned offset; + unsigned stride; + unsigned size0; + + /* If there is a header preceding each slice, how big is + * that header? Used for AFBC */ + unsigned header_size; + + /* If checksumming is enabled following the slice, what + * is its offset/stride? */ + unsigned checksum_offset; + unsigned checksum_stride; + + /* Has anything been written to this slice? */ + bool initialized; +}; + +unsigned +panfrost_compute_checksum_size( + struct panfrost_slice *slice, + unsigned width, + unsigned height); + +#endif -- 2.30.2