📄 shaderprogramretained.java
字号:
shaders[i].clearLive(refCount); } } } /** * Method to enable the native shader program. */ private ShaderError enableShaderProgram(Canvas3D cv, int cvRdrIndex) { assert(cvRdrIndex >= 0); synchronized(resourceLock) { return enableShaderProgram(cv.ctx, shaderProgramData[cvRdrIndex].getShaderProgramId()); } } /** * Method to disable the native shader program. */ private ShaderError disableShaderProgram(Canvas3D cv) { return disableShaderProgram(cv.ctx); } /** * Initializes a mirror object. */ synchronized void initMirrorObject() { // Create mirror copy of shaders if (this.shaders == null) { ((ShaderProgramRetained)mirror).shaders = null; } else { ((ShaderProgramRetained)mirror).shaders = new ShaderRetained[this.shaders.length]; // Copy vertex and fragment shader for (int i = 0; i < this.shaders.length; i++) { ((ShaderProgramRetained)mirror).shaders[i] = (ShaderRetained)this.shaders[i].mirror; } } ((ShaderProgramRetained)mirror).shaderProgramData = null; // Create mirror copy of vertex attribute names if (this.vertexAttrNames == null) { ((ShaderProgramRetained)mirror).vertexAttrNames = null; } else { ((ShaderProgramRetained)mirror).vertexAttrNames = (String[])this.vertexAttrNames.clone(); } // Create mirror copy of shader attribute names if (this.shaderAttrNames == null) { ((ShaderProgramRetained)mirror).shaderAttrNames = null; } else { ((ShaderProgramRetained)mirror).shaderAttrNames = (String[])this.shaderAttrNames.clone(); } // Clear shader attribute error set ((ShaderProgramRetained)mirror).shaderAttrErrorSet = null; } /** * Update the "component" field of the mirror object with the given "value" */ synchronized void updateMirrorObject(int component, Object value) { // ShaderProgram can't be modified once it is live. assert(false); System.err.println("ShaderProgramRetained : updateMirrorObject NOT IMPLEMENTED YET"); } /** * Method to create a ShaderProgramData object for the specified * canvas/renderer if it doesn't already exist. * * Issue 378 : reset the ShaderProgramData object if the context * has been recreated for the particular canvas / renderer. */ private void createShaderProgramData(int cvRdrIndex, long ctxTimeStamp) { // Create shaderProgram resources if it has not been done. synchronized(resourceLock) { if(shaderProgramData == null) { // We rely on Java to initial the array elements to null. shaderProgramData = new ShaderProgramData[cvRdrIndex+1]; } else if(shaderProgramData.length <= cvRdrIndex) { // We rely on Java to initial the array elements to null. ShaderProgramData[] tempSPData = new ShaderProgramData[cvRdrIndex+1]; System.arraycopy(shaderProgramData, 0, tempSPData, 0, shaderProgramData.length); shaderProgramData = tempSPData; } if(shaderProgramData[cvRdrIndex] == null) { shaderProgramData[cvRdrIndex] = new ShaderProgramData(); } else if (shaderProgramData[cvRdrIndex].getCtxTimeStamp() != ctxTimeStamp) { // Issue 378 - reset the shader program data for this canvas / renderer // if the context has been recreated shaderProgramData[cvRdrIndex].reset(); } shaderProgramData[cvRdrIndex].setCtxTimeStamp(ctxTimeStamp); } } /** * Method to create the native shader program. We must already have * called createShaderProgramData for this cvRdrIndex. */ private ShaderError createShaderProgram(Canvas3D cv, int cvRdrIndex) { // Create shaderProgram resources if it has not been done. synchronized(resourceLock) { assert shaderProgramData[cvRdrIndex].getShaderProgramId() == null; ShaderProgramId[] spIdArr = new ShaderProgramId[1]; ShaderError err = createShaderProgram(cv.ctx, spIdArr); if(err != null) { return err; } shaderProgramData[cvRdrIndex].setShaderProgramId(spIdArr[0]); } return null; } /** * Method to link the native shader program. */ private ShaderError linkShaderProgram(Canvas3D cv, int cvRdrIndex, ShaderRetained[] shaders) { synchronized(resourceLock) { ShaderId[] shaderIds = new ShaderId[shaders.length]; for(int i=0; i<shaders.length; i++) { synchronized(shaders[i]) { shaderIds[i] = shaders[i].shaderData[cvRdrIndex].getShaderId(); } } ShaderError err = linkShaderProgram(cv.ctx, shaderProgramData[cvRdrIndex].getShaderProgramId(), shaderIds); if(err != null) { return err; } shaderProgramData[cvRdrIndex].setLinked(true); } return null; } private ShaderError bindVertexAttrName(Canvas3D cv, int cvRdrIndex, String attrName, int attrIndex) { assert(attrName != null); synchronized(resourceLock) { ShaderProgramId shaderProgramId = shaderProgramData[cvRdrIndex].getShaderProgramId();// System.err.println("attrName = " + attrName); ShaderError err = bindVertexAttrName(cv.ctx, shaderProgramId, attrName, attrIndex); if (err != null) { return err; } } return null; } private void lookupVertexAttrNames(Canvas3D cv, int cvRdrIndex, String[] attrNames) { synchronized(resourceLock) { ShaderProgramId shaderProgramId = shaderProgramData[cvRdrIndex].getShaderProgramId(); boolean[] errArr = new boolean[attrNames.length]; lookupVertexAttrNames(cv.ctx, shaderProgramId, attrNames, errArr); for (int i = 0; i < attrNames.length; i++) { // Report non-fatal error if detected if (errArr[i]) { String errMsg = "Vertex Attribute name lookup failed: " + attrNames[i]; ShaderError err = new ShaderError(ShaderError.VERTEX_ATTRIBUTE_LOOKUP_ERROR, errMsg); err.setShaderProgram((ShaderProgram)this.source); err.setCanvas3D(cv); notifyErrorListeners(cv, err); } } } } private void lookupShaderAttrNames(Canvas3D cv, int cvRdrIndex, String[] attrNames) { synchronized(resourceLock) { ShaderProgramId shaderProgramId = shaderProgramData[cvRdrIndex].getShaderProgramId(); AttrNameInfo[] attrNameInfoArr = new AttrNameInfo[attrNames.length]; lookupShaderAttrNames(cv.ctx, shaderProgramId, attrNames, attrNameInfoArr); for (int i = 0; i < attrNames.length; i++) { shaderProgramData[cvRdrIndex].setAttrNameInfo(attrNames[i], attrNameInfoArr[i]); // Report non-fatal error if location is invalid if (attrNameInfoArr[i].getLocation() == null) { String errMsg = "Attribute name lookup failed: " + attrNames[i]; ShaderError err = new ShaderError(ShaderError.SHADER_ATTRIBUTE_LOOKUP_ERROR, errMsg); err.setShaderProgram((ShaderProgram)this.source); err.setCanvas3D(cv); notifyErrorListeners(cv, err); } } } } /** * Method to return the shaderProgram data for the specified canvas or renderer */ private ShaderProgramData getShaderProgramData(int cvRdrIndex) { synchronized(resourceLock) { return shaderProgramData[cvRdrIndex]; } } /** * Method to create the native shader. We must already have * called createShaderData for this cvRdrIndex. */ private ShaderError createShader(Canvas3D cv, int cvRdrIndex, ShaderRetained shader) { // Create shaderProgram resources if it has not been done. synchronized(shader.resourceLock) { if (shader.shaderData[cvRdrIndex].getShaderId() != null) { // We have already created the shaderId for this Canvas. return null; } ShaderId[] shaderIdArr = new ShaderId[1]; ShaderError err = createShader(cv.ctx, shader, shaderIdArr); if(err != null) { return err; } shader.shaderData[cvRdrIndex].setShaderId(shaderIdArr[0]); } return null; } /** * Method to compile the native shader. */ private ShaderError compileShader(Canvas3D cv, int cvRdrIndex, ShaderRetained shader) { synchronized(shader.resourceLock) { if (shader.shaderData[cvRdrIndex].isCompiled()) { // We have already compiled the shaderId for this Canvas. return null; } String source = ((SourceCodeShaderRetained)shader).getShaderSource(); ShaderError err = compileShader(cv.ctx, shader.shaderData[cvRdrIndex].getShaderId(), source); if(err != null) { return err; } shader.shaderData[cvRdrIndex].setCompiled(true); } return null; } /** * Send a message to the notification thread, which will call the * shader error listeners. */ void notifyErrorListeners(Canvas3D cv, ShaderError err) { J3dNotification notification = new J3dNotification(); notification.type = J3dNotification.SHADER_ERROR; notification.universe = cv.view.universe; notification.args[0] = err; VirtualUniverse.mc.sendNotification(notification); } /** * This method checks whether this ShaderProgram is supported on * the specified Canvas. If it isn't supported, it will report a * ShaderError unless an error has already been reported for this * shader program. */ private boolean verifyShaderProgramSupported(Canvas3D cv) { boolean supported = isSupported(cv); if (!supported && !unsupportedErrorReported) { String errorMsg = J3dI18N.getString("ShaderProgramRetained0"); ShaderError err = new ShaderError(ShaderError.UNSUPPORTED_LANGUAGE_ERROR, errorMsg); err.setShaderProgram((ShaderProgram)this.source); err.setCanvas3D(cv); notifyErrorListeners(cv, err); unsupportedErrorReported = true; } return supported; } /** * Method to destroy the native shader. */ void destroyShader(Canvas3D cv, int cvRdrIndex, ShaderRetained shader) { if (!verifyShaderProgramSupported(cv)) { return; } // Destroy shader resource if it exists synchronized(shader.resourceLock) { // Check whether an entry in the shaderData array has been allocated if (shader.shaderData == null || shader.shaderData.length <= cvRdrIndex || shader.shaderData[cvRdrIndex] == null) { return; } // Nothing to do if the shaderId is null if (shader.shaderData[cvRdrIndex].getShaderId() == null) { return; } // Destroy the native resource and set the ID to null for this canvas/renderer // Ignore any possible shader error, because there is no meaningful way to report it destroyShader(cv.ctx, shader.shaderData[cvRdrIndex].getShaderId()); shader.shaderData[cvRdrIndex].reset(); } } /** * Method to destroy the native shader program. */ void destroyShaderProgram(Canvas3D cv, int cvRdrIndex) { if (!verifyShaderProgramSupported(cv)) { return; } // Destroy shaderProgram resource if it exists synchronized(resourceLock) { assert(shaderProgramData != null && shaderProgramData.length > cvRdrIndex && shaderProgramData[cvRdrIndex] != null);// // Check whether an entry in the shaderProgramData array has been allocated// if (shaderProgramData == null ||// shaderProgramData.length <= cvRdrIndex ||// shaderProgramData[cvRdrIndex] == null) {// return;// } ShaderProgramId shaderProgramId = shaderProgramData[cvRdrIndex].getShaderProgramId(); // Nothing to do if the shaderProgramId is null if (shaderProgramId == null) { return; } // Destroy the native resource, set the ID to null for this canvas/renderer, // and clear the bit in the resourceCreationMask // Ignore any possible shader error, because there is no meaningful way to report it destroyShaderProgram(cv.ctx, shaderProgramId); // Reset this ShaderProgramData object. shaderProgramData[cvRdrIndex].reset(); } } /** * updateNative is called while traversing the RenderBin to * update the shader program state */ void updateNative(Canvas3D cv, boolean enable) { // System.err.println("ShaderProgramRetained.updateNative : "); final boolean useSharedCtx = cv.useSharedCtx && cv.screen.renderer.sharedCtx != null; int cvRdrIndex; long ctxTimeStamp; if (useSharedCtx) { cvRdrIndex = cv.screen.renderer.rendererId; ctxTimeStamp = cv.screen.renderer.sharedCtxTimeStamp; } else { cvRdrIndex = cv.canvasId; ctxTimeStamp = cv.ctxTimeStamp; } // Create ShaderProgramData object for this canvas/renderer if it doesn't already exist createShaderProgramData(cvRdrIndex, ctxTimeStamp); // Check whether this shader program type is supported for this canvas if (!verifyShaderProgramSupported(cv)) { return; } // Just disable shader program and return if enable parameter is set to false if (!enable) { // Given the current design, disableShaderProgram cannot return a non-null value, // so no need to check it disableShaderProgram(cv); return; } // Just disable shader program and return if array of shaders is empty, // or if a previous attempt to link resulted in an error if (shaders == null || shaders.length == 0 || linkErrorOccurred) { disableShaderProgram(cv); return; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -