rsdProgram.cpp revision eb4fe18dd88634330f9566cbb9e785d8c7ec5813
1a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk/* 2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 3a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * 4a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 5a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * you may not use this file except in compliance with the License. 6a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * You may obtain a copy of the License at 7a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * 8a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 9a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * 10a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 11a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 12a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * See the License for the specific language governing permissions and 14a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * limitations under the License. 15a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk */ 16a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 17a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 18a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdCore.h" 19eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams#include "rsdAllocation.h" 20a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdProgramVertex.h" 21a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdShader.h" 22a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdShaderCache.h" 23a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 24a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsContext.h" 25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsProgramVertex.h" 26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsProgramFragment.h" 27a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 28a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include <GLES/gl.h> 29a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include <GLES/glext.h> 30a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include <GLES2/gl2.h> 31a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include <GLES2/gl2ext.h> 32a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 33a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukusing namespace android; 34a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukusing namespace android::renderscript; 35a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 36a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukbool rsdProgramVertexInit(const Context *rsc, const ProgramVertex *pv, 37a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk const char* shader, uint32_t shaderLen) { 38a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader *drv = new RsdShader(pv, GL_VERTEX_SHADER, shader, shaderLen); 39a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk pv->mHal.drv = drv; 40a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 41a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk return drv->createShader(); 42a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 43a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 44eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Samsstatic void SyncProgramConstants(const Context *rsc, const Program *p) { 45eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams for (uint32_t ct=0; ct < p->mHal.state.texturesCount; ct++) { 46eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams const Allocation *a = p->mHal.state.textures[ct].get(); 47eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams DrvAllocation *drvAlloc = (DrvAllocation *)a->mHal.drv; 48eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams if (drvAlloc->uploadDeferred) { 49eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationSyncAll(rsc, a, RS_ALLOCATION_USAGE_SCRIPT); 50eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams } 51eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams } 52eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams} 53eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams 54a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramVertexSetActive(const Context *rsc, const ProgramVertex *pv) { 55a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 56a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 57eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams SyncProgramConstants(rsc, pv); 58a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk dc->gl.shaderCache->setActiveVertex((RsdShader*)pv->mHal.drv); 59a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 60a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 61a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramVertexDestroy(const Context *rsc, const ProgramVertex *pv) { 62a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 63a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 64a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader *drv = NULL; 65a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if(pv->mHal.drv) { 66a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk drv = (RsdShader*)pv->mHal.drv; 67a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (rsc->props.mLogShaders) { 68a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk LOGV("Destroying vertex shader with ID %u", drv->getShaderID()); 69a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 70a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (drv->getShaderID()) { 71a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk dc->gl.shaderCache->cleanupVertex(drv->getShaderID()); 72a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 73a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete drv; 74a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 75a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 76a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 77a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukbool rsdProgramFragmentInit(const Context *rsc, const ProgramFragment *pf, 78a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk const char* shader, uint32_t shaderLen) { 79a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader *drv = new RsdShader(pf, GL_FRAGMENT_SHADER, shader, shaderLen); 80a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk pf->mHal.drv = drv; 81a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 82a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk return drv->createShader(); 83a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 84a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 85a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramFragmentSetActive(const Context *rsc, const ProgramFragment *pf) { 86a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 87a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 88eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams SyncProgramConstants(rsc, pf); 89a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk dc->gl.shaderCache->setActiveFragment((RsdShader*)pf->mHal.drv); 90a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 91a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 92a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramFragmentDestroy(const Context *rsc, const ProgramFragment *pf) { 93a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 94a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 95a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader *drv = NULL; 96a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if(pf->mHal.drv) { 97a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk drv = (RsdShader*)pf->mHal.drv; 98a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (rsc->props.mLogShaders) { 99a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk LOGV("Destroying fragment shader with ID %u", drv->getShaderID()); 100a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 101a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (drv->getShaderID()) { 102a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk dc->gl.shaderCache->cleanupFragment(drv->getShaderID()); 103a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 104a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete drv; 105a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 106a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 107a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 108a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 109