void intel_renderbuffer_move_to_temp(struct brw_context *brw, struct intel_renderbuffer *irb, bool invalidate) { struct gl_renderbuffer *rb =&irb->Base.Base; struct intel_texture_image *intel_image = intel_texture_image(rb->TexImage); struct intel_mipmap_tree *new_mt; int width, height, depth; intel_miptree_get_dimensions_for_image(rb->TexImage, &width, &height, &depth); new_mt = intel_miptree_create(brw, rb->TexImage->TexObject->Target, intel_image->base.Base.TexFormat, intel_image->base.Base.Level, intel_image->base.Base.Level, width, height, depth, true, irb->mt->num_samples, INTEL_MIPTREE_TILING_ANY); if (brw_is_hiz_depth_format(brw, new_mt->format)) { intel_miptree_alloc_hiz(brw, new_mt); } intel_miptree_copy_teximage(brw, intel_image, new_mt, invalidate); intel_miptree_reference(&irb->mt, intel_image->mt); intel_renderbuffer_set_draw_offset(irb); intel_miptree_release(&new_mt); }
/** * Called via glRenderbufferStorageEXT() to set the format and allocate * storage for a user-created renderbuffer. */ GLboolean intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer *rb, GLenum internalFormat, GLuint width, GLuint height) { struct intel_context *intel = intel_context(ctx); struct intel_renderbuffer *irb = intel_renderbuffer(rb); ASSERT(rb->Name != 0); switch (internalFormat) { default: /* Use the same format-choice logic as for textures. * Renderbuffers aren't any different from textures for us, * except they're less useful because you can't texture with * them. */ rb->Format = intel->ctx.Driver.ChooseTextureFormat(ctx, internalFormat, GL_NONE, GL_NONE); break; case GL_STENCIL_INDEX: case GL_STENCIL_INDEX1_EXT: case GL_STENCIL_INDEX4_EXT: case GL_STENCIL_INDEX8_EXT: case GL_STENCIL_INDEX16_EXT: /* These aren't actual texture formats, so force them here. */ if (intel->has_separate_stencil) { rb->Format = MESA_FORMAT_S8; } else { assert(!intel->must_use_separate_stencil); rb->Format = MESA_FORMAT_S8_Z24; } break; } rb->Width = width; rb->Height = height; rb->_BaseFormat = _mesa_base_fbo_format(ctx, internalFormat); intel_miptree_release(&irb->mt); DBG("%s: %s: %s (%dx%d)\n", __FUNCTION__, _mesa_lookup_enum_by_nr(internalFormat), _mesa_get_format_name(rb->Format), width, height); irb->mt = intel_miptree_create_for_renderbuffer(intel, rb->Format, width, height); if (!irb->mt) return false; if (intel->vtbl.is_hiz_depth_format(intel, rb->Format)) { bool ok = intel_miptree_alloc_hiz(intel, irb->mt); if (!ok) { intel_miptree_release(&irb->mt); return false; } } return true; }
static bool intel_renderbuffer_update_wrapper(struct intel_context *intel, struct intel_renderbuffer *irb, struct gl_texture_image *image, uint32_t layer) { struct gl_renderbuffer *rb = &irb->Base.Base; struct intel_texture_image *intel_image = intel_texture_image(image); struct intel_mipmap_tree *mt = intel_image->mt; int level = image->Level; rb->Format = image->TexFormat; rb->InternalFormat = image->InternalFormat; rb->_BaseFormat = image->_BaseFormat; rb->NumSamples = mt->num_samples; if (mt->msaa_layout != INTEL_MSAA_LAYOUT_NONE) { assert(level == 0); rb->Width = mt->logical_width0; rb->Height = mt->logical_height0; } else { rb->Width = mt->level[level].width; rb->Height = mt->level[level].height; } rb->Delete = intel_delete_renderbuffer; rb->AllocStorage = intel_nop_alloc_storage; intel_miptree_check_level_layer(mt, level, layer); irb->mt_level = level; switch (mt->msaa_layout) { case INTEL_MSAA_LAYOUT_UMS: case INTEL_MSAA_LAYOUT_CMS: irb->mt_layer = layer * mt->num_samples; break; default: irb->mt_layer = layer; } intel_miptree_reference(&irb->mt, mt); intel_renderbuffer_set_draw_offset(irb); if (mt->hiz_mt == NULL && intel->vtbl.is_hiz_depth_format(intel, rb->Format)) { intel_miptree_alloc_hiz(intel, mt, 0 /* num_samples */); if (!mt->hiz_mt) return false; } return true; }
static bool intel_renderbuffer_update_wrapper(struct brw_context *brw, struct intel_renderbuffer *irb, struct gl_texture_image *image, uint32_t layer) { struct gl_renderbuffer *rb = &irb->Base.Base; struct intel_texture_image *intel_image = intel_texture_image(image); struct intel_mipmap_tree *mt = intel_image->mt; int level = image->Level; rb->Depth = image->Depth; rb->AllocStorage = intel_nop_alloc_storage; intel_miptree_check_level_layer(mt, level, layer); irb->mt_level = level; switch (mt->msaa_layout) { case INTEL_MSAA_LAYOUT_UMS: case INTEL_MSAA_LAYOUT_CMS: irb->mt_layer = layer * mt->num_samples; break; default: irb->mt_layer = layer; } intel_miptree_reference(&irb->mt, mt); intel_renderbuffer_set_draw_offset(irb); if (mt->hiz_mt == NULL && brw_is_hiz_depth_format(brw, rb->Format)) { intel_miptree_alloc_hiz(brw, mt); if (!mt->hiz_mt) return false; } return true; }
static bool intel_renderbuffer_update_wrapper(struct intel_context *intel, struct intel_renderbuffer *irb, struct gl_texture_image *image, uint32_t layer) { struct gl_renderbuffer *rb = &irb->Base.Base; struct intel_texture_image *intel_image = intel_texture_image(image); struct intel_mipmap_tree *mt = intel_image->mt; int level = image->Level; rb->Format = image->TexFormat; rb->InternalFormat = image->InternalFormat; rb->_BaseFormat = image->_BaseFormat; rb->Width = mt->level[level].width; rb->Height = mt->level[level].height; rb->Delete = intel_delete_renderbuffer; rb->AllocStorage = intel_nop_alloc_storage; intel_miptree_check_level_layer(mt, level, layer); irb->mt_level = level; irb->mt_layer = layer; intel_miptree_reference(&irb->mt, mt); intel_renderbuffer_set_draw_offset(irb); if (mt->hiz_mt == NULL && intel->vtbl.is_hiz_depth_format(intel, rb->Format)) { intel_miptree_alloc_hiz(intel, mt, 0 /* num_samples */); if (!mt->hiz_mt) return false; } return true; }