rendered paste bodydiff --git a/src/mesa/drivers/dri/r300/r300_cmdbuf.c b/src/mesa/drivers/dri/r300/r300_cmdbuf.cindex c9e1dfe..1b33061 100644--- a/src/mesa/drivers/dri/r300/r300_cmdbuf.c+++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.c@@ -504,6 +504,8 @@ void r300InitCmdBuf(r300ContextPtr r300) r300->hw.zb_hiz_offset.cmd[0] = cmdpacket0(R300_ZB_HIZ_OFFSET, 1); ALLOC_STATE(zb_hiz_pitch, always, 2, 0); r300->hw.zb_hiz_pitch.cmd[0] = cmdpacket0(R300_ZB_HIZ_PITCH, 1);+ ALLOC_STATE(zpass_data, always, 2, 0);+ r300->hw.zpass_data.cmd[0] = cmdpacket0(R300_ZB_ZPASS_DATA, 0); /* VPU only on TCL */ if (has_tcl) {diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.cindex 3743627..ddaf7bf 100644--- a/src/mesa/drivers/dri/r300/r300_context.c+++ b/src/mesa/drivers/dri/r300/r300_context.c@@ -79,6 +79,7 @@ int hw_tcl_on = 1; #define need_GL_EXT_stencil_two_side #define need_GL_ARB_multisample+#define need_GL_ARB_occlusion_query #define need_GL_ARB_point_parameters #define need_GL_ARB_texture_compression #define need_GL_ARB_vertex_buffer_object@@ -99,6 +100,7 @@ const struct dri_extension card_extensions[] = { {"GL_ARB_fragment_program", NULL}, {"GL_ARB_multisample", GL_ARB_multisample_functions}, {"GL_ARB_multitexture", NULL},+ {"GL_ARB_occlusion_query", GL_ARB_occlusion_query_functions}, {"GL_ARB_point_parameters", GL_ARB_point_parameters_functions}, {"GL_ARB_shadow", NULL}, {"GL_ARB_shadow_ambient", NULL},diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.hindex c15e9fa..36cfbd9 100644--- a/src/mesa/drivers/dri/r300/r300_context.h+++ b/src/mesa/drivers/dri/r300/r300_context.h@@ -528,6 +528,7 @@ struct r300_hw_state { struct r300_state_atom unk4F30; /* (4F30) */ struct r300_state_atom zb_hiz_offset; /* (4F44) */ struct r300_state_atom zb_hiz_pitch; /* (4F54) */+ struct r300_state_atom zpass_data; /* (4F58) */ struct r300_state_atom vpi; /* vp instructions */ struct r300_state_atom vpp; /* vp parameters */diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.cindex 6a5c363..17c9871 100644--- a/src/mesa/drivers/dri/r300/r300_state.c+++ b/src/mesa/drivers/dri/r300/r300_state.c@@ -65,6 +65,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "drirenderbuffer.h" +#include <unistd.h> /* for usleep() */+ extern int future_hw_tcl_on; extern void _tnl_UpdateFixedFunctionProgram(GLcontext * ctx); @@ -1062,6 +1064,65 @@ static void r300StencilOpSeparate(GLcontext * ctx, GLenum face, } /* =============================================================+ * Occlusion Queries+ */++static void r300BeginQuery(GLcontext * ctx, struct gl_query_object * query)+{+ r300ContextPtr rmesa = R300_CONTEXT(ctx);++ R300_STATECHANGE(rmesa, zpass_data);+}++#define RADEON_SETPARAM_END_QUERY 7++static void r300EndQuery(GLcontext * ctx, struct gl_query_object * query)+{+ r300ContextPtr rmesa = R300_CONTEXT(ctx);++ drm_radeon_setparam_t sp;++ sp.param = RADEON_SETPARAM_END_QUERY;+ sp.value = query->Id % 60;++ LOCK_HARDWARE(&rmesa->radeon);+ drmCommandWriteRead(rmesa->radeon.dri.fd, DRM_RADEON_SETPARAM, &sp,+ sizeof(drm_radeon_setparam_t));+ UNLOCK_HARDWARE(&rmesa->radeon);+}++#define RADEON_PARAM_NUM_SAMPLES 16++static void r300CheckQuery(GLcontext * ctx, struct gl_query_object * query)+{+ r300ContextPtr rmesa = R300_CONTEXT(ctx);++ drm_radeon_getparam_t gp;+ uint32_t value = query->Id % 60;++ gp.param = RADEON_PARAM_NUM_SAMPLES;+ gp.value = (void*)&value;++ LOCK_HARDWARE(&rmesa->radeon);+ drmCommandWriteRead(rmesa->radeon.dri.fd, DRM_RADEON_GETPARAM, &gp,+ sizeof(drm_radeon_getparam_t));+ UNLOCK_HARDWARE(&rmesa->radeon);++ if (value != 0xFFFFFFFF) {+ query->Result = value;+ query->Ready = GL_TRUE;+ }+}++static void r300WaitQuery(GLcontext * ctx, struct gl_query_object * query)+{+ while (!query->Ready) {+ r300CheckQuery(ctx, query);+ usleep(1);+ }+}++/* ============================================================= * Window position and viewport transformation */ @@ -2814,6 +2875,12 @@ void r300InitStateFuncs(struct dd_function_table *functions) functions->StencilMaskSeparate = r300StencilMaskSeparate; functions->StencilOpSeparate = r300StencilOpSeparate; + /* ARB_occlusion_query */+ functions->BeginQuery = r300BeginQuery;+ functions->EndQuery = r300EndQuery;+ functions->CheckQuery = r300CheckQuery;+ //functions->WaitQuery = r300WaitQuery;+ /* Viewport related */ functions->Viewport = r300Viewport; functions->DepthRange = r300DepthRange;