[virglrenderer-devel] [PATCH 3/4] vrend: Warn on invalid GLES state usage
Jakob Bornecrantz
jakob at collabora.com
Fri Mar 9 13:30:48 UTC 2018
Signed-off-by: Jakob Bornecrantz <jakob at collabora.com>
---
src/vrend_renderer.c | 116 ++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 92 insertions(+), 24 deletions(-)
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index 123387f..26f1e37 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -506,8 +506,22 @@ static void __report_core_warn(const char *fname, struct vrend_context *ctx, enu
#define GLES_WARN_LOD_BIAS 5
#define GLES_WARN_SRGB_FB 6
#define GLES_WARN_TEXTURE_RECT 7
-
-static const char *vrend_gles_warn_strings[] = { "None", "Stipple", "Polygon Mode", "Depth Range", "Point Size", "Lod Bias", "SRGB Framebuffer", "Texture Rect" };
+#define GLES_WARN_OFFSET_LINE 8
+#define GLES_WARN_OFFSET_POINT 9
+#define GLES_WARN_DEPTH_CLIP 10
+#define GLES_WARN_FLATSHADE_FIRST 11
+#define GLES_WARN_LINE_SMOOTH 12
+#define GLES_WARN_POLY_SMOOTH 13
+#define GLES_WARN_DEPTH_CLEAR 14
+#define GLES_WARN_LOGIC_OP 15
+#define GLES_WARN_TIMESTAMP 16
+
+static const char *vrend_gles_warn_strings[] = {
+ "None", "Stipple", "Polygon Mode", "Depth Range", "Point Size", "Lod Bias",
+ "SRGB Framebuffer", "Texture Rect", "Offset Line", "Offset Point",
+ "Depth Clip", "Flatshade First", "Line Smooth", "Poly Smooth",
+ "Depth Clear", "LogicOp", "GL_TIMESTAMP"
+};
static void __report_gles_warn(const char *fname, struct vrend_context *ctx, enum virgl_ctx_errors error, uint32_t value)
{
@@ -2437,7 +2451,15 @@ void vrend_clear(struct vrend_context *ctx,
if (buffers & PIPE_CLEAR_DEPTH) {
/* gallium clears don't respect depth mask */
glDepthMask(GL_TRUE);
- glClearDepth(depth);
+ if (vrend_state.use_gles) {
+ if (0.0f < depth && depth > 1.0f) {
+ // Only warn, it is clamped by the function.
+ report_gles_warn(ctx, GLES_WARN_DEPTH_CLEAR, 0);
+ }
+ glClearDepthf(depth);
+ } else {
+ glClearDepth(depth);
+ }
}
if (buffers & PIPE_CLEAR_STENCIL)
@@ -3191,11 +3213,16 @@ static void vrend_hw_emit_blend(struct vrend_context *ctx, struct pipe_blend_sta
{
if (state->logicop_enable != ctx->sub->hw_blend_state.logicop_enable) {
ctx->sub->hw_blend_state.logicop_enable = state->logicop_enable;
- if (state->logicop_enable) {
+ if (vrend_state.use_gles) {
+ if (state->logicop_enable) {
+ report_gles_warn(ctx, GLES_WARN_LOGIC_OP, 0);
+ }
+ } else if (state->logicop_enable) {
glEnable(GL_COLOR_LOGIC_OP);
glLogicOp(translate_logicop(state->logicop_func));
- } else
+ } else {
glDisable(GL_COLOR_LOGIC_OP);
+ }
}
if (state->independent_blend_enable) {
@@ -3476,7 +3503,11 @@ static void vrend_hw_emit_rs(struct vrend_context *ctx)
struct pipe_rasterizer_state *state = &ctx->sub->rs_state;
int i;
- if (state->depth_clip) {
+ if (vrend_state.use_gles) {
+ if (!state->depth_clip) {
+ report_gles_warn(ctx, GLES_WARN_DEPTH_CLIP, 0);
+ }
+ } else if (state->depth_clip) {
glDisable(GL_DEPTH_CLAMP);
} else {
glEnable(GL_DEPTH_CLAMP);
@@ -3524,20 +3555,31 @@ static void vrend_hw_emit_rs(struct vrend_context *ctx)
} else
report_core_warn(ctx, CORE_PROFILE_WARN_POLYGON_MODE, 0);
- if (state->offset_tri)
+ if (state->offset_tri) {
glEnable(GL_POLYGON_OFFSET_FILL);
- else
+ } else {
glDisable(GL_POLYGON_OFFSET_FILL);
+ }
- if (state->offset_line)
+ if (vrend_state.use_gles) {
+ if (state->offset_line) {
+ report_gles_warn(ctx, GLES_WARN_OFFSET_LINE, 0);
+ }
+ } else if (state->offset_line) {
glEnable(GL_POLYGON_OFFSET_LINE);
- else
+ } else {
glDisable(GL_POLYGON_OFFSET_LINE);
+ }
- if (state->offset_point)
+ if (vrend_state.use_gles) {
+ if (state->offset_point) {
+ report_gles_warn(ctx, GLES_WARN_OFFSET_POINT, 0);
+ }
+ } else if (state->offset_point) {
glEnable(GL_POLYGON_OFFSET_POINT);
- else
+ } else {
glDisable(GL_POLYGON_OFFSET_POINT);
+ }
if (state->flatshade != ctx->sub->hw_rs_state.flatshade) {
@@ -3553,10 +3595,15 @@ static void vrend_hw_emit_rs(struct vrend_context *ctx)
if (state->flatshade_first != ctx->sub->hw_rs_state.flatshade_first) {
ctx->sub->hw_rs_state.flatshade_first = state->flatshade_first;
- if (state->flatshade_first)
+ if (vrend_state.use_gles) {
+ if (state->flatshade_first) {
+ report_gles_warn(ctx, GLES_WARN_FLATSHADE_FIRST, 0);
+ }
+ } else if (state->flatshade_first) {
glProvokingVertexEXT(GL_FIRST_VERTEX_CONVENTION_EXT);
- else
+ } else {
glProvokingVertexEXT(GL_LAST_VERTEX_CONVENTION_EXT);
+ }
}
glPolygonOffset(state->offset_scale, state->offset_units);
@@ -3571,14 +3618,21 @@ static void vrend_hw_emit_rs(struct vrend_context *ctx)
}
if (state->point_quad_rasterization) {
- if (vrend_state.use_core_profile == false)
+ if (vrend_state.use_core_profile == false &&
+ vrend_state.use_gles == false) {
glEnable(GL_POINT_SPRITE);
+ }
- glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, state->sprite_coord_mode ? GL_UPPER_LEFT : GL_LOWER_LEFT);
+ if (vrend_state.use_gles == false) {
+ glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, state->sprite_coord_mode ? GL_UPPER_LEFT : GL_LOWER_LEFT);
+ }
} else {
- if (vrend_state.use_core_profile == false)
+ if (vrend_state.use_core_profile == false &&
+ vrend_state.use_gles == false) {
glDisable(GL_POINT_SPRITE);
+ }
}
+
if (state->cull_face != PIPE_FACE_NONE) {
switch (state->cull_face) {
case PIPE_FACE_FRONT:
@@ -3627,15 +3681,26 @@ static void vrend_hw_emit_rs(struct vrend_context *ctx)
report_core_warn(ctx, CORE_PROFILE_WARN_STIPPLE, 0);
}
- if (state->line_smooth)
+
+ if (vrend_state.use_gles) {
+ if (state->line_smooth) {
+ report_gles_warn(ctx, GLES_WARN_LINE_SMOOTH, 0);
+ }
+ } else if (state->line_smooth) {
glEnable(GL_LINE_SMOOTH);
- else
+ } else {
glDisable(GL_LINE_SMOOTH);
+ }
- if (state->poly_smooth)
+ if (vrend_state.use_gles) {
+ if (state->poly_smooth) {
+ report_gles_warn(ctx, GLES_WARN_POLY_SMOOTH, 0);
+ }
+ } else if (state->poly_smooth) {
glEnable(GL_POLYGON_SMOOTH);
- else
+ } else {
glDisable(GL_POLYGON_SMOOTH);
+ }
if (vrend_state.use_core_profile == false) {
if (state->clamp_vertex_color)
@@ -6188,11 +6253,14 @@ void vrend_end_query(struct vrend_context *ctx, uint32_t handle)
return;
if (vrend_is_timer_query(q->gltype)) {
- if (q->gltype == GL_TIMESTAMP)
+ if (vrend_state.use_gles && q->gltype == GL_TIMESTAMP) {
+ report_gles_warn(ctx, GLES_WARN_TIMESTAMP, 0);
+ } else if (q->gltype == GL_TIMESTAMP) {
glQueryCounter(q->id, q->gltype);
- /* remove from active query list for this context */
- else
+ } else {
+ /* remove from active query list for this context */
glEndQuery(q->gltype);
+ }
return;
}
--
2.14.1
More information about the virglrenderer-devel
mailing list