OSDN Git Service

Fix crashes when the frag prog can't be handled in hardware (#11131)
authorRoland Scheidegger <sroland@tungstengraphics.com>
Sun, 29 Jul 2007 16:04:28 +0000 (18:04 +0200)
committerRoland Scheidegger <sroland@tungstengraphics.com>
Sun, 29 Jul 2007 16:09:35 +0000 (18:09 +0200)
Must not change to/from swrast after Render.Start or bad things will happen.
(Driver will still somewhat incorrectly report an implementation error,
and apps can't really figure out if a prog is natively supported as validation
is later - could try doing it earlier to give some hint at least, even though
native status may still change later due to fog etc.)

src/mesa/drivers/dri/i915tex/i830_vtbl.c
src/mesa/drivers/dri/i915tex/i915_vtbl.c
src/mesa/drivers/dri/i915tex/intel_context.h
src/mesa/drivers/dri/i915tex/intel_render.c

index e432648..a3db6c0 100644 (file)
@@ -61,6 +61,11 @@ do {                                                                 \
 #define TEXBIND_SET(n, x)              ((x)<<((n)*4))
 
 static void
+i830_render_prevalidate(struct intel_context *intel)
+{
+}
+
+static void
 i830_render_start(struct intel_context *intel)
 {
    GLcontext *ctx = &intel->ctx;
@@ -657,5 +662,6 @@ i830InitVtbl(struct i830_context *i830)
    i830->intel.vtbl.update_texture_state = i830UpdateTextureState;
    i830->intel.vtbl.flush_cmd = i830_flush_cmd;
    i830->intel.vtbl.render_start = i830_render_start;
+   i830->intel.vtbl.render_prevalidate = i830_render_prevalidate;
    i830->intel.vtbl.assert_not_dirty = i830_assert_not_dirty;
 }
index ad333b4..9de35d8 100644 (file)
 #include "i915_context.h"
 
 static void
-i915_render_start(struct intel_context *intel)
+i915_render_prevalidate(struct intel_context *intel)
 {
    struct i915_context *i915 = i915_context(&intel->ctx);
 
    i915ValidateFragmentProgram(i915);
 }
 
+static void
+i915_render_start(struct intel_context *intel)
+{
+}
+
 
 static void
 i915_reduced_primitive_state(struct intel_context *intel, GLenum rprim)
@@ -546,6 +551,7 @@ i915InitVtbl(struct i915_context *i915)
    i915->intel.vtbl.lost_hardware = i915_lost_hardware;
    i915->intel.vtbl.reduced_primitive_state = i915_reduced_primitive_state;
    i915->intel.vtbl.render_start = i915_render_start;
+   i915->intel.vtbl.render_prevalidate = i915_render_prevalidate;
    i915->intel.vtbl.set_draw_region = i915_set_draw_region;
    i915->intel.vtbl.update_texture_state = i915UpdateTextureState;
    i915->intel.vtbl.flush_cmd = i915_flush_cmd;
index 9d060eb..ddd1439 100644 (file)
@@ -131,6 +131,7 @@ struct intel_context
       void (*update_texture_state) (struct intel_context * intel);
 
       void (*render_start) (struct intel_context * intel);
+      void (*render_prevalidate) (struct intel_context * intel);
       void (*set_draw_region) (struct intel_context * intel,
                                struct intel_region * draw_region,
                                struct intel_region * depth_region);
index f9fa550..c8b6d30 100644 (file)
@@ -202,6 +202,8 @@ intel_run_render(GLcontext * ctx, struct tnl_pipeline_stage *stage)
    struct vertex_buffer *VB = &tnl->vb;
    GLuint i;
 
+   intel->vtbl.render_prevalidate( intel );
+
    /* Don't handle clipping or indexed vertices.
     */
    if (intel->RenderIndex != 0 ||