static void intel_update_image_buffer(struct brw_context *intel, __DRIdrawable *drawable, struct intel_renderbuffer *rb, __DRIimage *buffer, enum __DRIimageBufferMask buffer_type) { struct intel_region *region = buffer->region; struct gl_framebuffer *fb = drawable->driverPrivate; if (!rb || !region) return; unsigned num_samples = rb->Base.Base.NumSamples; /* Check and see if we're already bound to the right * buffer object */ if (num_samples == 0) { if (rb->mt && rb->mt->region && rb->mt->region->bo == region->bo) return; } else { if (rb->singlesample_mt && rb->singlesample_mt->region && rb->singlesample_mt->region->bo == region->bo) return; } intel_update_winsys_renderbuffer_miptree(intel, rb, region); if (brw_is_front_buffer_drawing(fb) && buffer_type == __DRI_IMAGE_BUFFER_FRONT && rb->Base.Base.NumSamples > 1) { intel_renderbuffer_upsample(intel, rb); } }
static void intel_update_image_buffer(struct brw_context *intel, __DRIdrawable *drawable, struct intel_renderbuffer *rb, __DRIimage *buffer, enum __DRIimageBufferMask buffer_type) { struct gl_framebuffer *fb = drawable->driverPrivate; if (!rb || !buffer->bo) return; unsigned num_samples = rb->Base.Base.NumSamples; /* Check and see if we're already bound to the right * buffer object */ struct intel_mipmap_tree *last_mt; if (num_samples == 0) last_mt = rb->mt; else last_mt = rb->singlesample_mt; if (last_mt && last_mt->bo == buffer->bo) return; intel_update_winsys_renderbuffer_miptree(intel, rb, buffer->bo, buffer->width, buffer->height, buffer->pitch); if (brw_is_front_buffer_drawing(fb) && buffer_type == __DRI_IMAGE_BUFFER_FRONT && rb->Base.Base.NumSamples > 1) { intel_renderbuffer_upsample(intel, rb); } }
/** * \brief Assign a DRI buffer's DRM region to a renderbuffer. * * This is called from intel_update_renderbuffers(). * * \par Note: * DRI buffers whose attachment point is DRI2BufferStencil or * DRI2BufferDepthStencil are handled as special cases. * * \param buffer_name is a human readable name, such as "dri2 front buffer", * that is passed to drm_intel_bo_gem_create_from_name(). * * \see intel_update_renderbuffers() */ static void intel_process_dri2_buffer(struct brw_context *brw, __DRIdrawable *drawable, __DRIbuffer *buffer, struct intel_renderbuffer *rb, const char *buffer_name) { struct gl_framebuffer *fb = drawable->driverPrivate; drm_intel_bo *bo; if (!rb) return; unsigned num_samples = rb->Base.Base.NumSamples; /* We try to avoid closing and reopening the same BO name, because the first * use of a mapping of the buffer involves a bunch of page faulting which is * moderately expensive. */ struct intel_mipmap_tree *last_mt; if (num_samples == 0) last_mt = rb->mt; else last_mt = rb->singlesample_mt; uint32_t old_name = 0; if (last_mt) { /* The bo already has a name because the miptree was created by a * previous call to intel_process_dri2_buffer(). If a bo already has a * name, then drm_intel_bo_flink() is a low-cost getter. It does not * create a new name. */ drm_intel_bo_flink(last_mt->bo, &old_name); } if (old_name == buffer->name) return; if (unlikely(INTEL_DEBUG & DEBUG_DRI)) { fprintf(stderr, "attaching buffer %d, at %d, cpp %d, pitch %d\n", buffer->name, buffer->attachment, buffer->cpp, buffer->pitch); } intel_miptree_release(&rb->mt); bo = drm_intel_bo_gem_create_from_name(brw->bufmgr, buffer_name, buffer->name); if (!bo) { fprintf(stderr, "Failed to open BO for returned DRI2 buffer " "(%dx%d, %s, named %d).\n" "This is likely a bug in the X Server that will lead to a " "crash soon.\n", drawable->w, drawable->h, buffer_name, buffer->name); return; } intel_update_winsys_renderbuffer_miptree(brw, rb, bo, drawable->w, drawable->h, buffer->pitch); if (brw_is_front_buffer_drawing(fb) && (buffer->attachment == __DRI_BUFFER_FRONT_LEFT || buffer->attachment == __DRI_BUFFER_FAKE_FRONT_LEFT) && rb->Base.Base.NumSamples > 1) { intel_renderbuffer_upsample(brw, rb); } assert(rb->mt); drm_intel_bo_unreference(bo); }
/** * \brief Assign a DRI buffer's DRM region to a renderbuffer. * * This is called from intel_update_renderbuffers(). * * \par Note: * DRI buffers whose attachment point is DRI2BufferStencil or * DRI2BufferDepthStencil are handled as special cases. * * \param buffer_name is a human readable name, such as "dri2 front buffer", * that is passed to intel_region_alloc_for_handle(). * * \see intel_update_renderbuffers() * \see intel_region_alloc_for_handle() */ static void intel_process_dri2_buffer(struct brw_context *brw, __DRIdrawable *drawable, __DRIbuffer *buffer, struct intel_renderbuffer *rb, const char *buffer_name) { struct intel_region *region = NULL; struct gl_framebuffer *fb = drawable->driverPrivate; if (!rb) return; unsigned num_samples = rb->Base.Base.NumSamples; /* We try to avoid closing and reopening the same BO name, because the first * use of a mapping of the buffer involves a bunch of page faulting which is * moderately expensive. */ if (num_samples == 0) { if (rb->mt && rb->mt->region && rb->mt->region->name == buffer->name) return; } else { if (rb->singlesample_mt && rb->singlesample_mt->region && rb->singlesample_mt->region->name == buffer->name) return; } if (unlikely(INTEL_DEBUG & DEBUG_DRI)) { fprintf(stderr, "attaching buffer %d, at %d, cpp %d, pitch %d\n", buffer->name, buffer->attachment, buffer->cpp, buffer->pitch); } intel_miptree_release(&rb->mt); region = intel_region_alloc_for_handle(brw->intelScreen, buffer->cpp, drawable->w, drawable->h, buffer->pitch, buffer->name, buffer_name); if (!region) { fprintf(stderr, "Failed to make region for returned DRI2 buffer " "(%dx%d, named %d).\n" "This is likely a bug in the X Server that will lead to a " "crash soon.\n", drawable->w, drawable->h, buffer->name); return; } intel_update_winsys_renderbuffer_miptree(brw, rb, region); if (brw_is_front_buffer_drawing(fb) && (buffer->attachment == __DRI_BUFFER_FRONT_LEFT || buffer->attachment == __DRI_BUFFER_FAKE_FRONT_LEFT) && rb->Base.Base.NumSamples > 1) { intel_renderbuffer_upsample(brw, rb); } assert(rb->mt); intel_region_release(®ion); }