jme3tools.shadercheck.GpuAnalyzerValidator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jme3-core Show documentation
Show all versions of jme3-core Show documentation
jMonkeyEngine is a 3-D game engine for adventurous Java developers
package jme3tools.shadercheck;
import com.jme3.shader.Shader;
import com.jme3.shader.Shader.ShaderSource;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Shader validator implementation for AMD's GPUShaderAnalyser.
*
* @author Kirill Vainer
*/
public class GpuAnalyzerValidator implements Validator {
private static final Logger logger = Logger.getLogger(CgcValidator.class.getName());
private static String version;
private static String checkGpuAnalyzerVersion(){
try {
ProcessBuilder pb = new ProcessBuilder("GPUShaderAnalyzer", "-ListModules");
Process p = pb.start();
Scanner scan = new Scanner(p.getInputStream());
String ln = scan.nextLine();
scan.close();
p.destroy();
return ln;
} catch (IOException ex) {
logger.log(Level.SEVERE, "IOEx", ex);
}
return null;
}
@Override
public String getName() {
return "AMD GPU Shader Analyzer";
}
@Override
public boolean isInstalled() {
return getInstalledVersion() != null;
}
@Override
public String getInstalledVersion() {
if (version == null){
version = checkGpuAnalyzerVersion();
}
return version;
}
private static void executeAnalyzer(String sourceCode, String language, String defines, String asic, StringBuilder results){
try {
// Export sourcecode to temporary file
File tempFile = File.createTempFile("test_shader", ".glsl");
FileWriter writer = new FileWriter(tempFile);
String glslVer = language.substring(4);
writer.append("#version ").append(glslVer).append('\n');
writer.append("#extension all : warn").append('\n');
writer.append(defines).append('\n');
writer.write(sourceCode);
writer.close();
ProcessBuilder pb = new ProcessBuilder("GPUShaderAnalyzer",
tempFile.getAbsolutePath(),
"-I",
"-ASIC", asic);
Process p = pb.start();
Scanner scan = new Scanner(p.getInputStream());
if (!scan.hasNextLine()){
String x = scan.next();
System.out.println(x);
}
String ln = scan.nextLine();
if (ln.startsWith(";")){
results.append(" - Success!").append('\n');
}else{
results.append(" - Failure!").append('\n');
results.append(ln).append('\n');
while (scan.hasNextLine()){
results.append(scan.nextLine()).append('\n');
}
}
scan.close();
p.getOutputStream().close();
p.getErrorStream().close();
p.waitFor();
p.destroy();
tempFile.delete();
} catch (InterruptedException ex) {
} catch (IOException ex) {
logger.log(Level.SEVERE, "IOEx", ex);
}
}
@Override
public void validate(Shader shader, StringBuilder results) {
for (ShaderSource source : shader.getSources()){
results.append("Checking: ").append(source.getName());
switch (source.getType()){
case Fragment:
executeAnalyzer(source.getSource(), source.getLanguage(), source.getDefines(), "HD5770", results);
break;
case Vertex:
executeAnalyzer(source.getSource(), source.getLanguage(), source.getDefines(), "HD5770", results);
break;
}
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy