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