[Mesa-dev] [PATCH 20/41] intel: Define struct intel_resolve_map
Eric Anholt
eric at anholt.net
Fri Nov 18 15:27:51 PST 2011
On Thu, 17 Nov 2011 19:58:47 -0800, Chad Versace <chad.versace at linux.intel.com> wrote:
> This is a map of miptree slices to needed resolves, implemented as
> a linked list. A future commit will embed such a list in
> intel_mipmap_tree.
>
> If you think I'm crazy to put a list in a miptree, read the Doxygen in
> this patch for intel_resolve_map.
>
> Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
> ---
> src/mesa/drivers/dri/i965/Makefile.sources | 1 +
> src/mesa/drivers/dri/i965/intel_resolve_map.c | 1 +
> src/mesa/drivers/dri/intel/intel_resolve_map.c | 95 +++++++++++++++++++++++
> src/mesa/drivers/dri/intel/intel_resolve_map.h | 99 ++++++++++++++++++++++++
> 4 files changed, 196 insertions(+), 0 deletions(-)
> create mode 120000 src/mesa/drivers/dri/i965/intel_resolve_map.c
> create mode 100644 src/mesa/drivers/dri/intel/intel_resolve_map.c
> create mode 100644 src/mesa/drivers/dri/intel/intel_resolve_map.h
>
> diff --git a/src/mesa/drivers/dri/i965/Makefile.sources b/src/mesa/drivers/dri/i965/Makefile.sources
> index 1b9ca6f..cd6a8f4 100644
> --- a/src/mesa/drivers/dri/i965/Makefile.sources
> +++ b/src/mesa/drivers/dri/i965/Makefile.sources
> @@ -15,6 +15,7 @@ i965_C_SOURCES := \
> intel_fbo.c \
> intel_mipmap_tree.c \
> intel_regions.c \
> + intel_resolve_map.c \
> intel_screen.c \
> intel_span.c \
> intel_pixel.c \
> diff --git a/src/mesa/drivers/dri/i965/intel_resolve_map.c b/src/mesa/drivers/dri/i965/intel_resolve_map.c
> new file mode 120000
> index 0000000..77e50fb
> --- /dev/null
> +++ b/src/mesa/drivers/dri/i965/intel_resolve_map.c
> @@ -0,0 +1 @@
> +../intel/intel_resolve_map.c
> \ No newline at end of file
> diff --git a/src/mesa/drivers/dri/intel/intel_resolve_map.c b/src/mesa/drivers/dri/intel/intel_resolve_map.c
> new file mode 100644
> index 0000000..d2af262
> --- /dev/null
> +++ b/src/mesa/drivers/dri/intel/intel_resolve_map.c
> @@ -0,0 +1,95 @@
> +/*
> + * Copyright © 2011 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 "intel_resolve_map.h"
> +
> +#include <assert.h>
> +#include <stdlib.h>
> +
> +void
> +intel_resolve_map_set(struct intel_resolve_map *head,
> + uint32_t level,
> + uint32_t layer,
> + enum intel_need_resolve need)
> +{
> + struct intel_resolve_map **tail = &head->next;
> + struct intel_resolve_map *prev = head;
> +
> + while (*tail) {
> + if ((*tail)->level == level && (*tail)->layer == layer) {
> + assert((*tail)->need == need);
> + return;
> + }
> + prev = *tail;
> + tail = &(*tail)->next;
> + }
> +
> + *tail = malloc(sizeof(**tail));
> + (*tail)->prev = prev;
> + (*tail)->next = NULL;
> + (*tail)->level = level;
> + (*tail)->layer = layer;
> + (*tail)->need = need;
> +}
> +
> +struct intel_resolve_map*
> +intel_resolve_map_get(struct intel_resolve_map *head,
> + uint32_t level,
> + uint32_t layer)
> +{
> + struct intel_resolve_map *item = head->next;
> +
> + while (item) {
> + if (item->level == level && item->layer == layer)
> + break;
> + else
> + item = item->next;
> + }
> +
> + return item;
> +}
> +
> +void
> +intel_resolve_map_remove(struct intel_resolve_map *elem)
> +{
> + if (elem->prev)
> + elem->prev->next = elem->next;
> + if (elem->next)
> + elem->next->prev = elem->prev;
> + free(elem);
> +}
> +
> +void
> +intel_resolve_map_clear(struct intel_resolve_map *head)
> +{
> + struct intel_resolve_map *next = head->next;
> + struct intel_resolve_map *trash;
> +
> + while (next) {
> + trash = next;
> + next = next->next;
> + free(trash);
> + }
> +
> + head->next = NULL;
> +}
> diff --git a/src/mesa/drivers/dri/intel/intel_resolve_map.h b/src/mesa/drivers/dri/intel/intel_resolve_map.h
> new file mode 100644
> index 0000000..d665ecb
> --- /dev/null
> +++ b/src/mesa/drivers/dri/intel/intel_resolve_map.h
> @@ -0,0 +1,99 @@
> +/*
> + * Copyright © 2011 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.
> + */
> +
> +#pragma once
> +
> +#include <stdint.h>
> +
> +enum intel_need_resolve {
> + INTEL_NEED_HIZ_RESOLVE,
> + INTEL_NEED_DEPTH_RESOLVE,
> +};
> +
> +/**
> + * \brief Map of miptree slices to needed resolves.
> + *
> + * The map is implemented as a linear doubly-linked list.
> + *
> + * In the intel_resolve_map*() functions, the \c head argument is not
> + * inspected for its data. It only serves as an anchor for the list.
> + *
> + * \par Design Discussion
> + *
> + * There are two possible ways to record which miptree slices need
> + * resolves. 1) Maintain a flag for every miptree slice in the texture,
> + * likely in intel_mipmap_level::slice, or 2) maintain a list of only
> + * those slices that need a resolve.
> + *
> + * Immediately before drawing, a full depth resolve performed on each
> + * enabled depth texture. If design 1 were chosen, then at each draw call
> + * it would be necessary to iterate over each miptree slice of each
> + * enabled depth texture in order to query if each slice needed a resolve.
> + * In the worst case, this would require 2^16 iterations: 16 texture
> + * units, 16 miplevels, and 256 depth layers (assuming maximums for OpenGL
> + * 2.1).
> + *
> + * By choosing design 2, the number of iterations is exactly the minimum
> + * necessary.
> + */
> +struct intel_resolve_map {
> + uint32_t level;
> + uint32_t layer;
> + enum intel_need_resolve need;
> +
> + struct intel_resolve_map *next;
> + struct intel_resolve_map *prev;
> +};
> +
> +/**
> + * \brief Set that the miptree slice at (level, layer) needs a resolve.
> + *
> + * \pre If a map element already exists with the given key, then
> + * the new and existing element value must be identical.
> + */
> +void
> +intel_resolve_map_set(struct intel_resolve_map *head,
> + uint32_t level,
> + uint32_t layer,
> + enum intel_need_resolve need);
> +
> +/**
> + * \brief Get an element from the map.
> + * \return null if element is not contained in map.
> + */
> +struct intel_resolve_map*
> +intel_resolve_map_get(struct intel_resolve_map *head,
> + uint32_t level,
> + uint32_t layer);
> +
> +/**
> + * \brief Remove and free an element from the map.
> + */
> +void
> +intel_resolve_map_remove(struct intel_resolve_map *elem);
> +
> +/**
> + * \brief Remove and free all elements of the map.
> + */
> +void
> +intel_resolve_map_clear(struct intel_resolve_map *head);
Let's keep doxygen for functions at the functions themselves, or they'll
diverge from the code. You're much more likely to be reading the code
than the prototypes, anyway.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20111118/64badced/attachment-0001.pgp>
More information about the mesa-dev
mailing list