X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fstate_trackers%2Fdri%2Fdri_drawable.c;h=4b0ba5f6719c05b260542ed47b5cd5874a887cf5;hb=882ca6dfb0f3d17e0f8bc917307d915ab1718069;hp=92047584224ffeb50d78b6aa88805e7f57f7018a;hpb=e685566612b8d983f0cebbabca75849e3f7ebdc8;p=mesa.git diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c index 92047584224..4b0ba5f6719 100644 --- a/src/gallium/state_trackers/dri/dri_drawable.c +++ b/src/gallium/state_trackers/dri/dri_drawable.c @@ -34,16 +34,13 @@ #include "dri_drawable.h" #include "pipe/p_screen.h" -#include "util/u_format.h" +#include "util/format/u_format.h" #include "util/u_memory.h" #include "util/u_inlines.h" static uint32_t drifb_ID = 0; -static void -swap_fences_unref(struct dri_drawable *draw); - -static boolean +static bool dri_st_framebuffer_validate(struct st_context_iface *stctx, struct st_framebuffer_iface *stfbi, const enum st_attachment_type *statts, @@ -55,7 +52,7 @@ dri_st_framebuffer_validate(struct st_context_iface *stctx, (struct dri_drawable *) stfbi->st_manager_private; struct dri_screen *screen = dri_screen(drawable->sPriv); unsigned statt_mask, new_mask; - boolean new_stamp; + bool new_stamp; int i; unsigned int lastStamp; struct pipe_resource **textures = @@ -96,16 +93,16 @@ dri_st_framebuffer_validate(struct st_context_iface *stctx, } while (lastStamp != drawable->dPriv->lastStamp); if (!out) - return TRUE; + return true; /* Set the window-system buffers for the state tracker. */ for (i = 0; i < count; i++) pipe_resource_reference(&out[i], textures[statts[i]]); - return TRUE; + return true; } -static boolean +static bool dri_st_framebuffer_flush_front(struct st_context_iface *stctx, struct st_framebuffer_iface *stfbi, enum st_attachment_type statt) @@ -117,13 +114,13 @@ dri_st_framebuffer_flush_front(struct st_context_iface *stctx, /* XXX remove this and just set the correct one on the framebuffer */ drawable->flush_frontbuffer(ctx, drawable, statt); - return TRUE; + return true; } /** * The state tracker framebuffer interface flush_swapbuffers callback */ -static boolean +static bool dri_st_framebuffer_flush_swapbuffers(struct st_context_iface *stctx, struct st_framebuffer_iface *stfbi) { @@ -134,16 +131,16 @@ dri_st_framebuffer_flush_swapbuffers(struct st_context_iface *stctx, if (drawable->flush_swapbuffers) drawable->flush_swapbuffers(ctx, drawable); - return TRUE; + return true; } /** * This is called when we need to set up GL rendering to a new X window. */ -boolean +bool dri_create_buffer(__DRIscreen * sPriv, __DRIdrawable * dPriv, - const struct gl_config * visual, boolean isPixmap) + const struct gl_config * visual, bool isPixmap) { struct dri_screen *screen = sPriv->driverPrivate; struct dri_drawable *drawable = NULL; @@ -167,19 +164,16 @@ dri_create_buffer(__DRIscreen * sPriv, drawable->screen = screen; drawable->sPriv = sPriv; drawable->dPriv = dPriv; - drawable->desired_fences = screen->default_throttle_frames; - if (drawable->desired_fences > DRI_SWAP_FENCES_MAX) - drawable->desired_fences = DRI_SWAP_FENCES_MAX; dPriv->driverPrivate = (void *)drawable; p_atomic_set(&drawable->base.stamp, 1); drawable->base.ID = p_atomic_inc_return(&drifb_ID); drawable->base.state_manager = &screen->base; - return GL_TRUE; + return true; fail: FREE(drawable); - return GL_FALSE; + return false; } void @@ -197,7 +191,8 @@ dri_destroy_buffer(__DRIdrawable * dPriv) for (i = 0; i < ST_ATTACHMENT_COUNT; i++) pipe_resource_reference(&drawable->msaa_textures[i], NULL); - swap_fences_unref(drawable); + screen->base.screen->fence_reference(screen->base.screen, + &drawable->throttle_fence, NULL); /* Notify the st manager that this drawable is no longer valid */ stapi->destroy_drawable(stapi, &drawable->base); @@ -260,6 +255,9 @@ dri_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target, if (format == __DRI_TEXTURE_FORMAT_RGB) { /* only need to cover the formats recognized by dri_fill_st_visual */ switch (internal_format) { + case PIPE_FORMAT_R16G16B16A16_FLOAT: + internal_format = PIPE_FORMAT_R16G16B16X16_FLOAT; + break; case PIPE_FORMAT_B10G10R10A2_UNORM: internal_format = PIPE_FORMAT_B10G10R10X2_UNORM; break; @@ -281,7 +279,7 @@ dri_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target, ctx->st->teximage(ctx->st, (target == GL_TEXTURE_2D) ? ST_TEXTURE_2D : ST_TEXTURE_RECT, - 0, internal_format, pt, FALSE); + 0, internal_format, pt, false); } } @@ -333,75 +331,6 @@ dri_drawable_get_format(struct dri_drawable *drawable, } } - -/** - * swap_fences_pop_front - pull a fence from the throttle queue - * - * If the throttle queue is filled to the desired number of fences, - * pull fences off the queue until the number is less than the desired - * number of fences, and return the last fence pulled. - */ -static struct pipe_fence_handle * -swap_fences_pop_front(struct dri_drawable *draw) -{ - struct pipe_screen *screen = draw->screen->base.screen; - struct pipe_fence_handle *fence = NULL; - - if (draw->desired_fences == 0) - return NULL; - - if (draw->cur_fences >= draw->desired_fences) { - screen->fence_reference(screen, &fence, draw->swap_fences[draw->tail]); - screen->fence_reference(screen, &draw->swap_fences[draw->tail++], NULL); - draw->tail &= DRI_SWAP_FENCES_MASK; - --draw->cur_fences; - } - return fence; -} - - -/** - * swap_fences_push_back - push a fence onto the throttle queue - * - * push a fence onto the throttle queue and pull fences of the queue - * so that the desired number of fences are on the queue. - */ -static void -swap_fences_push_back(struct dri_drawable *draw, - struct pipe_fence_handle *fence) -{ - struct pipe_screen *screen = draw->screen->base.screen; - - if (!fence || draw->desired_fences == 0) - return; - - while(draw->cur_fences == draw->desired_fences) - swap_fences_pop_front(draw); - - draw->cur_fences++; - screen->fence_reference(screen, &draw->swap_fences[draw->head++], - fence); - draw->head &= DRI_SWAP_FENCES_MASK; -} - - -/** - * swap_fences_unref - empty the throttle queue - * - * pulls fences of the throttle queue until it is empty. - */ -static void -swap_fences_unref(struct dri_drawable *draw) -{ - struct pipe_screen *screen = draw->screen->base.screen; - - while(draw->cur_fences) { - screen->fence_reference(screen, &draw->swap_fences[draw->tail++], NULL); - draw->tail &= DRI_SWAP_FENCES_MASK; - --draw->cur_fences; - } -} - void dri_pipe_blit(struct pipe_context *pipe, struct pipe_resource *dst, @@ -480,7 +409,7 @@ dri_flush(__DRIcontext *cPriv, struct dri_drawable *drawable = dri_drawable(dPriv); struct st_context_iface *st; unsigned flush_flags; - boolean swap_msaa_buffers = FALSE; + bool swap_msaa_buffers = false; if (!ctx) { assert(0); @@ -496,7 +425,7 @@ dri_flush(__DRIcontext *cPriv, if (drawable->flushing) return; - drawable->flushing = TRUE; + drawable->flushing = true; } else { flags &= ~__DRI2_FLUSH_DRAWABLE; @@ -508,15 +437,17 @@ dri_flush(__DRIcontext *cPriv, struct pipe_context *pipe = st->pipe; if (drawable->stvis.samples > 1 && - reason == __DRI2_THROTTLE_SWAPBUFFER) { + (reason == __DRI2_THROTTLE_SWAPBUFFER || + reason == __DRI2_THROTTLE_COPYSUBBUFFER)) { /* Resolve the MSAA back buffer. */ dri_pipe_blit(st->pipe, drawable->textures[ST_ATTACHMENT_BACK_LEFT], drawable->msaa_textures[ST_ATTACHMENT_BACK_LEFT]); - if (drawable->msaa_textures[ST_ATTACHMENT_FRONT_LEFT] && + if (reason == __DRI2_THROTTLE_SWAPBUFFER && + drawable->msaa_textures[ST_ATTACHMENT_FRONT_LEFT] && drawable->msaa_textures[ST_ATTACHMENT_BACK_LEFT]) { - swap_msaa_buffers = TRUE; + swap_msaa_buffers = true; } /* FRONT_LEFT is resolved in drawable->flush_frontbuffer. */ @@ -547,42 +478,29 @@ dri_flush(__DRIcontext *cPriv, flush_flags |= ST_FLUSH_END_OF_FRAME; /* Flush the context and throttle if needed. */ - if (dri_screen(ctx->sPriv)->throttling_enabled && + if (dri_screen(ctx->sPriv)->throttle && drawable && (reason == __DRI2_THROTTLE_SWAPBUFFER || reason == __DRI2_THROTTLE_FLUSHFRONT)) { - /* Throttle. - * - * This pulls a fence off the throttling queue and waits for it if the - * number of fences on the throttling queue has reached the desired - * number. - * - * Then flushes to insert a fence at the current rendering position, and - * pushes that fence on the queue. This requires that the st_context_iface - * flush method returns a fence even if there are no commands to flush. - */ - struct pipe_screen *screen = drawable->screen->base.screen; - struct pipe_fence_handle *fence; - fence = swap_fences_pop_front(drawable); - if (fence) { - (void) screen->fence_finish(screen, NULL, fence, PIPE_TIMEOUT_INFINITE); - screen->fence_reference(screen, &fence, NULL); - } + struct pipe_screen *screen = drawable->screen->base.screen; + struct pipe_fence_handle *new_fence = NULL; - st->flush(st, flush_flags, &fence); + st->flush(st, flush_flags, &new_fence); - if (fence) { - swap_fences_push_back(drawable, fence); - screen->fence_reference(screen, &fence, NULL); + /* throttle on the previous fence */ + if (drawable->throttle_fence) { + screen->fence_finish(screen, NULL, drawable->throttle_fence, PIPE_TIMEOUT_INFINITE); + screen->fence_reference(screen, &drawable->throttle_fence, NULL); } + drawable->throttle_fence = new_fence; } else if (flags & (__DRI2_FLUSH_DRAWABLE | __DRI2_FLUSH_CONTEXT)) { st->flush(st, flush_flags, NULL); } if (drawable) { - drawable->flushing = FALSE; + drawable->flushing = false; } /* Swap the MSAA front and back buffers, so that reading