intel_fbo.h revision 39d0e3632a4ccb10f2ce6578151e854ba52d3c0e
1/************************************************************************** 2 * 3 * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28#ifndef INTEL_FBO_H 29#define INTEL_FBO_H 30 31#include <stdbool.h> 32#include "main/formats.h" 33#include "intel_screen.h" 34 35struct intel_context; 36 37/** 38 * Intel renderbuffer, derived from gl_renderbuffer. 39 */ 40struct intel_renderbuffer 41{ 42 struct gl_renderbuffer Base; 43 struct intel_region *region; 44 45 /** Only used by depth renderbuffers for which HiZ is enabled. */ 46 struct intel_region *hiz_region; 47 48 /** 49 * \name Packed depth/stencil unwrappers 50 * 51 * If the intel_context is using separate stencil and this renderbuffer has 52 * a a packed depth/stencil format, then wrapped_depth and wrapped_stencil 53 * are the real renderbuffers. 54 */ 55 struct gl_renderbuffer *wrapped_depth; 56 struct gl_renderbuffer *wrapped_stencil; 57 58 /** \} */ 59 60 GLuint draw_offset; /**< Offset of drawing address within the region */ 61 GLuint draw_x, draw_y; /**< Offset of drawing within the region */ 62}; 63 64 65/** 66 * gl_renderbuffer is a base class which we subclass. The Class field 67 * is used for simple run-time type checking. 68 */ 69#define INTEL_RB_CLASS 0x12345678 70 71 72/** 73 * Return a gl_renderbuffer ptr casted to intel_renderbuffer. 74 * NULL will be returned if the rb isn't really an intel_renderbuffer. 75 * This is determined by checking the ClassID. 76 */ 77static INLINE struct intel_renderbuffer * 78intel_renderbuffer(struct gl_renderbuffer *rb) 79{ 80 struct intel_renderbuffer *irb = (struct intel_renderbuffer *) rb; 81 if (irb && irb->Base.ClassID == INTEL_RB_CLASS) { 82 /*_mesa_warning(NULL, "Returning non-intel Rb\n");*/ 83 return irb; 84 } 85 else 86 return NULL; 87} 88 89 90/** 91 * \brief Return the framebuffer attachment specified by attIndex. 92 * 93 * If the framebuffer lacks the specified attachment, then return null. 94 * 95 * If the attached renderbuffer is a wrapper, then return wrapped 96 * renderbuffer. 97 */ 98static INLINE struct intel_renderbuffer * 99intel_get_renderbuffer(struct gl_framebuffer *fb, gl_buffer_index attIndex) 100{ 101 struct gl_renderbuffer *rb; 102 struct intel_renderbuffer *irb; 103 104 /* XXX: Who passes -1 to intel_get_renderbuffer? */ 105 if (attIndex < 0) 106 return NULL; 107 108 rb = fb->Attachment[attIndex].Renderbuffer; 109 if (!rb) 110 return NULL; 111 112 irb = intel_renderbuffer(rb); 113 if (!irb) 114 return NULL; 115 116 switch (attIndex) { 117 case BUFFER_DEPTH: 118 if (irb->wrapped_depth) { 119 irb = intel_renderbuffer(irb->wrapped_depth); 120 } 121 break; 122 case BUFFER_STENCIL: 123 if (irb->wrapped_stencil) { 124 irb = intel_renderbuffer(irb->wrapped_stencil); 125 } 126 break; 127 default: 128 break; 129 } 130 131 return irb; 132} 133 134/** 135 * If the framebuffer has a depth buffer attached, then return its HiZ region. 136 * The HiZ region may be null. 137 */ 138static INLINE struct intel_region* 139intel_framebuffer_get_hiz_region(struct gl_framebuffer *fb) 140{ 141 struct intel_renderbuffer *rb = NULL; 142 if (fb) 143 rb = intel_get_renderbuffer(fb, BUFFER_DEPTH); 144 145 if (rb) 146 return rb->hiz_region; 147 else 148 return NULL; 149} 150 151static INLINE bool 152intel_framebuffer_has_hiz(struct gl_framebuffer *fb) 153{ 154 return intel_framebuffer_get_hiz_region(fb) != NULL; 155} 156 157 158extern void 159intel_renderbuffer_set_region(struct intel_context *intel, 160 struct intel_renderbuffer *irb, 161 struct intel_region *region); 162 163extern void 164intel_renderbuffer_set_hiz_region(struct intel_context *intel, 165 struct intel_renderbuffer *rb, 166 struct intel_region *region); 167 168 169extern struct intel_renderbuffer * 170intel_create_renderbuffer(gl_format format); 171 172 173extern void 174intel_fbo_init(struct intel_context *intel); 175 176 177extern void 178intel_flip_renderbuffers(struct gl_framebuffer *fb); 179 180uint32_t 181intel_renderbuffer_tile_offsets(struct intel_renderbuffer *irb, 182 uint32_t *tile_x, 183 uint32_t *tile_y); 184 185static INLINE struct intel_region * 186intel_get_rb_region(struct gl_framebuffer *fb, GLuint attIndex) 187{ 188 struct intel_renderbuffer *irb = intel_get_renderbuffer(fb, attIndex); 189 if (irb) 190 return irb->region; 191 else 192 return NULL; 193} 194 195#endif /* INTEL_FBO_H */ 196