⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shaderprogramretained.java

📁 JAVA3D矩陈的相关类
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		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 + -