rsdProgram.cpp revision ba157304ce99d212403898b055998e6da7a20e9b
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();
47ba157304ce99d212403898b055998e6da7a20e9bAlex Sakhartchouk        if (!a) {
48ba157304ce99d212403898b055998e6da7a20e9bAlex Sakhartchouk            continue;
49ba157304ce99d212403898b055998e6da7a20e9bAlex Sakhartchouk        }
50eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        DrvAllocation *drvAlloc = (DrvAllocation *)a->mHal.drv;
51eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        if (drvAlloc->uploadDeferred) {
52eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams            rsdAllocationSyncAll(rsc, a, RS_ALLOCATION_USAGE_SCRIPT);
53eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        }
54eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    }
55eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams}
56eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams
57a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramVertexSetActive(const Context *rsc, const ProgramVertex *pv) {
58a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
59a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
60eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    SyncProgramConstants(rsc, pv);
61a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    dc->gl.shaderCache->setActiveVertex((RsdShader*)pv->mHal.drv);
62a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk}
63a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
64a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramVertexDestroy(const Context *rsc, const ProgramVertex *pv) {
65a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
66a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
67a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdShader *drv = NULL;
68a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    if(pv->mHal.drv) {
69a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        drv = (RsdShader*)pv->mHal.drv;
70a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        if (rsc->props.mLogShaders) {
71a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            LOGV("Destroying vertex shader with ID %u", drv->getShaderID());
72a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        }
73a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        if (drv->getShaderID()) {
74a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            dc->gl.shaderCache->cleanupVertex(drv->getShaderID());
75a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        }
76a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        delete drv;
77a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
78a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk}
79a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
80a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukbool rsdProgramFragmentInit(const Context *rsc, const ProgramFragment *pf,
81a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk                          const char* shader, uint32_t shaderLen) {
82a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdShader *drv = new RsdShader(pf, GL_FRAGMENT_SHADER, shader, shaderLen);
83a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    pf->mHal.drv = drv;
84a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
85a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    return drv->createShader();
86a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk}
87a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
88a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramFragmentSetActive(const Context *rsc, const ProgramFragment *pf) {
89a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
90a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
91eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    SyncProgramConstants(rsc, pf);
92a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    dc->gl.shaderCache->setActiveFragment((RsdShader*)pf->mHal.drv);
93a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk}
94a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
95a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid rsdProgramFragmentDestroy(const Context *rsc, const ProgramFragment *pf) {
96a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
97a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
98a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdShader *drv = NULL;
99a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    if(pf->mHal.drv) {
100a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        drv = (RsdShader*)pf->mHal.drv;
101a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        if (rsc->props.mLogShaders) {
102a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            LOGV("Destroying fragment shader with ID %u", drv->getShaderID());
103a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        }
104a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        if (drv->getShaderID()) {
105a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            dc->gl.shaderCache->cleanupFragment(drv->getShaderID());
106a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        }
107a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        delete drv;
108a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
109a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk}
110a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
111a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
112