summaryrefslogtreecommitdiff
path: root/drivers/gles_common/batch_diagnose.inc
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gles_common/batch_diagnose.inc')
-rw-r--r--drivers/gles_common/batch_diagnose.inc192
1 files changed, 192 insertions, 0 deletions
diff --git a/drivers/gles_common/batch_diagnose.inc b/drivers/gles_common/batch_diagnose.inc
new file mode 100644
index 0000000000..88a8792edb
--- /dev/null
+++ b/drivers/gles_common/batch_diagnose.inc
@@ -0,0 +1,192 @@
+void _debug_write_garbage() {
+ // extremely slow, writes garbage over arrays to detect using
+ // uninitialized in graphical output. Do not enable in normal use!!
+#ifdef RASTERIZER_EXTRA_CHECKS
+ int num_verts = MIN(bdata.vertices.max_size(), 32);
+ for (int n = 0; n < num_verts; n++) {
+ bdata.vertices[n].pos.set(Math::random(-200.0f, 200.0f), Math::random(-200.0f, 200.0f));
+ bdata.vertices[n].uv.set(Math::random(0.0f, 1.0f), Math::random(0.0f, 1.0f));
+ }
+
+ int num_colors = MIN(bdata.vertex_colors.max_size(), 32);
+ for (int n = 0; n < num_colors; n++) {
+ bdata.vertex_colors[n].set(Math::randf(), Math::randf(), Math::randf(), 1.0f);
+ }
+
+ int num_modulates = MIN(bdata.vertex_modulates.max_size(), 32);
+ for (int n = 0; n < num_modulates; n++) {
+ bdata.vertex_modulates[n].set(Math::randf(), Math::randf(), Math::randf(), 1.0f);
+ }
+
+ int num_light_angles = MIN(bdata.light_angles.max_size(), 32);
+ for (int n = 0; n < num_light_angles; n++) {
+ bdata.light_angles[n] = Math::random(-3.0f, +3.0f);
+ }
+
+ int num_transforms = MIN(bdata.vertex_transforms.max_size(), 32);
+ for (int n = 0; n < num_transforms; n++) {
+ bdata.vertex_transforms[n].translate.set(Math::random(-200.0f, 200.0f), Math::random(-200.0f, 200.0f));
+ bdata.vertex_transforms[n].basis[0].set(Math::random(-2.0f, 2.0f), Math::random(-2.0f, 2.0f));
+ bdata.vertex_transforms[n].basis[1].set(Math::random(-2.0f, 2.0f), Math::random(-2.0f, 2.0f));
+ }
+
+ int num_unit_verts = MIN(bdata.unit_vertices.max_size(), 32);
+ for (int n = 0; n < num_unit_verts; n++) {
+ uint8_t *data = bdata.unit_vertices.get_unit(n);
+ for (int b = 0; b > bdata.unit_vertices.get_unit_size_bytes(); b++) {
+ data[b] = Math::random(0, 255);
+ }
+ }
+
+#endif
+}
+
+String get_command_type_string(const RendererCanvasRender::Item::Command &p_command) const {
+ String sz = "";
+
+ switch (p_command.type) {
+ default:
+ break;
+#ifdef GODOT_3
+ case RendererCanvasRender::Item::Command::GD_TYPE_LINE: {
+ sz = "l";
+ } break;
+ case RendererCanvasRender::Item::Command::GD_TYPE_POLYLINE: {
+ sz = "PL";
+ } break;
+ case RendererCanvasRender::Item::Command::GD_TYPE_CIRCLE: {
+ sz = "c";
+ } break;
+#endif
+ case RendererCanvasRender::Item::Command::TYPE_RECT: {
+ sz = "r";
+ } break;
+ case RendererCanvasRender::Item::Command::TYPE_NINEPATCH: {
+ sz = "n";
+ } break;
+ case RendererCanvasRender::Item::Command::TYPE_PRIMITIVE: {
+ sz = "PR";
+ } break;
+ case RendererCanvasRender::Item::Command::TYPE_POLYGON: {
+ sz = "p";
+ } break;
+ case RendererCanvasRender::Item::Command::TYPE_MESH: {
+ sz = "m";
+ } break;
+ case RendererCanvasRender::Item::Command::TYPE_MULTIMESH: {
+ sz = "MM";
+ } break;
+ case RendererCanvasRender::Item::Command::TYPE_PARTICLES: {
+ sz = "PA";
+ } break;
+ case RendererCanvasRender::Item::Command::TYPE_TRANSFORM: {
+ sz = "t";
+
+ // add a bit more info in debug build
+ const RendererCanvasRender::Item::CommandTransform *transform = static_cast<const RendererCanvasRender::Item::CommandTransform *>(&p_command);
+ const Transform2D &mat = transform->xform;
+
+ sz += " ";
+ sz += String(Variant(mat.elements[2]));
+ sz += " ";
+ } break;
+ case RendererCanvasRender::Item::Command::TYPE_CLIP_IGNORE: {
+ sz = "CI";
+ } break;
+ } // switch
+
+ return sz;
+}
+
+void diagnose_batches(RendererCanvasRender::Item::Command *const *p_commands) {
+ int num_batches = bdata.batches.size();
+
+ BatchColor curr_color;
+ curr_color.set(Color(-1, -1, -1, -1));
+ bool first_color_change = true;
+
+ for (int batch_num = 0; batch_num < num_batches; batch_num++) {
+ const Batch &batch = bdata.batches[batch_num];
+ bdata.frame_string += "\t\t\tbatch ";
+
+ switch (batch.type) {
+ case RasterizerStorageCommon::BT_POLY: {
+ bdata.frame_string += "P ";
+ bdata.frame_string += itos(batch.first_command) + "-";
+ bdata.frame_string += itos(batch.num_commands);
+
+ bdata.frame_string += " " + batch.color.to_string();
+
+ if (batch.num_commands > 1) {
+ bdata.frame_string += " MULTI";
+ }
+ if (curr_color != batch.color) {
+ curr_color = batch.color;
+ if (!first_color_change) {
+ bdata.frame_string += " color";
+ } else {
+ first_color_change = false;
+ }
+ }
+ bdata.frame_string += "\n";
+ } break;
+ case RasterizerStorageCommon::BT_LINE:
+ case RasterizerStorageCommon::BT_LINE_AA: {
+ bdata.frame_string += "L ";
+ bdata.frame_string += itos(batch.first_command) + "-";
+ bdata.frame_string += itos(batch.num_commands);
+
+ bdata.frame_string += " " + batch.color.to_string();
+
+ if (batch.num_commands > 1) {
+ bdata.frame_string += " MULTI";
+ }
+ if (curr_color != batch.color) {
+ curr_color = batch.color;
+ if (!first_color_change) {
+ bdata.frame_string += " color";
+ } else {
+ first_color_change = false;
+ }
+ }
+ bdata.frame_string += "\n";
+ } break;
+ case RasterizerStorageCommon::BT_RECT: {
+ bdata.frame_string += "R ";
+ bdata.frame_string += itos(batch.first_command) + "-";
+ bdata.frame_string += itos(batch.num_commands);
+
+ int tex_id = (int)bdata.batch_textures[batch.batch_texture_id].RID_texture.get_id();
+ bdata.frame_string += " [" + itos(batch.batch_texture_id) + " - " + itos(tex_id) + "]";
+
+ bdata.frame_string += " " + batch.color.to_string();
+
+ if (batch.num_commands > 1) {
+ bdata.frame_string += " MULTI";
+ }
+ if (curr_color != batch.color) {
+ curr_color = batch.color;
+ if (!first_color_change) {
+ bdata.frame_string += " color";
+ } else {
+ first_color_change = false;
+ }
+ }
+ bdata.frame_string += "\n";
+ } break;
+ default: {
+ bdata.frame_string += "D ";
+ bdata.frame_string += itos(batch.first_command) + "-";
+ bdata.frame_string += itos(batch.num_commands) + " ";
+
+ int num_show = MIN(batch.num_commands, 16);
+ for (int n = 0; n < num_show; n++) {
+ const RendererCanvasRender::Item::Command &comm = *p_commands[batch.first_command + n];
+ bdata.frame_string += get_command_type_string(comm) + " ";
+ }
+
+ bdata.frame_string += "\n";
+ } break;
+ }
+ }
+}