By relying on just intel_span_supports_format, some formats that aren't supported pre-gen4 were not reporting FBO incomplete. And we also complained in stderr when it happened on i915 because draw_region gets called before framebuffer completeness validation.tags/android-x86-2.2-r2
@@ -585,6 +585,27 @@ i830_destroy_context(struct intel_context *intel) | |||
_tnl_free_vertices(&intel->ctx); | |||
} | |||
static uint32_t i830_render_target_format_for_mesa_format[MESA_FORMAT_COUNT] = | |||
{ | |||
[MESA_FORMAT_ARGB8888] = DV_PF_8888, | |||
[MESA_FORMAT_XRGB8888] = DV_PF_8888, | |||
[MESA_FORMAT_RGB565] = DV_PF_565, | |||
[MESA_FORMAT_ARGB1555] = DV_PF_1555, | |||
[MESA_FORMAT_ARGB4444] = DV_PF_4444, | |||
}; | |||
static bool | |||
i830_render_target_supported(gl_format format) | |||
{ | |||
if (format == MESA_FORMAT_S8_Z24 || | |||
format == MESA_FORMAT_X8_Z24 || | |||
format == MESA_FORMAT_Z16) { | |||
return true; | |||
} | |||
return i830_render_target_format_for_mesa_format[format] != 0; | |||
} | |||
static void | |||
i830_set_draw_region(struct intel_context *intel, | |||
struct intel_region *color_regions[], | |||
@@ -624,24 +645,7 @@ i830_set_draw_region(struct intel_context *intel, | |||
DSTORG_VERT_BIAS(0x8) | DEPTH_IS_Z); /* .5 */ | |||
if (irb != NULL) { | |||
switch (irb->Base.Format) { | |||
case MESA_FORMAT_ARGB8888: | |||
case MESA_FORMAT_XRGB8888: | |||
value |= DV_PF_8888; | |||
break; | |||
case MESA_FORMAT_RGB565: | |||
value |= DV_PF_565; | |||
break; | |||
case MESA_FORMAT_ARGB1555: | |||
value |= DV_PF_1555; | |||
break; | |||
case MESA_FORMAT_ARGB4444: | |||
value |= DV_PF_4444; | |||
break; | |||
default: | |||
_mesa_problem(ctx, "Bad renderbuffer format: %d\n", | |||
irb->Base.Format); | |||
} | |||
value |= i830_render_target_format_for_mesa_format[irb->Base.Format]; | |||
} | |||
if (depth_region && depth_region->cpp == 4) { | |||
@@ -729,4 +733,5 @@ i830InitVtbl(struct i830_context *i830) | |||
i830->intel.vtbl.assert_not_dirty = i830_assert_not_dirty; | |||
i830->intel.vtbl.finish_batch = intel_finish_vb; | |||
i830->intel.vtbl.invalidate_state = i830_invalidate_state; | |||
i830->intel.vtbl.render_target_supported = i830_render_target_supported; | |||
} |
@@ -524,6 +524,27 @@ i915_set_buf_info_for_region(uint32_t *state, struct intel_region *region, | |||
} | |||
} | |||
static uint32_t i915_render_target_format_for_mesa_format[MESA_FORMAT_COUNT] = | |||
{ | |||
[MESA_FORMAT_ARGB8888] = DV_PF_8888, | |||
[MESA_FORMAT_XRGB8888] = DV_PF_8888, | |||
[MESA_FORMAT_RGB565] = DV_PF_565 | DITHER_FULL_ALWAYS, | |||
[MESA_FORMAT_ARGB1555] = DV_PF_1555 | DITHER_FULL_ALWAYS, | |||
[MESA_FORMAT_ARGB4444] = DV_PF_4444 | DITHER_FULL_ALWAYS, | |||
}; | |||
static bool | |||
i915_render_target_supported(gl_format format) | |||
{ | |||
if (format == MESA_FORMAT_S8_Z24 || | |||
format == MESA_FORMAT_X8_Z24 || | |||
format == MESA_FORMAT_Z16) { | |||
return true; | |||
} | |||
return i915_render_target_format_for_mesa_format[format] != 0; | |||
} | |||
static void | |||
i915_set_draw_region(struct intel_context *intel, | |||
struct intel_region *color_regions[], | |||
@@ -563,24 +584,7 @@ i915_set_draw_region(struct intel_context *intel, | |||
DSTORG_VERT_BIAS(0x8) | /* .5 */ | |||
LOD_PRECLAMP_OGL | TEX_DEFAULT_COLOR_OGL); | |||
if (irb != NULL) { | |||
switch (irb->Base.Format) { | |||
case MESA_FORMAT_ARGB8888: | |||
case MESA_FORMAT_XRGB8888: | |||
value |= DV_PF_8888; | |||
break; | |||
case MESA_FORMAT_RGB565: | |||
value |= DV_PF_565 | DITHER_FULL_ALWAYS; | |||
break; | |||
case MESA_FORMAT_ARGB1555: | |||
value |= DV_PF_1555 | DITHER_FULL_ALWAYS; | |||
break; | |||
case MESA_FORMAT_ARGB4444: | |||
value |= DV_PF_4444 | DITHER_FULL_ALWAYS; | |||
break; | |||
default: | |||
_mesa_problem(ctx, "Bad renderbuffer format: %d\n", | |||
irb->Base.Format); | |||
} | |||
value |= i915_render_target_format_for_mesa_format[irb->Base.Format]; | |||
} | |||
/* This isn't quite safe, thus being hidden behind an option. When changing | |||
@@ -687,4 +691,5 @@ i915InitVtbl(struct i915_context *i915) | |||
i915->intel.vtbl.update_texture_state = i915UpdateTextureState; | |||
i915->intel.vtbl.assert_not_dirty = i915_assert_not_dirty; | |||
i915->intel.vtbl.finish_batch = intel_finish_vb; | |||
i915->intel.vtbl.render_target_supported = i915_render_target_supported; | |||
} |
@@ -203,4 +203,5 @@ void brwInitVtbl( struct brw_context *brw ) | |||
brw->intel.vtbl.destroy = brw_destroy_context; | |||
brw->intel.vtbl.set_draw_region = brw_set_draw_region; | |||
brw->intel.vtbl.debug_batch = brw_debug_batch; | |||
brw->intel.vtbl.render_target_supported = brw_render_target_supported; | |||
} |
@@ -474,5 +474,6 @@ struct gl_shader *brw_new_shader(struct gl_context *ctx, GLuint name, GLuint typ | |||
struct gl_shader_program *brw_new_shader_program(struct gl_context *ctx, GLuint name); | |||
bool brw_color_buffer_write_enabled(struct brw_context *brw); | |||
bool brw_render_target_supported(gl_format format); | |||
#endif |
@@ -42,7 +42,7 @@ | |||
#include "brw_context.h" | |||
#include "brw_state.h" | |||
#include "brw_defines.h" | |||
#include "brw_wm.h" | |||
static GLuint translate_tex_target( GLenum target ) | |||
{ | |||
@@ -103,6 +103,21 @@ static uint32_t brw_format_for_mesa_format[MESA_FORMAT_COUNT] = | |||
[MESA_FORMAT_SIGNED_RGBA8888_REV] = BRW_SURFACEFORMAT_R8G8B8A8_SNORM, | |||
}; | |||
bool | |||
brw_render_target_supported(gl_format format) | |||
{ | |||
if (format == MESA_FORMAT_S8_Z24 || | |||
format == MESA_FORMAT_X8_Z24 || | |||
format == MESA_FORMAT_Z16) { | |||
return true; | |||
} | |||
/* Not exactly true, as some of those formats are not renderable. | |||
* But at least we know how to translate them. | |||
*/ | |||
return brw_format_for_mesa_format[format] != 0; | |||
} | |||
static GLuint translate_tex_format( gl_format mesa_format, | |||
GLenum internal_format, | |||
GLenum depth_mode ) |
@@ -149,6 +149,7 @@ struct intel_context | |||
void (*assert_not_dirty) (struct intel_context *intel); | |||
void (*debug_batch)(struct intel_context *intel); | |||
bool (*render_target_supported)(gl_format format); | |||
} vtbl; | |||
struct dri_metaops meta; |
@@ -564,6 +564,7 @@ intel_finish_render_texture(struct gl_context * ctx, | |||
static void | |||
intel_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb) | |||
{ | |||
struct intel_context *intel = intel_context(ctx); | |||
const struct intel_renderbuffer *depthRb = | |||
intel_get_renderbuffer(fb, BUFFER_DEPTH); | |||
const struct intel_renderbuffer *stencilRb = | |||
@@ -612,7 +613,8 @@ intel_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb) | |||
continue; | |||
} | |||
if (!intel_span_supports_format(irb->Base.Format)) { | |||
if (!intel_span_supports_format(irb->Base.Format) || | |||
!intel->vtbl.render_target_supported(irb->Base.Format)) { | |||
DBG("Unsupported texture/renderbuffer format attached: %s\n", | |||
_mesa_get_format_name(irb->Base.Format)); | |||
fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT; |