mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 01:38:06 +02:00
Fix crashes when the frag prog can't be handled in hardware (#11131)
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.)
This commit is contained in:
parent
35f35294cd
commit
a188ba4bf9
4 changed files with 16 additions and 1 deletions
|
|
@ -60,6 +60,11 @@ do { \
|
|||
#define VRTX_TEX_SET_FMT(n, x) ((x)<<((n)*2))
|
||||
#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)
|
||||
{
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,13 +44,18 @@
|
|||
#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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 ||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue