45 */ 46 public class PrismBackend extends TreeScanner { 47 48 private JSLParser parser; 49 private StringBuilder usercode = new StringBuilder(); 50 private boolean isPixcoordReferenced = false; 51 52 public PrismBackend(JSLParser parser, ProgramUnit program) { 53 this.parser = parser; 54 scan(program); 55 } 56 57 private StringTemplate getTemplate(String type) { 58 Reader template = new InputStreamReader(getClass().getResourceAsStream(type + "Glue.stg")); 59 StringTemplateGroup group = new StringTemplateGroup(template, DefaultTemplateLexer.class); 60 return group.getInstanceOf("glue"); 61 } 62 63 public String getGlueCode(String effectName, 64 String peerName, 65 String interfaceName) 66 { 67 Map<String, Variable> vars = parser.getSymbolTable().getGlobalVariables(); 68 StringBuilder interfaceDecl = new StringBuilder(); 69 StringBuilder samplerLinear = new StringBuilder(); 70 StringBuilder samplerInit = new StringBuilder(); 71 StringBuilder paramInit = new StringBuilder(); 72 StringBuilder paramUpdate = new StringBuilder(); 73 74 for (Variable v : vars.values()) { 75 if (v.getQualifier() == Qualifier.PARAM) { 76 String vname = v.getName(); 77 if (v.getType().getBaseType() == BaseType.SAMPLER) { 78 samplerInit.append("samplers.put(\"" + vname + "\", " + v.getReg() + ");\n"); 79 if (v.getType() == Type.LSAMPLER || v.getType() == Type.FSAMPLER) { 80 samplerLinear.append("case " + v.getReg() + ":\n"); 81 samplerLinear.append(" return true;\n"); 82 } 83 } else { 84 String accName = v.getAccessorName(); 85 paramInit.append("params.put(\"" + vname + "\", " + v.getReg() + ");\n"); 86 if (v.isArray()) { 87 paramUpdate.append("shader.setConstants(\"" + vname); 99 } else { 100 paramUpdate.append("shader.setConstant(\"" + vname); 101 paramUpdate.append("\", " + accName + "());\n"); 102 } 103 } 104 } 105 } 106 107 int numSamplers = parser.getSymbolTable().getNumSamplers(); 108 String superClass; 109 if (numSamplers == 0) { 110 superClass = "PPSZeroSamplerPeer"; 111 } else if (numSamplers == 1) { 112 superClass = "PPSOneSamplerPeer"; 113 } else if (numSamplers == 2) { 114 superClass = "PPSTwoSamplerPeer"; 115 } else { 116 throw new RuntimeException("Must use zero, one, or two samplers (for now)"); 117 } 118 119 if (interfaceName != null) { 120 interfaceDecl.append("implements "+interfaceName); 121 } 122 123 StringTemplate glue = getTemplate("Prism"); 124 glue.setAttribute("effectName", effectName); 125 glue.setAttribute("peerName", peerName); 126 glue.setAttribute("superClass", superClass); 127 glue.setAttribute("interfaceDecl", interfaceDecl.toString()); 128 glue.setAttribute("usercode", usercode.toString()); 129 glue.setAttribute("samplerLinear", samplerLinear.toString()); 130 glue.setAttribute("samplerInit", samplerInit.toString()); 131 glue.setAttribute("paramInit", paramInit.toString()); 132 glue.setAttribute("paramUpdate", paramUpdate.toString()); 133 glue.setAttribute("isPixcoordUsed", isPixcoordReferenced); 134 return glue.toString(); 135 } 136 137 @Override 138 public void visitGlueBlock(GlueBlock b) { 139 usercode.append(b.getText()); 140 } 141 142 @Override 143 public void visitVariableExpr(VariableExpr e) { 144 String varName = e.getVariable().getName(); 145 if (varName.equals("pixcoord")) { 146 isPixcoordReferenced = true; | 45 */ 46 public class PrismBackend extends TreeScanner { 47 48 private JSLParser parser; 49 private StringBuilder usercode = new StringBuilder(); 50 private boolean isPixcoordReferenced = false; 51 52 public PrismBackend(JSLParser parser, ProgramUnit program) { 53 this.parser = parser; 54 scan(program); 55 } 56 57 private StringTemplate getTemplate(String type) { 58 Reader template = new InputStreamReader(getClass().getResourceAsStream(type + "Glue.stg")); 59 StringTemplateGroup group = new StringTemplateGroup(template, DefaultTemplateLexer.class); 60 return group.getInstanceOf("glue"); 61 } 62 63 public String getGlueCode(String effectName, 64 String peerName, 65 String genericsName, 66 String interfaceName) 67 { 68 Map<String, Variable> vars = parser.getSymbolTable().getGlobalVariables(); 69 StringBuilder genericsDecl = new StringBuilder(); 70 StringBuilder interfaceDecl = new StringBuilder(); 71 StringBuilder samplerLinear = new StringBuilder(); 72 StringBuilder samplerInit = new StringBuilder(); 73 StringBuilder paramInit = new StringBuilder(); 74 StringBuilder paramUpdate = new StringBuilder(); 75 76 for (Variable v : vars.values()) { 77 if (v.getQualifier() == Qualifier.PARAM) { 78 String vname = v.getName(); 79 if (v.getType().getBaseType() == BaseType.SAMPLER) { 80 samplerInit.append("samplers.put(\"" + vname + "\", " + v.getReg() + ");\n"); 81 if (v.getType() == Type.LSAMPLER || v.getType() == Type.FSAMPLER) { 82 samplerLinear.append("case " + v.getReg() + ":\n"); 83 samplerLinear.append(" return true;\n"); 84 } 85 } else { 86 String accName = v.getAccessorName(); 87 paramInit.append("params.put(\"" + vname + "\", " + v.getReg() + ");\n"); 88 if (v.isArray()) { 89 paramUpdate.append("shader.setConstants(\"" + vname); 101 } else { 102 paramUpdate.append("shader.setConstant(\"" + vname); 103 paramUpdate.append("\", " + accName + "());\n"); 104 } 105 } 106 } 107 } 108 109 int numSamplers = parser.getSymbolTable().getNumSamplers(); 110 String superClass; 111 if (numSamplers == 0) { 112 superClass = "PPSZeroSamplerPeer"; 113 } else if (numSamplers == 1) { 114 superClass = "PPSOneSamplerPeer"; 115 } else if (numSamplers == 2) { 116 superClass = "PPSTwoSamplerPeer"; 117 } else { 118 throw new RuntimeException("Must use zero, one, or two samplers (for now)"); 119 } 120 121 if (genericsName != null) { 122 genericsDecl.append("<"+genericsName+">"); 123 } 124 125 if (interfaceName != null) { 126 interfaceDecl.append("implements "+interfaceName); 127 } 128 129 StringTemplate glue = getTemplate("Prism"); 130 glue.setAttribute("effectName", effectName); 131 glue.setAttribute("peerName", peerName); 132 glue.setAttribute("superClass", superClass); 133 glue.setAttribute("genericsDecl", genericsDecl.toString()); 134 glue.setAttribute("interfaceDecl", interfaceDecl.toString()); 135 glue.setAttribute("usercode", usercode.toString()); 136 glue.setAttribute("samplerLinear", samplerLinear.toString()); 137 glue.setAttribute("samplerInit", samplerInit.toString()); 138 glue.setAttribute("paramInit", paramInit.toString()); 139 glue.setAttribute("paramUpdate", paramUpdate.toString()); 140 glue.setAttribute("isPixcoordUsed", isPixcoordReferenced); 141 return glue.toString(); 142 } 143 144 @Override 145 public void visitGlueBlock(GlueBlock b) { 146 usercode.append(b.getText()); 147 } 148 149 @Override 150 public void visitVariableExpr(VariableExpr e) { 151 String varName = e.getVariable().getName(); 152 if (varName.equals("pixcoord")) { 153 isPixcoordReferenced = true; |