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 33e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::Allocation; 34e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::Context; 35e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::Program; 36e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::ProgramFragment; 37e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::ProgramVertex; 38a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 39a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukbool rsdProgramVertexInit(const Context *rsc, const ProgramVertex *pv, 40748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const char* shader, size_t shaderLen, 41748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const char** textureNames, size_t textureNamesCount, 42748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const size_t *textureNamesLength) { 43748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk RsdShader *drv = new RsdShader(pv, GL_VERTEX_SHADER, shader, shaderLen, 44748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk textureNames, textureNamesCount, textureNamesLength); 45a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk pv->mHal.drv = drv; 46a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 473522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams return true; 48a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 49a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 50eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Samsstatic void SyncProgramConstants(const Context *rsc, const Program *p) { 51eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams for (uint32_t ct=0; ct < p->mHal.state.texturesCount; ct++) { 52064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk const Allocation *a = p->mHal.state.textures[ct]; 53ba157304ce99d212403898b055998e6da7a20e9bAlex Sakhartchouk if (!a) { 54ba157304ce99d212403898b055998e6da7a20e9bAlex Sakhartchouk continue; 55ba157304ce99d212403898b055998e6da7a20e9bAlex Sakhartchouk } 56eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams DrvAllocation *drvAlloc = (DrvAllocation *)a->mHal.drv; 57eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams if (drvAlloc->uploadDeferred) { 58eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationSyncAll(rsc, a, RS_ALLOCATION_USAGE_SCRIPT); 59eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams } 60eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams } 61eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams} 62eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams 63a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramVertexSetActive(const Context *rsc, const ProgramVertex *pv) { 64a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 65a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 66eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams SyncProgramConstants(rsc, pv); 67a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk dc->gl.shaderCache->setActiveVertex((RsdShader*)pv->mHal.drv); 68a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 69a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 70a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramVertexDestroy(const Context *rsc, const ProgramVertex *pv) { 71a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 72a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 7344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes RsdShader *drv = nullptr; 74a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if(pv->mHal.drv) { 75a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk drv = (RsdShader*)pv->mHal.drv; 76a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (rsc->props.mLogShaders) { 77e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray ALOGV("Destroying vertex shader with ID %p", (void*)pv); 78a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 796d6e114f8bea8db08bf1decb673d3eb9a8f258aeAlex Sakhartchouk if (drv->getStateBasedIDCount()) { 806d6e114f8bea8db08bf1decb673d3eb9a8f258aeAlex Sakhartchouk dc->gl.shaderCache->cleanupVertex(drv); 81a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 82a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete drv; 83a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 84a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 85a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 86a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukbool rsdProgramFragmentInit(const Context *rsc, const ProgramFragment *pf, 87748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const char* shader, size_t shaderLen, 88748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const char** textureNames, size_t textureNamesCount, 89748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const size_t *textureNamesLength) { 90748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk RsdShader *drv = new RsdShader(pf, GL_FRAGMENT_SHADER, shader, shaderLen, 91748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk textureNames, textureNamesCount, textureNamesLength); 92a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk pf->mHal.drv = drv; 93a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 943522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams return true; 95a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 96a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 97a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramFragmentSetActive(const Context *rsc, const ProgramFragment *pf) { 98a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 99a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 100eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams SyncProgramConstants(rsc, pf); 101a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk dc->gl.shaderCache->setActiveFragment((RsdShader*)pf->mHal.drv); 102a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 103a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 104a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramFragmentDestroy(const Context *rsc, const ProgramFragment *pf) { 105a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdHal *dc = (RsdHal *)rsc->mHal.drv; 106a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 10744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes RsdShader *drv = nullptr; 108a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if(pf->mHal.drv) { 109a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk drv = (RsdShader*)pf->mHal.drv; 110a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (rsc->props.mLogShaders) { 111e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray ALOGV("Destroying fragment shader with ID %p", (void*)pf); 112a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 1136d6e114f8bea8db08bf1decb673d3eb9a8f258aeAlex Sakhartchouk if (drv->getStateBasedIDCount()) { 1146d6e114f8bea8db08bf1decb673d3eb9a8f258aeAlex Sakhartchouk dc->gl.shaderCache->cleanupFragment(drv); 115a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 116a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete drv; 117a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 118a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 119a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 120a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 121