[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