1e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse/*
2e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * Copyright (C) 2008 Nicolai Haehnle.
3e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse *
4e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * All Rights Reserved.
5e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse *
6e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * Permission is hereby granted, free of charge, to any person obtaining
7e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * a copy of this software and associated documentation files (the
8e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * "Software"), to deal in the Software without restriction, including
9e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * without limitation the rights to use, copy, modify, merge, publish,
10e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * distribute, sublicense, and/or sell copies of the Software, and to
11e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * permit persons to whom the Software is furnished to do so, subject to
12e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * the following conditions:
13e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse *
14e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * The above copyright notice and this permission notice (including the
15e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * next paragraph) shall be included in all copies or substantial
16e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * portions of the Software.
17e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse *
18e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse *
26e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse */
27e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
2833dc14c707734df37fb02b7bcc278ddeb94036f1Dave Airlie#ifndef __RADEON_MIPMAP_TREE_H_
2933dc14c707734df37fb02b7bcc278ddeb94036f1Dave Airlie#define __RADEON_MIPMAP_TREE_H_
30e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
3123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#include "radeon_common.h"
32e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
3333dc14c707734df37fb02b7bcc278ddeb94036f1Dave Airlietypedef struct _radeon_mipmap_tree radeon_mipmap_tree;
3433dc14c707734df37fb02b7bcc278ddeb94036f1Dave Airlietypedef struct _radeon_mipmap_level radeon_mipmap_level;
3533dc14c707734df37fb02b7bcc278ddeb94036f1Dave Airlietypedef struct _radeon_mipmap_image radeon_mipmap_image;
36e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
3733dc14c707734df37fb02b7bcc278ddeb94036f1Dave Airliestruct _radeon_mipmap_image {
38e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse	GLuint offset; /** Offset of this image from the start of mipmap tree buffer, in bytes */
39e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse};
40e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
4133dc14c707734df37fb02b7bcc278ddeb94036f1Dave Airliestruct _radeon_mipmap_level {
42e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse	GLuint width;
43e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse	GLuint height;
44e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse	GLuint depth;
45e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse	GLuint size; /** Size of each image, in bytes */
46e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse	GLuint rowstride; /** in bytes */
4763c00c53a3019b801c5eee8a12f7862422f79f10Maciej Cencora	GLuint valid;
4833dc14c707734df37fb02b7bcc278ddeb94036f1Dave Airlie	radeon_mipmap_image faces[6];
49e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse};
50e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
51d0fab94842b18dbd4027f5565804ca6884646240Dave Airlie/* store the max possible in the miptree */
52fd543e1f9506fe41e6e9e78aebbe0bca01df055cAlex Deucher#define RADEON_MIPTREE_MAX_TEXTURE_LEVELS 15
53e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
54e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse/**
55e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * A mipmap tree contains texture images in the layout that the hardware
56e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * expects.
57e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse *
58e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * The meta-data of mipmap trees is immutable, i.e. you cannot change the
59e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * layout on-the-fly; however, the texture contents (i.e. texels) can be
60e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse * changed.
61e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse */
6233dc14c707734df37fb02b7bcc278ddeb94036f1Dave Airliestruct _radeon_mipmap_tree {
63e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse	struct radeon_bo *bo;
64e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse	GLuint refcount;
65e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
66e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse	GLuint totalsize; /** total size of the miptree, in bytes */
67e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
68e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse	GLenum target; /** GL_TEXTURE_xxx */
6923ec7c457483aae1e0d399e9b570f1860c27c780Maciej Cencora	GLenum mesaFormat; /** MESA_FORMAT_xxx */
70e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse	GLuint faces; /** # of faces: 6 for cubemaps, 1 otherwise */
7123ec7c457483aae1e0d399e9b570f1860c27c780Maciej Cencora	GLuint baseLevel; /** gl_texture_object->baseLevel it was created for */
7223ec7c457483aae1e0d399e9b570f1860c27c780Maciej Cencora	GLuint numLevels; /** Number of mip levels stored in this mipmap tree */
73e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
7463c00c53a3019b801c5eee8a12f7862422f79f10Maciej Cencora	GLuint width0; /** Width of baseLevel image */
7563c00c53a3019b801c5eee8a12f7862422f79f10Maciej Cencora	GLuint height0; /** Height of baseLevel image */
7663c00c53a3019b801c5eee8a12f7862422f79f10Maciej Cencora	GLuint depth0; /** Depth of baseLevel image */
77e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
7833dc14c707734df37fb02b7bcc278ddeb94036f1Dave Airlie	GLuint tilebits; /** RADEON_TXO_xxx_TILE */
79e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
80d0fab94842b18dbd4027f5565804ca6884646240Dave Airlie	radeon_mipmap_level levels[RADEON_MIPTREE_MAX_TEXTURE_LEVELS];
81e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse};
82e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
837628b06ba32e42f57a4fdb322bc32e3b411c1f18Maciej Cencoravoid radeon_miptree_reference(radeon_mipmap_tree *mt, radeon_mipmap_tree **ptr);
847628b06ba32e42f57a4fdb322bc32e3b411c1f18Maciej Cencoravoid radeon_miptree_unreference(radeon_mipmap_tree **ptr);
85e5d5dab8c03f72097ec3e5b465fe93b6e369bb2dJerome Glisse
8633dc14c707734df37fb02b7bcc278ddeb94036f1Dave AirlieGLboolean radeon_miptree_matches_image(radeon_mipmap_tree *mt,
87b2596c36c8f73e8bb7a0b1679b491662aeb2f9d9Dave Airlie				       struct gl_texture_image *texImage);
88b2596c36c8f73e8bb7a0b1679b491662aeb2f9d9Dave Airlie
8923ec7c457483aae1e0d399e9b570f1860c27c780Maciej Cencoravoid radeon_try_alloc_miptree(radeonContextPtr rmesa, radeonTexObj *t);
900968512f8f4abc5bce84c200bd99f8a522d56122Dave AirlieGLuint radeon_miptree_image_offset(radeon_mipmap_tree *mt,
910968512f8f4abc5bce84c200bd99f8a522d56122Dave Airlie				   GLuint face, GLuint level);
9223ec7c457483aae1e0d399e9b570f1860c27c780Maciej Cencorauint32_t get_base_teximage_offset(radeonTexObj *texObj);
93b078a613bedb76242af177bee12520203bd63d50Maciej Cencora
94beb3e81b86698359e037d49f35feba3ca53626b2Dave Airlieunsigned get_texture_image_row_stride(radeonContextPtr rmesa, gl_format format, unsigned width, unsigned tiling, unsigned target);
95b078a613bedb76242af177bee12520203bd63d50Maciej Cencora
960d3835475fcb803a295dc738d90b83788bdc9472Maciej Cencoraunsigned get_texture_image_size(
970d3835475fcb803a295dc738d90b83788bdc9472Maciej Cencora		gl_format format,
980d3835475fcb803a295dc738d90b83788bdc9472Maciej Cencora		unsigned rowStride,
990d3835475fcb803a295dc738d90b83788bdc9472Maciej Cencora		unsigned height,
1000d3835475fcb803a295dc738d90b83788bdc9472Maciej Cencora		unsigned depth,
1010d3835475fcb803a295dc738d90b83788bdc9472Maciej Cencora		unsigned tiling);
102b2596c36c8f73e8bb7a0b1679b491662aeb2f9d9Dave Airlie
103b2596c36c8f73e8bb7a0b1679b491662aeb2f9d9Dave Airlieradeon_mipmap_tree *radeon_miptree_create(radeonContextPtr rmesa,
104b2596c36c8f73e8bb7a0b1679b491662aeb2f9d9Dave Airlie					  GLenum target, gl_format mesaFormat, GLuint baseLevel, GLuint numLevels,
105b2596c36c8f73e8bb7a0b1679b491662aeb2f9d9Dave Airlie					  GLuint width0, GLuint height0, GLuint depth0, GLuint tilebits);
10633dc14c707734df37fb02b7bcc278ddeb94036f1Dave Airlie#endif /* __RADEON_MIPMAP_TREE_H_ */
107