1a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk/* 23522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams * Copyright (C) 2011-2012 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, 37748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const char* shader, size_t shaderLen, 38748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const char** textureNames, size_t textureNamesCount, 39748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const size_t *textureNamesLength) { 40748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk RsdShader *drv = new RsdShader(pv, GL_VERTEX_SHADER, shader, shaderLen, 41748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk textureNames, textureNamesCount, textureNamesLength); 42a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk pv->mHal.drv = drv; 43a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 443522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams return true; 45a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 46a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 47eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Samsstatic void SyncProgramConstants(const Context *rsc, const Program *p) { 48eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams for (uint32_t ct=0; ct < p->mHal.state.texturesCount; ct++) { 49064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk const Allocation *a = p->mHal.state.textures[ct]; 50ba157304ce99d212403898b055998e6da7a20e9bAlex Sakhartchouk if (!a) { 51ba157304ce99d212403898b055998e6da7a20e9bAlex Sakhartchouk continue; 52ba157304ce99d212403898b055998e6da7a20e9bAlex Sakhartchouk } 53eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams DrvAllocation *drvAlloc = (DrvAllocation *)a->mHal.drv; 54eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams if (drvAlloc->uploadDeferred) { 55eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationSyncAll(rsc, a, RS_ALLOCATION_USAGE_SCRIPT); 56eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams } 57eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams } 58eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams} 59eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams 60a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramVertexSetActive(const Context *rsc, const ProgramVertex *pv) { 61a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 62a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 63eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams SyncProgramConstants(rsc, pv); 64a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk dc->gl.shaderCache->setActiveVertex((RsdShader*)pv->mHal.drv); 65a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 66a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 67a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramVertexDestroy(const Context *rsc, const ProgramVertex *pv) { 68a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 69a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 70a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader *drv = NULL; 71a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if(pv->mHal.drv) { 72a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk drv = (RsdShader*)pv->mHal.drv; 73a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (rsc->props.mLogShaders) { 74e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray ALOGV("Destroying vertex shader with ID %p", (void*)pv); 75a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 766d6e114f8bea8db08bf1decb673d3eb9a8f258aeAlex Sakhartchouk if (drv->getStateBasedIDCount()) { 776d6e114f8bea8db08bf1decb673d3eb9a8f258aeAlex Sakhartchouk dc->gl.shaderCache->cleanupVertex(drv); 78a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 79a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete drv; 80a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 81a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 82a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 83a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukbool rsdProgramFragmentInit(const Context *rsc, const ProgramFragment *pf, 84748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const char* shader, size_t shaderLen, 85748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const char** textureNames, size_t textureNamesCount, 86748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const size_t *textureNamesLength) { 87748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk RsdShader *drv = new RsdShader(pf, GL_FRAGMENT_SHADER, shader, shaderLen, 88748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk textureNames, textureNamesCount, textureNamesLength); 89a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk pf->mHal.drv = drv; 90a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 913522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams return true; 92a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 93a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 94a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramFragmentSetActive(const Context *rsc, const ProgramFragment *pf) { 95a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 96a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 97eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams SyncProgramConstants(rsc, pf); 98a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk dc->gl.shaderCache->setActiveFragment((RsdShader*)pf->mHal.drv); 99a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 100a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 101a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramFragmentDestroy(const Context *rsc, const ProgramFragment *pf) { 102a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 103a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 104a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader *drv = NULL; 105a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if(pf->mHal.drv) { 106a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk drv = (RsdShader*)pf->mHal.drv; 107a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (rsc->props.mLogShaders) { 108e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray ALOGV("Destroying fragment shader with ID %p", (void*)pf); 109a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 1106d6e114f8bea8db08bf1decb673d3eb9a8f258aeAlex Sakhartchouk if (drv->getStateBasedIDCount()) { 1116d6e114f8bea8db08bf1decb673d3eb9a8f258aeAlex Sakhartchouk dc->gl.shaderCache->cleanupFragment(drv); 112a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 113a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete drv; 114a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 115a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 116a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 117a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 118