mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 06:58:05 +02:00
r300g: implement flush+sync (AKA glFinish)
See comments in the code.
This commit is contained in:
parent
581be86342
commit
0b94c05c28
1 changed files with 36 additions and 0 deletions
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
|
||||
* Copyright 2010 Marek Olšák <maraeo@gmail.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
|
|
@ -37,6 +38,8 @@ static void r300_flush(struct pipe_context* pipe,
|
|||
struct r300_context *r300 = r300_context(pipe);
|
||||
struct r300_query *query;
|
||||
struct r300_atom *atom;
|
||||
struct pipe_framebuffer_state *fb;
|
||||
unsigned i;
|
||||
|
||||
CS_LOCALS(r300);
|
||||
(void) cs_count;
|
||||
|
|
@ -72,6 +75,39 @@ static void r300_flush(struct pipe_context* pipe,
|
|||
foreach(query, &r300->query_list) {
|
||||
query->flushed = TRUE;
|
||||
}
|
||||
|
||||
/* XXX
|
||||
*
|
||||
* This is a preliminary implementation of glFinish. Note that st/mesa
|
||||
* uses a non-null fence when glFinish is called and then waits for
|
||||
* the fence. Instead of returning the actual fence, we do the sync
|
||||
* directly.
|
||||
*
|
||||
* The ideal implementation should use something like EmitIrqLocked and
|
||||
* WaitIrq, or better, real fences.
|
||||
*
|
||||
* This feature degrades performance to the level of r300c for games that
|
||||
* use glFinish a lot, even openarena does. Ideally we wouldn't need
|
||||
* glFinish at all if we had proper throttling in swapbuffers so that
|
||||
* the CPU wouldn't outrun the GPU by several frames, so this is basically
|
||||
* a temporary fix for the input lag. Once swap&sync works with DRI2,
|
||||
* I'll be happy to remove this code.
|
||||
*
|
||||
* - M. */
|
||||
if (fence && r300->fb_state.state) {
|
||||
fb = r300->fb_state.state;
|
||||
|
||||
for (i = 0; i < fb->nr_cbufs; i++) {
|
||||
if (fb->cbufs[i]->texture) {
|
||||
r300->rws->buffer_wait(r300->rws,
|
||||
r300_texture(fb->cbufs[i]->texture)->buffer);
|
||||
}
|
||||
if (fb->zsbuf) {
|
||||
r300->rws->buffer_wait(r300->rws,
|
||||
r300_texture(fb->zsbuf->texture)->buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void r300_init_flush_functions(struct r300_context* r300)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue