summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/svga/svga_context.h3
-rw-r--r--src/gallium/drivers/svga/svga_draw_arrays.c5
-rw-r--r--src/gallium/drivers/svga/svga_pipe_blend.c9
-rw-r--r--src/gallium/drivers/svga/svga_pipe_misc.c17
-rw-r--r--src/gallium/drivers/svga/svga_pipe_rasterizer.c5
-rw-r--r--src/gallium/drivers/svga/svga_state_need_swtnl.c23
6 files changed, 62 insertions, 0 deletions
diff --git a/src/gallium/drivers/svga/svga_context.h b/src/gallium/drivers/svga/svga_context.h
index 6a4f9d8d076..c4284cc3e5b 100644
--- a/src/gallium/drivers/svga/svga_context.h
+++ b/src/gallium/drivers/svga/svga_context.h
@@ -392,6 +392,9 @@ struct svga_context
boolean no_line_width;
boolean force_hw_line_stipple;
+
+ /** To report perf/conformance/etc issues to the state tracker */
+ struct pipe_debug_callback callback;
} debug;
struct {
diff --git a/src/gallium/drivers/svga/svga_draw_arrays.c b/src/gallium/drivers/svga/svga_draw_arrays.c
index 1bf19e8522e..7d82930677b 100644
--- a/src/gallium/drivers/svga/svga_draw_arrays.c
+++ b/src/gallium/drivers/svga/svga_draw_arrays.c
@@ -26,6 +26,7 @@
#include "svga_cmd.h"
#include "util/u_inlines.h"
+#include "util/u_prim.h"
#include "indices/u_indices.h"
#include "svga_hw_reg.h"
@@ -277,6 +278,10 @@ svga_hwtnl_draw_arrays(struct svga_hwtnl *hwtnl,
if (ret != PIPE_OK)
goto done;
+ pipe_debug_message(&svga->debug.callback, PERF_INFO,
+ "generating temporary index buffer for drawing %s",
+ u_prim_name(prim));
+
ret = svga_hwtnl_simple_draw_range_elements(hwtnl,
gen_buf,
gen_size,
diff --git a/src/gallium/drivers/svga/svga_pipe_blend.c b/src/gallium/drivers/svga/svga_pipe_blend.c
index 0c9d6129b53..0af80cd4296 100644
--- a/src/gallium/drivers/svga/svga_pipe_blend.c
+++ b/src/gallium/drivers/svga/svga_pipe_blend.c
@@ -243,6 +243,15 @@ svga_create_blend_state(struct pipe_context *pipe,
blend->rt[i].srcblend_alpha = blend->rt[i].srcblend;
blend->rt[i].dstblend_alpha = blend->rt[i].dstblend;
blend->rt[i].blendeq_alpha = blend->rt[i].blendeq;
+
+ if (templ->logicop_func == PIPE_LOGICOP_XOR) {
+ pipe_debug_message(&svga->debug.callback, CONFORMANCE,
+ "XOR logicop mode has limited support");
+ }
+ else if (templ->logicop_func != PIPE_LOGICOP_COPY) {
+ pipe_debug_message(&svga->debug.callback, CONFORMANCE,
+ "general logicops are not supported");
+ }
}
else {
/* Note: the vgpu10 device does not yet support independent
diff --git a/src/gallium/drivers/svga/svga_pipe_misc.c b/src/gallium/drivers/svga/svga_pipe_misc.c
index c8020da7c7a..af9356d7c75 100644
--- a/src/gallium/drivers/svga/svga_pipe_misc.c
+++ b/src/gallium/drivers/svga/svga_pipe_misc.c
@@ -244,6 +244,22 @@ static void svga_set_viewport_states( struct pipe_context *pipe,
}
+/**
+ * Called by state tracker to specify a callback function the driver
+ * can use to report info back to the state tracker.
+ */
+static void
+svga_set_debug_callback(struct pipe_context *pipe,
+ const struct pipe_debug_callback *cb)
+{
+ struct svga_context *svga = svga_context(pipe);
+
+ if (cb)
+ svga->debug.callback = *cb;
+ else
+ memset(&svga->debug.callback, 0, sizeof(svga->debug.callback));
+}
+
void svga_init_misc_functions( struct svga_context *svga )
{
@@ -252,6 +268,7 @@ void svga_init_misc_functions( struct svga_context *svga )
svga->pipe.set_framebuffer_state = svga_set_framebuffer_state;
svga->pipe.set_clip_state = svga_set_clip_state;
svga->pipe.set_viewport_states = svga_set_viewport_states;
+ svga->pipe.set_debug_callback = svga_set_debug_callback;
}
diff --git a/src/gallium/drivers/svga/svga_pipe_rasterizer.c b/src/gallium/drivers/svga/svga_pipe_rasterizer.c
index 6310b7a5e86..fa1744fc33e 100644
--- a/src/gallium/drivers/svga/svga_pipe_rasterizer.c
+++ b/src/gallium/drivers/svga/svga_pipe_rasterizer.c
@@ -352,6 +352,11 @@ svga_create_rasterizer_state(struct pipe_context *pipe,
define_rasterizer_object(svga, rast);
}
+ if (templ->poly_smooth) {
+ pipe_debug_message(&svga->debug.callback, CONFORMANCE,
+ "GL_POLYGON_SMOOTH not supported");
+ }
+
svga->hud.num_state_objects++;
return rast;
diff --git a/src/gallium/drivers/svga/svga_state_need_swtnl.c b/src/gallium/drivers/svga/svga_state_need_swtnl.c
index 429241e64e2..b07c62da405 100644
--- a/src/gallium/drivers/svga/svga_state_need_swtnl.c
+++ b/src/gallium/drivers/svga/svga_state_need_swtnl.c
@@ -62,6 +62,7 @@ update_need_pipeline(struct svga_context *svga, unsigned dirty)
{
boolean need_pipeline = FALSE;
struct svga_vertex_shader *vs = svga->curr.vs;
+ const char *reason = "";
/* SVGA_NEW_RAST, SVGA_NEW_REDUCED_PRIMITIVE
*/
@@ -76,6 +77,20 @@ update_need_pipeline(struct svga_context *svga, unsigned dirty)
svga->curr.rast->need_pipeline_lines_str,
svga->curr.rast->need_pipeline_points_str);
need_pipeline = TRUE;
+
+ switch (svga->curr.reduced_prim) {
+ case PIPE_PRIM_POINTS:
+ reason = svga->curr.rast->need_pipeline_points_str;
+ break;
+ case PIPE_PRIM_LINES:
+ reason = svga->curr.rast->need_pipeline_lines_str;
+ break;
+ case PIPE_PRIM_TRIANGLES:
+ reason = svga->curr.rast->need_pipeline_tris_str;
+ break;
+ default:
+ assert(!"Unexpected reduced prim type");
+ }
}
/* EDGEFLAGS
@@ -83,6 +98,7 @@ update_need_pipeline(struct svga_context *svga, unsigned dirty)
if (vs && vs->base.info.writes_edgeflag) {
SVGA_DBG(DEBUG_SWTNL, "%s: edgeflags\n", __FUNCTION__);
need_pipeline = TRUE;
+ reason = "edge flags";
}
/* SVGA_NEW_FS, SVGA_NEW_RAST, SVGA_NEW_REDUCED_PRIMITIVE
@@ -104,6 +120,7 @@ update_need_pipeline(struct svga_context *svga, unsigned dirty)
* point stage.
*/
need_pipeline = TRUE;
+ reason = "point sprite coordinate generation";
}
}
@@ -116,6 +133,12 @@ update_need_pipeline(struct svga_context *svga, unsigned dirty)
if (0 && svga->state.sw.need_pipeline)
debug_printf("sw.need_pipeline = %d\n", svga->state.sw.need_pipeline);
+ if (svga->state.sw.need_pipeline) {
+ assert(reason);
+ pipe_debug_message(&svga->debug.callback, FALLBACK,
+ "Using semi-fallback for %s", reason);
+ }
+
return PIPE_OK;
}