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