buildSrc/src/main/java/com/sun/scenario/effect/compiler/backend/prism/PrismBackend.java

Print this page




  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;