📄 shaderprogramretained.java
字号:
boolean loadShaderProgram = false; // flag indicating whether to reload all shaderProgram states if (getShaderProgramData(cvRdrIndex).getShaderProgramId() == null) { loadShaderProgram = true; } //System.err.println(".... loadShaderProgram = " + loadShaderProgram); //System.err.println(".... resourceCreationMask= " + resourceCreationMask); ShaderError err = null; boolean errorOccurred = false; if (loadShaderProgram) { if (useSharedCtx) { // TODO : Need to test useSharedCtx case. ** Untested case ** cv.makeCtxCurrent(cv.screen.renderer.sharedCtx); } // Create shader resources if not already done for(int i=0; i < shaders.length; i++) { // Create ShaderProgramData object for this canvas/renderer if it doesn't already exist shaders[i].createShaderData(cvRdrIndex, ctxTimeStamp); if (shaders[i].compileErrorOccurred) { errorOccurred = true; } else { err = createShader(cv, cvRdrIndex, shaders[i]); if (err != null) { err.setShaderProgram((ShaderProgram)this.source); err.setShader((Shader)shaders[i].source); err.setCanvas3D(cv); notifyErrorListeners(cv, err); errorOccurred = true; } else { err = compileShader(cv, cvRdrIndex, shaders[i]); if (err != null) { err.setShaderProgram((ShaderProgram)this.source); err.setShader((Shader)shaders[i].source); err.setCanvas3D(cv); notifyErrorListeners(cv, err); destroyShader(cv, cvRdrIndex, shaders[i]); shaders[i].compileErrorOccurred = true; errorOccurred = true; } } } } // Create shader program if (!errorOccurred) { err = createShaderProgram(cv, cvRdrIndex); if (err != null) { err.setShaderProgram((ShaderProgram)this.source); err.setCanvas3D(cv); notifyErrorListeners(cv, err); errorOccurred = true; } } boolean linked = getShaderProgramData(cvRdrIndex).isLinked(); if (!linked) { // Bind vertex attribute names if (!errorOccurred) { if (vertexAttrNames != null) {// System.err.println("vertexAttrNames.length = " + vertexAttrNames.length); for (int i = 0; i < vertexAttrNames.length; i++) { err = bindVertexAttrName(cv, cvRdrIndex, vertexAttrNames[i], i); // Report non-fatal error, if one was detected if (err != null) { err.setShaderProgram((ShaderProgram)this.source); err.setCanvas3D(cv); notifyErrorListeners(cv, err); } } } } // Link shader program if (!errorOccurred) { err = linkShaderProgram(cv, cvRdrIndex, shaders); if (err != null) { err.setShaderProgram((ShaderProgram)this.source); err.setCanvas3D(cv); notifyErrorListeners(cv, err); destroyShaderProgram(cv, cvRdrIndex); linkErrorOccurred = true; errorOccurred = true; } } // lookup vertex attribute names if (!errorOccurred) { if (vertexAttrNames != null) { lookupVertexAttrNames(cv, cvRdrIndex, vertexAttrNames); } } // Lookup shader attribute names if (!errorOccurred) { if (shaderAttrNames != null) {// System.err.println("shaderAttrNames.length = " + shaderAttrNames.length); lookupShaderAttrNames(cv, cvRdrIndex, shaderAttrNames); } } } // Restore current context if we changed it to the shareCtx if (useSharedCtx) { cv.makeCtxCurrent(cv.ctx); } // If compilation or link error occured, disable shader program and return if (errorOccurred) { disableShaderProgram(cv); return; } } // Now we can enable the shader program enableShaderProgram(cv, cvRdrIndex); } /** * Update native value for ShaderAttributeValue class */ ShaderError setUniformAttrValue(Context ctx, ShaderProgramId shaderProgramId, ShaderAttrLoc loc, ShaderAttributeValueRetained sav) { switch (sav.getClassType()) { case ShaderAttributeObjectRetained.TYPE_INTEGER: return setUniform1i(ctx, shaderProgramId, loc, ((int[])sav.attrWrapper.getRef())[0]); case ShaderAttributeObjectRetained.TYPE_FLOAT: return setUniform1f(ctx, shaderProgramId, loc, ((float[])sav.attrWrapper.getRef())[0]); case ShaderAttributeObjectRetained.TYPE_TUPLE2I: return setUniform2i(ctx, shaderProgramId, loc, (int[])sav.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_TUPLE2F: return setUniform2f(ctx, shaderProgramId, loc, (float[])sav.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_TUPLE3I: return setUniform3i(ctx, shaderProgramId, loc, (int[])sav.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_TUPLE3F: return setUniform3f(ctx, shaderProgramId, loc, (float[])sav.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_TUPLE4I: return setUniform4i(ctx, shaderProgramId, loc, (int[])sav.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_TUPLE4F: return setUniform4f(ctx, shaderProgramId, loc, (float[])sav.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_MATRIX3F: return setUniformMatrix3f(ctx, shaderProgramId, loc, (float[])sav.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_MATRIX4F: return setUniformMatrix4f(ctx, shaderProgramId, loc, (float[])sav.attrWrapper.getRef()); default: // Should never get here assert false : "Unrecognized ShaderAttributeValue classType"; return null; } } /** * Update native value for ShaderAttributeArray class */ ShaderError setUniformAttrArray(Context ctx, ShaderProgramId shaderProgramId, ShaderAttrLoc loc, ShaderAttributeArrayRetained saa) { switch (saa.getClassType()) { case ShaderAttributeObjectRetained.TYPE_INTEGER: return setUniform1iArray(ctx, shaderProgramId, loc, saa.length(), ((int[])saa.attrWrapper.getRef())); case ShaderAttributeObjectRetained.TYPE_FLOAT: return setUniform1fArray(ctx, shaderProgramId, loc, saa.length(), ((float[])saa.attrWrapper.getRef())); case ShaderAttributeObjectRetained.TYPE_TUPLE2I: return setUniform2iArray(ctx, shaderProgramId, loc, saa.length(), (int[])saa.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_TUPLE2F: return setUniform2fArray(ctx, shaderProgramId, loc, saa.length(), (float[])saa.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_TUPLE3I: return setUniform3iArray(ctx, shaderProgramId, loc, saa.length(), (int[])saa.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_TUPLE3F: return setUniform3fArray(ctx, shaderProgramId, loc, saa.length(), (float[])saa.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_TUPLE4I: return setUniform4iArray(ctx, shaderProgramId, loc, saa.length(), (int[])saa.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_TUPLE4F: return setUniform4fArray(ctx, shaderProgramId, loc, saa.length(), (float[])saa.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_MATRIX3F: return setUniformMatrix3fArray(ctx, shaderProgramId, loc, saa.length(), (float[])saa.attrWrapper.getRef()); case ShaderAttributeObjectRetained.TYPE_MATRIX4F: return setUniformMatrix4fArray(ctx, shaderProgramId, loc, saa.length(), (float[])saa.attrWrapper.getRef()); default: // Should never get here assert false : "Unrecognized ShaderAttributeArray classType"; return null; } } void setShaderAttributes(Canvas3D cv, ShaderAttributeSetRetained attributeSet) { final boolean useSharedCtx = cv.useSharedCtx && cv.screen.renderer.sharedCtx != null; final int cvRdrIndex = useSharedCtx ? cv.screen.renderer.rendererId : cv.canvasId; ShaderProgramData spData = getShaderProgramData(cvRdrIndex); // Just return if shader program wasn't linked successfully if (!spData.isLinked()) { return; } ShaderProgramId shaderProgramId = spData.getShaderProgramId(); Iterator attrs = attributeSet.getAttrs().values().iterator(); while (attrs.hasNext()) { ShaderError err = null; ShaderAttributeRetained saRetained = (ShaderAttributeRetained)attrs.next(); // Lookup attribute info for the specified attrName; null means // that the name does not appear in the ShaderProgram, so we will // report an error. AttrNameInfo attrNameInfo = spData.getAttrNameInfo(saRetained.getAttributeName()); if(attrNameInfo == null) {// System.err.println("ShaderProgramRetained : attrLocation (" + saRetained.getAttributeName() + ") is null."); String errMsg = "Attribute name not set in ShaderProgram: " + saRetained.getAttributeName(); // TODO: I18N err = new ShaderError(ShaderError.SHADER_ATTRIBUTE_NAME_NOT_SET_ERROR, errMsg); } else { ShaderAttrLoc loc = attrNameInfo.getLocation(); if (loc != null) { if (saRetained instanceof ShaderAttributeValueRetained) { ShaderAttributeValueRetained savRetained = (ShaderAttributeValueRetained)saRetained; if (attrNameInfo.isArray() || (savRetained.getClassType() != attrNameInfo.getType())) { String errMsg = "Attribute type mismatch: " + savRetained.getAttributeName(); // TODO: I18N err = new ShaderError(ShaderError.SHADER_ATTRIBUTE_TYPE_ERROR, errMsg); } else { err = setUniformAttrValue(cv.ctx, shaderProgramId, loc, savRetained); } } else if (saRetained instanceof ShaderAttributeArrayRetained) { ShaderAttributeArrayRetained saaRetained = (ShaderAttributeArrayRetained)saRetained; if (!attrNameInfo.isArray() || (saaRetained.getClassType() != attrNameInfo.getType())) { String errMsg = "Attribute type mismatch: " + saaRetained.getAttributeName(); // TODO: I18N err = new ShaderError(ShaderError.SHADER_ATTRIBUTE_TYPE_ERROR, errMsg); } else { err = setUniformAttrArray(cv.ctx, shaderProgramId, loc, saaRetained); } } else if (saRetained instanceof ShaderAttributeBindingRetained) { assert false; throw new RuntimeException("not implemented"); } else { assert false; } } } if (err != null) { // Before reporting the ShaderAttribute error, check // whether it has already been reported for this ShaderProgram if (shaderAttrErrorSet == null) { shaderAttrErrorSet = new HashSet(); } if (shaderAttrErrorSet.add(saRetained.source)) { err.setShaderProgram((ShaderProgram)this.source); err.setShaderAttributeSet((ShaderAttributeSet)attributeSet.source); err.setShaderAttribute((ShaderAttribute)saRetained.source); err.setCanvas3D(cv); notifyErrorListeners(cv, err); } } } } class ShaderProgramData extends Object { // issue 378 - time stamp of context creation for this Canvas private long ctxTimeStamp; // shaderProgramId use by native code. private ShaderProgramId shaderProgramId = null; // linked flag for native. private boolean linked = false; // A map of locations for ShaderAttributes. private HashMap attrNameInfoMap = new HashMap(); /** ShaderProgramData Constructor */ ShaderProgramData() { } void reset() { ctxTimeStamp = 0L; shaderProgramId = null; linked = false; attrNameInfoMap.clear(); } long getCtxTimeStamp() { return ctxTimeStamp; } void setCtxTimeStamp(long ctxTimeStamp) { this.ctxTimeStamp = ctxTimeStamp; } void setShaderProgramId(ShaderProgramId shaderProgramId) { this.shaderProgramId = shaderProgramId; } ShaderProgramId getShaderProgramId() { return this.shaderProgramId; } void setLinked(boolean linked) { this.linked = linked; } boolean isLinked() { return linked; } void setAttrNameInfo(String shaderAttribute, AttrNameInfo attrNameInfo) { assert(shaderAttribute != null); attrNameInfoMap.put(shaderAttribute, attrNameInfo); } AttrNameInfo getAttrNameInfo(String shaderAttribute) { return (AttrNameInfo) attrNameInfoMap.get(shaderAttribute); } } // Data associated with an attribute name class AttrNameInfo { void setLocation(ShaderAttrLoc loc) { this.loc = loc; } ShaderAttrLoc getLocation() { return loc; } void setType(int type) { this.type = type; } int getType() { return type; } boolean isArray() { return isArray; } void setArray(boolean isArray) { this.isArray = isArray; } // Location of attribute name in linked shader program private ShaderAttrLoc loc; // boolean indicating whether the attribute is an array private boolean isArray; // type of shader attribute private int type; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -