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