[Mesa-dev] [PATCH 10/10] i915: Finish switching i915 to using miptrees instead of regions.
Chad Versace
chad.versace at linux.intel.com
Mon Feb 4 12:15:14 PST 2013
On 01/28/2013 09:00 PM, Eric Anholt wrote:
> ---
> src/mesa/drivers/dri/i915/i830_vtbl.c | 52 ++++++++++++-------------
> src/mesa/drivers/dri/i915/i915_vtbl.c | 58 ++++++++++++++--------------
> src/mesa/drivers/dri/intel/intel_context.h | 5 ++-
> 3 files changed, 58 insertions(+), 57 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i915/i830_vtbl.c b/src/mesa/drivers/dri/i915/i830_vtbl.c
> @@ -768,19 +768,19 @@ i830_update_draw_buffer(struct intel_context *intel)
> if (_mesa_is_winsys_fbo(fb)) {
> /* drawing to window system buffer */
> if (fb->_ColorDrawBufferIndexes[0] == BUFFER_FRONT_LEFT)
> - colorRegion = intel_get_rb_region(fb, BUFFER_FRONT_LEFT);
> + color_mt = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT)->mt;
> else
> - colorRegion = intel_get_rb_region(fb, BUFFER_BACK_LEFT);
> + color_mt = intel_get_renderbuffer(fb, BUFFER_BACK_LEFT)->mt;
^^^
On a single-buffered framebuffer, I think this dereference will segfault.
> static void
> i915_set_draw_region(struct intel_context *intel,
> - struct intel_region *color_region,
> - struct intel_region *depth_region)
> + struct intel_mipmap_tree *color_mt,
> + struct intel_mipmap_tree *depth_mt)
> {
> struct i915_context *i915 = i915_context(&intel->ctx);
> struct gl_context *ctx = &intel->ctx;
> @@ -586,25 +586,25 @@ i915_set_draw_region(struct intel_context *intel,
>
> drm_intel_bo_unreference(state->color_bo);
> state->color_bo = NULL;
> - if (color_region) {
> - state->color_bo = color_region->bo;
> - drm_intel_bo_unreference(color_region->bo);
> + if (color_mt->region) {
^^^^
> + state->color_bo = color_mt->region->bo;
> + drm_intel_bo_unreference(color_mt->region->bo);
> }
The caller of i915_set_draw_region, which is i915_update_draw_buffer, has
codepaths where color_mt is NULL. I don't know if those codepaths are active,
but if they are, then `if (color_mt->region)` segfaults.
> drm_intel_bo_unreference(state->depth_bo);
> state->depth_bo = NULL;
> - if (depth_region) {
> - state->depth_bo = depth_region->bo;
> - drm_intel_bo_unreference(depth_region->bo);
> + if (depth_mt) {
> + state->depth_bo = depth_mt->region->bo;
> + drm_intel_bo_unreference(depth_mt->region->bo);
> }
> @@ -623,10 +623,10 @@ i915_set_draw_region(struct intel_context *intel,
> * can only be set when a depth buffer is already defined.
> */
> if (intel->is_945 && intel->use_early_z &&
> - depth_region->tiling != I915_TILING_NONE)
> + depth_mt->region->tiling != I915_TILING_NONE)
> value |= CLASSIC_EARLY_DEPTH;
>
> - if (depth_region && depth_region->cpp == 4) {
> + if (depth_mt->region && depth_mt->cpp == 4) {
^^^^^
Ditto here. Segfaults if depth_mt is NULL.
More information about the mesa-dev
mailing list