18feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams/*
28feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams * Copyright (C) 2011 The Android Open Source Project
38feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams *
48feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
58feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams * you may not use this file except in compliance with the License.
68feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams * You may obtain a copy of the License at
78feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams *
88feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
98feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams *
108feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams * Unless required by applicable law or agreed to in writing, software
118feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
128feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams * See the License for the specific language governing permissions and
148feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams * limitations under the License.
158feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams */
168feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
178feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
188feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams#include "rsdCore.h"
198feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams#include "rsdProgramStore.h"
208feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
218feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams#include "rsContext.h"
228feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams#include "rsProgramStore.h"
238feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
248feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams#include <GLES/gl.h>
258feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams#include <GLES/glext.h>
268feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
27e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::Context;
28e939ce7e3b609ee53d73c2b48c5ff8f03b4579a3Chih-Hung Hsiehusing android::renderscript::ProgramStore;
298feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
308feea4e0dec48ea03bd6d32706d058b86dddc5baJason Samsstruct DrvProgramStore {
318feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    GLenum blendSrc;
328feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    GLenum blendDst;
338feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    bool blendEnable;
348feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
358feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    GLenum depthFunc;
368feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    bool depthTestEnable;
378feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams};
388feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
398feea4e0dec48ea03bd6d32706d058b86dddc5baJason Samsbool rsdProgramStoreInit(const Context *rsc, const ProgramStore *ps) {
408feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    DrvProgramStore *drv = (DrvProgramStore *)calloc(1, sizeof(DrvProgramStore));
4144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (drv == nullptr) {
428feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        return false;
438feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    }
448feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
458feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    ps->mHal.drv = drv;
468feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    drv->depthTestEnable = true;
478feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
488feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    switch (ps->mHal.state.depthFunc) {
498feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_DEPTH_FUNC_ALWAYS:
508feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->depthTestEnable = false;
518feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->depthFunc = GL_ALWAYS;
528feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
538feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_DEPTH_FUNC_LESS:
548feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->depthFunc = GL_LESS;
558feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
568feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_DEPTH_FUNC_LEQUAL:
578feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->depthFunc = GL_LEQUAL;
588feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
598feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_DEPTH_FUNC_GREATER:
608feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->depthFunc = GL_GREATER;
618feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
628feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_DEPTH_FUNC_GEQUAL:
638feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->depthFunc = GL_GEQUAL;
648feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
658feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_DEPTH_FUNC_EQUAL:
668feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->depthFunc = GL_EQUAL;
678feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
688feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_DEPTH_FUNC_NOTEQUAL:
698feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->depthFunc = GL_NOTEQUAL;
708feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
718feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    default:
72af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Unknown depth function.");
738feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        goto error;
748feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    }
758feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
768feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
778feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
788feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    drv->blendEnable = true;
798feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    if ((ps->mHal.state.blendSrc == RS_BLEND_SRC_ONE) &&
808feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        (ps->mHal.state.blendDst == RS_BLEND_DST_ZERO)) {
818feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendEnable = false;
828feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    }
838feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
848feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    switch (ps->mHal.state.blendSrc) {
858feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_SRC_ZERO:
868feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendSrc = GL_ZERO;
878feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
888feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_SRC_ONE:
898feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendSrc = GL_ONE;
908feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
918feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_SRC_DST_COLOR:
928feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendSrc = GL_DST_COLOR;
938feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
948feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_SRC_ONE_MINUS_DST_COLOR:
958feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendSrc = GL_ONE_MINUS_DST_COLOR;
968feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
978feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_SRC_SRC_ALPHA:
988feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendSrc = GL_SRC_ALPHA;
998feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1008feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_SRC_ONE_MINUS_SRC_ALPHA:
1018feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendSrc = GL_ONE_MINUS_SRC_ALPHA;
1028feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1038feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_SRC_DST_ALPHA:
1048feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendSrc = GL_DST_ALPHA;
1058feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1068feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_SRC_ONE_MINUS_DST_ALPHA:
1078feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendSrc = GL_ONE_MINUS_DST_ALPHA;
1088feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1098feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_SRC_SRC_ALPHA_SATURATE:
1108feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendSrc = GL_SRC_ALPHA_SATURATE;
1118feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1128feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    default:
113c0a65425f8eb3573b1abd2a48292ca953c0a8590Alex Sakhartchouk        rsc->setError(RS_ERROR_FATAL_DRIVER, "Unknown blend src mode.");
1148feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        goto error;
1158feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    }
1168feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
1178feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    switch (ps->mHal.state.blendDst) {
1188feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_DST_ZERO:
1198feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendDst = GL_ZERO;
1208feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1218feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_DST_ONE:
1228feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendDst = GL_ONE;
1238feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1248feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_DST_SRC_COLOR:
1258feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendDst = GL_SRC_COLOR;
1268feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1278feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_DST_ONE_MINUS_SRC_COLOR:
1288feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendDst = GL_ONE_MINUS_SRC_COLOR;
1298feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1308feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_DST_SRC_ALPHA:
1318feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendDst = GL_SRC_ALPHA;
1328feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1338feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_DST_ONE_MINUS_SRC_ALPHA:
1348feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendDst = GL_ONE_MINUS_SRC_ALPHA;
1358feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1368feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_DST_DST_ALPHA:
1378feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendDst = GL_DST_ALPHA;
1388feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1398feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    case RS_BLEND_DST_ONE_MINUS_DST_ALPHA:
1408feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        drv->blendDst = GL_ONE_MINUS_DST_ALPHA;
1418feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        break;
1428feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    default:
143c0a65425f8eb3573b1abd2a48292ca953c0a8590Alex Sakhartchouk        rsc->setError(RS_ERROR_FATAL_DRIVER, "Unknown blend dst mode.");
1448feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        goto error;
1458feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    }
1468feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
1478feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    return true;
1488feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
1498feea4e0dec48ea03bd6d32706d058b86dddc5baJason Samserror:
1508feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    free(drv);
15144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    ps->mHal.drv = nullptr;
1528feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    return false;
1538feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams}
1548feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
1558feea4e0dec48ea03bd6d32706d058b86dddc5baJason Samsvoid rsdProgramStoreSetActive(const Context *rsc, const ProgramStore *ps) {
1568feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    DrvProgramStore *drv = (DrvProgramStore *)ps->mHal.drv;
1578feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
1582382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glColorMask, ps->mHal.state.colorRWriteEnable,
1598feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams                ps->mHal.state.colorGWriteEnable,
1608feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams                ps->mHal.state.colorBWriteEnable,
1618feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams                ps->mHal.state.colorAWriteEnable);
1628feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
1638feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    if (drv->blendEnable) {
1642382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(glEnable, GL_BLEND);
1652382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(glBlendFunc, drv->blendSrc, drv->blendDst);
1668feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    } else {
1672382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(glDisable, GL_BLEND);
1688feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    }
1698feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
1708feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    if (rsc->mUserSurfaceConfig.depthMin > 0) {
1712382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(glDepthMask, ps->mHal.state.depthWriteEnable);
1728feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        if (drv->depthTestEnable || ps->mHal.state.depthWriteEnable) {
1732382aba4a55c6ae74789c478eead8fbd96593321Jason Sams            RSD_CALL_GL(glEnable, GL_DEPTH_TEST);
1742382aba4a55c6ae74789c478eead8fbd96593321Jason Sams            RSD_CALL_GL(glDepthFunc, drv->depthFunc);
1758feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        } else {
1762382aba4a55c6ae74789c478eead8fbd96593321Jason Sams            RSD_CALL_GL(glDisable, GL_DEPTH_TEST);
1778feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        }
1788feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    } else {
1792382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(glDepthMask, false);
1802382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(glDisable, GL_DEPTH_TEST);
1818feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    }
1828feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
1838feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    /*
1848feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    if (rsc->mUserSurfaceConfig.stencilMin > 0) {
1858feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    } else {
1868feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        glStencilMask(0);
1878feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        glDisable(GL_STENCIL_TEST);
1888feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    }
1898feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    */
1908feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
1918feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    if (ps->mHal.state.ditherEnable) {
1922382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(glEnable, GL_DITHER);
1938feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    } else {
1942382aba4a55c6ae74789c478eead8fbd96593321Jason Sams        RSD_CALL_GL(glDisable, GL_DITHER);
1958feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    }
1968feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams}
1978feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
1988feea4e0dec48ea03bd6d32706d058b86dddc5baJason Samsvoid rsdProgramStoreDestroy(const Context *rsc, const ProgramStore *ps) {
1998feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    free(ps->mHal.drv);
20044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    ps->mHal.drv = nullptr;
2018feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams}
2028feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
2038feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
204