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)'
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;'
print ' }'
print ' delete [] shaders;'
print ' }'
- print ' json.endArray();'
+ print ' json.endObject();'
print ' json.endMember();'
print ' json.endObject();'
print '}'
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()) {
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(),
return m_parameters;
}
-QStringList ApiTraceState::shaderSources() const
+QMap<QString, QString> ApiTraceState::shaderSources() const
{
return m_shaderSources;
}
bool isEmpty() const;
QVariantMap parameters() const;
- QStringList shaderSources() const;
+ QMap<QString, QString> shaderSources() const;
QList<ApiTexture> textures() const;
QList<ApiFramebuffer> framebuffers() const;
private:
QVariantMap m_parameters;
- QStringList m_shaderSources;
+ QMap<QString, QString> m_shaderSources;
QList<ApiTexture> m_textures;
QList<ApiFramebuffer> m_framebuffers;
};
}
m_ui.stateTreeWidget->insertTopLevelItems(0, items);
- QStringList shaderSources = state.shaderSources();
+ QMap<QString, QString> shaderSources = state.shaderSources();
if (shaderSources.isEmpty()) {
m_sourcesWidget->setShaders(shaderSources);
} else {
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<QString, QString> &sources)
{
m_sources = 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<QString, QString>::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"
ShadersSourceWidget(QWidget *parent=0);
public slots:
- void setShaders(const QStringList &sources);
+ void setShaders(const QMap<QString, QString> &sources);
private slots:
- void changeShader(int idx);
+ void changeShader(const QString &key);
private:
Ui::ShadersSourceWidget m_ui;
- QStringList m_sources;
+ QMap<QString, QString> m_sources;
GLSLEdit *m_edit;
};