From 33b07893e92dcee495908c549be872887096c894 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 9 Nov 2011 22:21:16 +0000 Subject: i830: Compute initial number of vertices from remaining batch space In order to prevent an overflow of the batch buffer when emitting triangles, we need to limit the initial primitive to fit within the current batch. To do we need to measure the remaining space and thence compute the maximum number of vertices that fit into that space. Reported-by: Kurt Roeckx Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41495 Signed-off-by: Chris Wilson Reviewed-by: Eric Anholt NOTE: This is a candidate for release branches. --- src/mesa/drivers/dri/i915/intel_render.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src/mesa/drivers/dri/i915') diff --git a/src/mesa/drivers/dri/i915/intel_render.c b/src/mesa/drivers/dri/i915/intel_render.c index 432fc7a14b0..a4041bea9ba 100644 --- a/src/mesa/drivers/dri/i915/intel_render.c +++ b/src/mesa/drivers/dri/i915/intel_render.c @@ -119,12 +119,14 @@ intelDmaPrimitive(struct intel_context *intel, GLenum prim) intel_set_prim(intel, hw_prim[prim]); } +#define INTEL_NO_VBO_STATE_RESERVED 1500 + static INLINE GLuint intel_get_vb_max(struct intel_context *intel) { GLuint ret; if (intel->intelScreen->no_vbo) - ret = sizeof(intel->batch.map) - 1500; + ret = sizeof(intel->batch.map) - INTEL_NO_VBO_STATE_RESERVED; else ret = INTEL_VB_SIZE; ret /= (intel->vertex_size * 4); @@ -133,11 +135,15 @@ static INLINE GLuint intel_get_vb_max(struct intel_context *intel) static INLINE GLuint intel_get_current_max(struct intel_context *intel) { + GLuint ret; - if (intel->intelScreen->no_vbo) - return intel_get_vb_max(intel); - else - return (INTEL_VB_SIZE - intel->prim.current_offset) / (intel->vertex_size * 4); + if (intel->intelScreen->no_vbo) { + ret = intel_batchbuffer_space(intel); + ret = ret <= INTEL_NO_VBO_STATE_RESERVED ? 0 : ret - INTEL_NO_VBO_STATE_RESERVED; + } else + ret = (INTEL_VB_SIZE - intel->prim.current_offset); + + return ret / (intel->vertex_size * 4); } #define LOCAL_VARS struct intel_context *intel = intel_context(ctx) -- cgit v1.2.3