From f7a6b626aa97e07aadafd36f8e1ca5b7e3955f93 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Wed, 13 Apr 2011 10:37:13 +0100 Subject: [PATCH] Show shader type in the combo box. --- glstate.py | 85 +++++++++++++++++++++++++------------ gui/apitracecall.cpp | 17 ++++---- gui/apitracecall.h | 4 +- gui/mainwindow.cpp | 2 +- gui/shaderssourcewidget.cpp | 18 ++++---- gui/shaderssourcewidget.h | 6 +-- 6 files changed, 80 insertions(+), 52 deletions(-) diff --git a/glstate.py b/glstate.py index 9f68393..e142f6b 100644 --- a/glstate.py +++ b/glstate.py @@ -3009,48 +3009,79 @@ class StateDumper: print '#include "glretrace.hpp"' print - print 'static void' - print 'writeEnum(JSONWriter &json, GLenum pname)' + print 'static const char *' + print '_enum_string(GLenum pname)' print '{' print ' switch(pname) {' for name in GLenum.values: print ' case %s:' % name - print ' json.writeString("%s");' % name - print ' break;' + print ' return "%s";' % name print ' default:' - print ' json.writeNumber(pname);' + print ' return NULL;' print ' }' print '}' print - # shaders - print 'static void' - print 'writeShader(JSONWriter &json, GLuint shader)' + print 'static const char *' + print 'enum_string(GLenum pname)' print '{' - print ' if (!shader) {' - print ' json.writeNull();' - print ' return;' + print ' const char *s = _enum_string(pname);' + print ' if (s) {' + print ' return s;' + print ' } else {' + print ' static char buf[16];' + print ' snprintf(buf, sizeof buf, "0x%04x", pname);' + print ' return buf;' print ' }' + print '}' print - print ' json.beginObject();' - print ' GLint source_length = 0;' - print ' glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &source_length);' - print ' json.beginMember("source");' - print ' if (source_length) {' - print ' GLchar *source = new GLchar[source_length];' - print ' GLsizei length = 0;' - print ' source[0] = 0;' - print ' glGetShaderSource(shader, source_length, &length, source);' - print ' json.writeString(source);' - print ' delete [] source;' + + print 'static inline void' + print 'writeEnum(JSONWriter &json, GLenum pname)' + print '{' + print ' const char *s = _enum_string(pname);' + print ' if (s) {' + print ' json.writeString(s);' print ' } else {' - print ' json.writeNull();' + print ' json.writeNumber(pname);' print ' }' - print ' json.endMember(); // source' - print ' json.endObject();' print '}' print + # shaders + print ''' +static void +writeShader(JSONWriter &json, GLuint shader) +{ + if (!shader) { + return; + } + + GLint shader_type = 0; + glGetShaderiv(shader, GL_SHADER_TYPE, &shader_type); + if (!shader_type) { + return; + } + + GLint source_length = 0; + glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &source_length); + if (!source_length) { + return; + } + + GLchar *source = new GLchar[source_length]; + GLsizei length = 0; + source[0] = 0; + glGetShaderSource(shader, source_length, &length, source); + + json.beginMember(enum_string(shader_type)); + json.writeString(source); + json.endMember(); + + delete [] source; +} +''' + # programs print 'static inline void' print 'writeProgram(JSONWriter &json, GLuint program)' @@ -3064,7 +3095,7 @@ class StateDumper: print ' json.beginMember("attached_shaders");' print ' GLint attached_shaders = 0;' print ' glGetProgramiv(program, GL_ATTACHED_SHADERS, &attached_shaders);' - print ' json.beginArray();' + print ' json.beginObject();' print ' if (attached_shaders) {' print ' GLuint *shaders = new GLuint[attached_shaders];' print ' GLsizei count = 0;' @@ -3074,7 +3105,7 @@ class StateDumper: print ' }' print ' delete [] shaders;' print ' }' - print ' json.endArray();' + print ' json.endObject();' print ' json.endMember();' print ' json.endObject();' print '}' diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index fcc61cc..871dfde 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -432,21 +432,21 @@ ApiTraceState::ApiTraceState(const QVariantMap &parsedJson) m_parameters = parsedJson[QLatin1String("parameters")].toMap(); QVariantMap currentProgram = parsedJson[QLatin1String("current_program")].toMap(); - QVariantList attachedShaders = - currentProgram[QLatin1String("attached_shaders")].toList(); + QVariantMap attachedShaders = + currentProgram[QLatin1String("attached_shaders")].toMap(); + QVariantMap::const_iterator itr; - for (int i = 0; i < attachedShaders.count(); ++i) { - QVariantMap var = attachedShaders[i].toMap(); - m_shaderSources.append( - var[QLatin1String("source")].toString()); + for (itr = attachedShaders.constBegin(); itr != attachedShaders.constEnd(); ++itr) { + QString type = itr.key(); + QString source = itr.value().toString(); + m_shaderSources[type] = source; } QVariantList textureUnits = parsedJson[QLatin1String("textures")].toList(); for (int i = 0; i < textureUnits.count(); ++i) { QVariantMap unit = textureUnits[i].toMap(); - QVariantMap::const_iterator itr; for (itr = unit.constBegin(); itr != unit.constEnd(); ++itr) { QVariantMap target = itr.value().toMap(); if (target.count()) { @@ -485,7 +485,6 @@ ApiTraceState::ApiTraceState(const QVariantMap &parsedJson) QVariantMap fbos = parsedJson[QLatin1String("framebuffer")].toMap(); - QVariantMap::const_iterator itr; for (itr = fbos.constBegin(); itr != fbos.constEnd(); ++itr) { QVariantMap buffer = itr.value().toMap(); QSize size(buffer[QLatin1String("__width__")].toInt(), @@ -515,7 +514,7 @@ QVariantMap ApiTraceState::parameters() const return m_parameters; } -QStringList ApiTraceState::shaderSources() const +QMap ApiTraceState::shaderSources() const { return m_shaderSources; } diff --git a/gui/apitracecall.h b/gui/apitracecall.h index 975c3f6..db5d38d 100644 --- a/gui/apitracecall.h +++ b/gui/apitracecall.h @@ -110,13 +110,13 @@ public: bool isEmpty() const; QVariantMap parameters() const; - QStringList shaderSources() const; + QMap shaderSources() const; QList textures() const; QList framebuffers() const; private: QVariantMap m_parameters; - QStringList m_shaderSources; + QMap m_shaderSources; QList m_textures; QList m_framebuffers; }; diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 8269bfd..7c954d7 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -343,7 +343,7 @@ void MainWindow::fillStateForFrame() } m_ui.stateTreeWidget->insertTopLevelItems(0, items); - QStringList shaderSources = state.shaderSources(); + QMap shaderSources = state.shaderSources(); if (shaderSources.isEmpty()) { m_sourcesWidget->setShaders(shaderSources); } else { diff --git a/gui/shaderssourcewidget.cpp b/gui/shaderssourcewidget.cpp index 5003dda..88ed1b6 100644 --- a/gui/shaderssourcewidget.cpp +++ b/gui/shaderssourcewidget.cpp @@ -11,11 +11,11 @@ ShadersSourceWidget::ShadersSourceWidget(QWidget *parent) m_ui.verticalLayout->addWidget(m_edit); - connect(m_ui.shadersCB, SIGNAL(currentIndexChanged(int)), - SLOT(changeShader(int))); + connect(m_ui.shadersCB, SIGNAL(currentIndexChanged(const QString &)), + SLOT(changeShader(const QString &))); } -void ShadersSourceWidget::setShaders(const QStringList &sources) +void ShadersSourceWidget::setShaders(const QMap &sources) { m_sources = sources; @@ -32,18 +32,16 @@ void ShadersSourceWidget::setShaders(const QStringList &sources) m_ui.shadersCB->setEnabled(true); m_edit->setEnabled(true); - for (int i = 0; i < m_sources.count(); ++i) { - QString source = m_sources[i]; - m_ui.shadersCB->insertItem( - i, - tr("Shader %1").arg(i)); + QMap::const_iterator itr; + for (itr = m_sources.constBegin(); itr != m_sources.constEnd(); ++itr) { + m_ui.shadersCB->addItem(itr.key()); } m_ui.shadersCB->setCurrentIndex(0); } -void ShadersSourceWidget::changeShader(int idx) +void ShadersSourceWidget::changeShader(const QString &key) { - m_edit->setPlainText(m_sources.value(idx)); + m_edit->setPlainText(m_sources.value(key)); } #include "shaderssourcewidget.moc" diff --git a/gui/shaderssourcewidget.h b/gui/shaderssourcewidget.h index c4bc3eb..9a5c322 100644 --- a/gui/shaderssourcewidget.h +++ b/gui/shaderssourcewidget.h @@ -13,13 +13,13 @@ public: ShadersSourceWidget(QWidget *parent=0); public slots: - void setShaders(const QStringList &sources); + void setShaders(const QMap &sources); private slots: - void changeShader(int idx); + void changeShader(const QString &key); private: Ui::ShadersSourceWidget m_ui; - QStringList m_sources; + QMap m_sources; GLSLEdit *m_edit; }; -- 2.43.0