[Mesa-dev] [PATCH 20/41] intel: Define struct intel_resolve_map
Chad Versace
chad.versace at linux.intel.com
Fri Nov 18 15:50:06 PST 2011
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 11/18/2011 03:27 PM, Eric Anholt wrote:
> 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.
Good point.
This is a habit from C++ coding, where the Doxygen typically goes in the class
definition. But this isn't C++, and your suggestion make sense here.
- ----
Chad Versace
chad.versace at linux.intel.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iQIcBAEBAgAGBQJOxu8sAAoJEAIvNt057x8iklwP/iVxVDIJaRs5kCynjaXhK6Cb
c48YLl2+VaPxkf6YmEZd7pQCsaZbsdYNoIJ7h9OKPDCMEfdWiJGWNasjeVJNWyFX
wu5cl8H1exrhW26d4zRePw4sVuuOB/14YzH8lBEebVOVOp5BfqbXjMbCkYFRksOt
5gFWCYTKBoBoGL/3YHOVb9FF4V1ERf4LaR7PswRK6c9qzTJcaEKcPd5CxoFiA2fv
gSOkCrmTskYOmPLCDzy9+L9z4qm60Q2MIly7ds1aNhxI2NhzO7P/l6syNNv3zBMD
GuPb6429Bi9dnEJav/T9uGc1aA8WNJczyUEkCw2DdwYi39uWervEZ9Xr452YmlYJ
69b91HtO80G584GH77+tvdgtXBHN9uBB9xdnHAwoAOSi/7pVmWZTEkiX4n34ZDq9
4731qEdWdWdu5/IWc7Pq6dsjDaY/IocX5f+mBqGLDFLKN0BVWxkv/VxZL9STvEyz
GwjMNoHO68/1rzfDJvjimhQPcLRdQW3TioST8Q4hu7qhVn17EKoNIvIk3NgdfaXu
+HA4LF6g3hR01cxnZ3K0J1XNNg0hmTlWixwqpEtTQ4YrfmEmUoqL5IDfuD+CZ13S
3Q/22f5ztvzvdLsFgufrT2XkPOOEXrIF4Xt9/xyAKsp7t8h/EcahoXPAnsTGhKQV
BHF9ULdk19/MalVN6EFB
=phFr
-----END PGP SIGNATURE-----
More information about the mesa-dev
mailing list