bool GLProgram::link() { CCASSERT(_program != 0, "Cannot link invalid program"); GLint status = GL_TRUE; bindPredefinedVertexAttribs(); glLinkProgram(_program); // Calling glGetProgramiv(...GL_LINK_STATUS...) will force linking of the program at this moment. // Otherwise, they might be linked when they are used for the first time. (I guess this depends on the driver implementation) // So it might slow down the "booting" process on certain devices. But, on the other hand it is important to know if the shader // linked successfully. Some shaders might be downloaded in runtime so, release version should have this check. // For more info, see Github issue #16231 glGetProgramiv(_program, GL_LINK_STATUS, &status); if (status == GL_FALSE) { CCLOG("cocos2d: ERROR: Failed to link program: %i", _program); GL::deleteProgram(_program); _program = 0; } else { parseVertexAttribs(); parseUniforms(); clearShader(); } return (status == GL_TRUE); }
bool GLProgram::link() { CCASSERT(_program != 0, "Cannot link invalid program"); GLint status = GL_TRUE; bindPredefinedVertexAttribs(); glLinkProgram(_program); parseVertexAttribs(); parseUniforms(); clearShader(); #if DEBUG || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) glGetProgramiv(_program, GL_LINK_STATUS, &status); if (status == GL_FALSE) { CCLOG("cocos2d: ERROR: Failed to link program: %i", _program); GL::deleteProgram(_program); _program = 0; } #endif return (status == GL_TRUE); }
void CD3D11Driver::beginScene( bool zBuffer, bool stencilBuffer, const f32 clearColor[], f32 depthValue, u8 stencilValue) { //md3dDeviceContext->ClearRenderTargetView(mDefaultRenderTargetView, clearColor); UINT clearFlag = 0; if (zBuffer) clearFlag |= D3D11_CLEAR_DEPTH; if (stencilBuffer) clearFlag |= D3D11_CLEAR_STENCIL; //md3dDeviceContext->ClearDepthStencilView(mDepthStencilView, clearFlag, depthValue, stencilValue); D3D11DriverState.Reset(); for (u32 i = 0; i <= EST_SHADER_COUNT; i++) clearShader((E_SHADER_TYPE)i); mCurrentPipelineUsage = EPU_FORWARD; setDefaultRenderTargetAndDepthStencil(); // if it is deferred shading, setup gbuffer if (mDeferredShading) { setupGBuffer(); } md3dDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); md3dDeviceContext->ClearRenderTargetView(mDefaultRenderTargetView, clearColor); md3dDeviceContext->ClearDepthStencilView(mDefaultDepthStencilView, clearFlag, depthValue, stencilValue); }
GLProgram::~GLProgram() { CCLOGINFO("%s %d deallocing GLProgram: %p", __FUNCTION__, __LINE__, this); clearShader(); if (_program) { GL::deleteProgram(_program); } clearHashUniforms(); }
GLProgram::~GLProgram() { CCLOGINFO("%s %d deallocing GLProgram: %p", __FUNCTION__, __LINE__, this); clearShader(); if (_program) { GL::deleteProgram(_program); } for (auto e : _hashForUniforms) { free(e.second.first); } _hashForUniforms.clear(); }
void surfaceShader::rebuild() { clearShader(); if( isValidForFragmentCompile() ) { compileFragment(); if( this->sizeErrors() ) { return; } if( isValidForVertexCompile() ) { compileVertex(); if( this->sizeErrors() ) { return; } } linkProgram(); } }
CD3D11Driver::~CD3D11Driver() { /* 释放的顺序 1, mesh 2, material 3, pipeline 4, texture 5, shader, 6, inputlayout 7, render-state */ mDefaultRenderTarget->drop(); ReleaseCOM(D3D11DriverState.ShadowMapRasterizerState); for (u32 i = 0; i < EST_SHADER_COUNT; i++) clearShader(E_SHADER_TYPE(i)); ReleaseReferenceCounted(mMeshManager); ReleaseReferenceCounted(mMaterialManager); ReleaseReferenceCounted(mPipeManager); ReleaseReferenceCounted(mTextureManager); ReleaseReferenceCounted(mShaderManager); ReleaseReferenceCounted(mInputLayoutManager); ReleaseReferenceCounted(mRenderStateManager); ReleaseReferenceCounted(mResourceFactory); ReleaseReferenceCounted(mGeometryCreator); ReleaseCOM(md3dSwapChain); ReleaseCOM(md3dDeviceContext); ReleaseCOM(md3dDevice); //md3dDebug->ReportLiveDeviceObjects(D3D11_RLDO_DETAIL); ReleaseCOM(md3dDebug); }
CaptureWinGLEngine::~CaptureWinGLEngine() { clearShader(); }
void CaptureWinGLEngine::changeShader() { m_formatChange = false; clearShader(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, m_frameWidth, m_frameHeight, 0, 0, 1); resizeGL(QGLWidget::width(), QGLWidget::height()); checkError("Render settings.\n"); switch (m_frameFormat) { case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_YVYU: case V4L2_PIX_FMT_UYVY: case V4L2_PIX_FMT_VYUY: shader_YUY2(m_frameFormat); break; case V4L2_PIX_FMT_YUV420: case V4L2_PIX_FMT_YVU420: shader_YUV(); break; case V4L2_PIX_FMT_RGB32: m_screenTextureCount = 1; glActiveTexture(GL_TEXTURE0); glGenTextures(m_screenTextureCount, m_screenTexture); configureTexture(0); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, m_frameWidth, m_frameHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, NULL); checkError("RGB32 shader"); break; case V4L2_PIX_FMT_BGR32: m_screenTextureCount = 1; glActiveTexture(GL_TEXTURE0); glGenTextures(m_screenTextureCount, m_screenTexture); configureTexture(0); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, m_frameWidth, m_frameHeight, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL); checkError("BGR32 shader"); break; case V4L2_PIX_FMT_RGB555: m_screenTextureCount = 1; glActiveTexture(GL_TEXTURE0); glGenTextures(m_screenTextureCount, m_screenTexture); configureTexture(0); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, m_frameWidth, m_frameHeight, 0, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, NULL); checkError("RGB555 shader"); break; case V4L2_PIX_FMT_RGB565: m_screenTextureCount = 1; glActiveTexture(GL_TEXTURE0); glGenTextures(m_screenTextureCount, m_screenTexture); configureTexture(0); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_frameWidth, m_frameHeight, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NULL); checkError("RGB565 shader"); break; case V4L2_PIX_FMT_BGR24: shader_BGR(); break; case V4L2_PIX_FMT_RGB24: default: m_screenTextureCount = 1; glActiveTexture(GL_TEXTURE0); glGenTextures(m_screenTextureCount, m_screenTexture); configureTexture(0); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_frameWidth, m_frameHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); checkError("Default shader"); break; } glClear(GL_COLOR_BUFFER_BIT); }
ShaderNode::~ShaderNode( void ) { clearShader(); }
void ShaderNode::loadShader() { GLint Result; clearShader(); if( ( mProgramId = glCreateProgram() ) == 0 ) { return; } OPENGL_PLUGIN_DEBUG; loadShader( mPinShaderVertex, mShaderVertId, GL_VERTEX_SHADER ); OPENGL_PLUGIN_DEBUG; #if defined( GL_TESS_CONTROL_SHADER ) loadShader( mPinShaderTessCtrl, mShaderTessCtrlId, GL_TESS_CONTROL_SHADER ); OPENGL_PLUGIN_DEBUG; #endif #if defined( GL_TESS_EVALUATION_SHADER ) loadShader( mPinShaderTessEval, mShaderTessEvalId, GL_TESS_EVALUATION_SHADER ); OPENGL_PLUGIN_DEBUG; #endif loadShader( mPinShaderGeometry, mShaderGeomId, GL_GEOMETRY_SHADER ); OPENGL_PLUGIN_DEBUG; loadShader( mPinShaderFragment, mShaderFragId, GL_FRAGMENT_SHADER ); OPENGL_PLUGIN_DEBUG; //------------------------------------------------------------------------- glLinkProgram( mProgramId ); OPENGL_PLUGIN_DEBUG; glGetProgramiv( mProgramId, GL_LINK_STATUS, &Result ); if( Result != GL_TRUE ) { if( !QOpenGLContext::currentContext()->format().testOption( QSurfaceFormat::DebugContext ) ) { glGetShaderiv( mProgramId, GL_INFO_LOG_LENGTH, &Result ); QVector<GLchar> Log( Result + 1 ); glGetShaderInfoLog( mProgramId, Result, &Result, Log.data() ); qWarning() << QString( Log.data() ); } return; } mProgramLinked = true; //------------------------------------------------------------------------- OPENGL_PLUGIN_DEBUG; processShader( mProgramId ); OPENGL_PLUGIN_DEBUG; }
void OsgProgram::clearGeometryShader() { return clearShader(SHADER_TYPE_GEOMETRY); }
void OsgProgram::clearVertexShader() { clearShader(SHADER_TYPE_VERTEX); }
void OsgProgram::clearFragmentShader() { clearShader(SHADER_TYPE_FRAGMENT); }