rsScriptC_LibGL.cpp revision ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771
1aeb094b520d8ea49b74129927578f18f758c873eJason Sams/* 2aeb094b520d8ea49b74129927578f18f758c873eJason Sams * Copyright (C) 2009 The Android Open Source Project 3aeb094b520d8ea49b74129927578f18f758c873eJason Sams * 4aeb094b520d8ea49b74129927578f18f758c873eJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5aeb094b520d8ea49b74129927578f18f758c873eJason Sams * you may not use this file except in compliance with the License. 6aeb094b520d8ea49b74129927578f18f758c873eJason Sams * You may obtain a copy of the License at 7aeb094b520d8ea49b74129927578f18f758c873eJason Sams * 8aeb094b520d8ea49b74129927578f18f758c873eJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9aeb094b520d8ea49b74129927578f18f758c873eJason Sams * 10aeb094b520d8ea49b74129927578f18f758c873eJason Sams * Unless required by applicable law or agreed to in writing, software 11aeb094b520d8ea49b74129927578f18f758c873eJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12aeb094b520d8ea49b74129927578f18f758c873eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aeb094b520d8ea49b74129927578f18f758c873eJason Sams * See the License for the specific language governing permissions and 14aeb094b520d8ea49b74129927578f18f758c873eJason Sams * limitations under the License. 15aeb094b520d8ea49b74129927578f18f758c873eJason Sams */ 16aeb094b520d8ea49b74129927578f18f758c873eJason Sams 17aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "rsContext.h" 18aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "rsScriptC.h" 19aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "rsMatrix.h" 20aeb094b520d8ea49b74129927578f18f758c873eJason Sams 21aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "acc/acc.h" 22aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "utils/Timers.h" 23aeb094b520d8ea49b74129927578f18f758c873eJason Sams 24aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GL_GLEXT_PROTOTYPES 25aeb094b520d8ea49b74129927578f18f758c873eJason Sams 26aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/gl.h> 27aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/glext.h> 28aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2.h> 29aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2ext.h> 30aeb094b520d8ea49b74129927578f18f758c873eJason Sams 31aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <time.h> 32aeb094b520d8ea49b74129927578f18f758c873eJason Sams 33aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android; 34aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android::renderscript; 35aeb094b520d8ea49b74129927578f18f758c873eJason Sams 36aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GET_TLS() Context::ScriptTLSStruct * tls = \ 37aeb094b520d8ea49b74129927578f18f758c873eJason Sams (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \ 38aeb094b520d8ea49b74129927578f18f758c873eJason Sams Context * rsc = tls->mContext; \ 39aeb094b520d8ea49b74129927578f18f758c873eJason Sams ScriptC * sc = (ScriptC *) tls->mScript 40aeb094b520d8ea49b74129927578f18f758c873eJason Sams 41aeb094b520d8ea49b74129927578f18f758c873eJason Sams 42aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 43aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Context 44aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 45aeb094b520d8ea49b74129927578f18f758c873eJason Sams 46aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va) 47aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 48aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 49aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_ProgramBindTexture(rsc, 50aeb094b520d8ea49b74129927578f18f758c873eJason Sams static_cast<ProgramFragment *>(vpf), 51aeb094b520d8ea49b74129927578f18f758c873eJason Sams slot, 52aeb094b520d8ea49b74129927578f18f758c873eJason Sams static_cast<Allocation *>(va)); 53aeb094b520d8ea49b74129927578f18f758c873eJason Sams 54aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 55aeb094b520d8ea49b74129927578f18f758c873eJason Sams 56aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs) 57aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 58aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 59aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_ProgramBindSampler(rsc, 60aeb094b520d8ea49b74129927578f18f758c873eJason Sams static_cast<ProgramFragment *>(vpf), 61aeb094b520d8ea49b74129927578f18f758c873eJason Sams slot, 62aeb094b520d8ea49b74129927578f18f758c873eJason Sams static_cast<Sampler *>(vs)); 63aeb094b520d8ea49b74129927578f18f758c873eJason Sams 64aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 65aeb094b520d8ea49b74129927578f18f758c873eJason Sams 66aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramStore(RsProgramStore pfs) 67aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 68aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 69aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_ContextBindProgramStore(rsc, pfs); 70aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 71aeb094b520d8ea49b74129927578f18f758c873eJason Sams 72aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramFragment(RsProgramFragment pf) 73aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 74aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 75aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_ContextBindProgramFragment(rsc, pf); 76aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 77aeb094b520d8ea49b74129927578f18f758c873eJason Sams 78aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramVertex(RsProgramVertex pv) 79aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 80aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 81aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_ContextBindProgramVertex(rsc, pv); 82aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 83aeb094b520d8ea49b74129927578f18f758c873eJason Sams 84aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramRaster(RsProgramRaster pv) 85aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 86aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 87aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_ContextBindProgramRaster(rsc, pv); 88aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 89aeb094b520d8ea49b74129927578f18f758c873eJason Sams 90aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 91aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP 92aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 93aeb094b520d8ea49b74129927578f18f758c873eJason Sams 94a490f1003a76286e0f00606adff4ef85fdd78b02Jim Millerstatic void SC_vpLoadProjectionMatrix(const rsc_Matrix *m) 95a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller{ 96a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller GET_TLS(); 97a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller rsc->getVertex()->setProjectionMatrix(m); 98a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller} 99a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller 100aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_vpLoadModelMatrix(const rsc_Matrix *m) 101aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 102aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 103aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsc->getVertex()->setModelviewMatrix(m); 104aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 105aeb094b520d8ea49b74129927578f18f758c873eJason Sams 106aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_vpLoadTextureMatrix(const rsc_Matrix *m) 107aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 108aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 109aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsc->getVertex()->setTextureMatrix(m); 110aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 111aeb094b520d8ea49b74129927578f18f758c873eJason Sams 112aeb094b520d8ea49b74129927578f18f758c873eJason Sams 1136445e5210c6d7f8689e94be9026153d017c9545bJason Samsstatic void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, float a) 1146445e5210c6d7f8689e94be9026153d017c9545bJason Sams{ 1156445e5210c6d7f8689e94be9026153d017c9545bJason Sams //GET_TLS(); 1166445e5210c6d7f8689e94be9026153d017c9545bJason Sams ProgramFragment *pf = static_cast<ProgramFragment *>(vpf); 1176445e5210c6d7f8689e94be9026153d017c9545bJason Sams pf->setConstantColor(r, g, b, a); 1186445e5210c6d7f8689e94be9026153d017c9545bJason Sams} 1196445e5210c6d7f8689e94be9026153d017c9545bJason Sams 120aeb094b520d8ea49b74129927578f18f758c873eJason Sams 121aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 122aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing 123aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 124aeb094b520d8ea49b74129927578f18f758c873eJason Sams 125aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuadTexCoords(float x1, float y1, float z1, 126aeb094b520d8ea49b74129927578f18f758c873eJason Sams float u1, float v1, 127aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x2, float y2, float z2, 128aeb094b520d8ea49b74129927578f18f758c873eJason Sams float u2, float v2, 129aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x3, float y3, float z3, 130aeb094b520d8ea49b74129927578f18f758c873eJason Sams float u3, float v3, 131aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x4, float y4, float z4, 132aeb094b520d8ea49b74129927578f18f758c873eJason Sams float u4, float v4) 133aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 134aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 135aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 136aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 137aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 138aeb094b520d8ea49b74129927578f18f758c873eJason Sams 139aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("Quad"); 140aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1); 141aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2); 142aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3); 143aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4); 144aeb094b520d8ea49b74129927578f18f758c873eJason Sams 145aeb094b520d8ea49b74129927578f18f758c873eJason Sams float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4}; 146aeb094b520d8ea49b74129927578f18f758c873eJason Sams const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4}; 147aeb094b520d8ea49b74129927578f18f758c873eJason Sams 148aeb094b520d8ea49b74129927578f18f758c873eJason Sams VertexArray va; 14979f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams va.add(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "position"); 15079f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams va.add(GL_FLOAT, 2, 8, false, (uint32_t)tex, "texture0"); 15179f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache); 152aeb094b520d8ea49b74129927578f18f758c873eJason Sams 153aeb094b520d8ea49b74129927578f18f758c873eJason Sams glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 154aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 155aeb094b520d8ea49b74129927578f18f758c873eJason Sams 156aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuad(float x1, float y1, float z1, 157aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x2, float y2, float z2, 158aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x3, float y3, float z3, 159aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x4, float y4, float z4) 160aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 161aeb094b520d8ea49b74129927578f18f758c873eJason Sams SC_drawQuadTexCoords(x1, y1, z1, 0, 1, 162aeb094b520d8ea49b74129927578f18f758c873eJason Sams x2, y2, z2, 1, 1, 163aeb094b520d8ea49b74129927578f18f758c873eJason Sams x3, y3, z3, 1, 0, 164aeb094b520d8ea49b74129927578f18f758c873eJason Sams x4, y4, z4, 0, 0); 165aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 166aeb094b520d8ea49b74129927578f18f758c873eJason Sams 167aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h) 168aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 169aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 170aeb094b520d8ea49b74129927578f18f758c873eJason Sams ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex()); 171aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsc->setVertex(rsc->getDefaultProgramVertex()); 172aeb094b520d8ea49b74129927578f18f758c873eJason Sams //rsc->setupCheck(); 173aeb094b520d8ea49b74129927578f18f758c873eJason Sams 174aeb094b520d8ea49b74129927578f18f758c873eJason Sams //GLint crop[4] = {0, h, w, -h}; 175aeb094b520d8ea49b74129927578f18f758c873eJason Sams 176aeb094b520d8ea49b74129927578f18f758c873eJason Sams float sh = rsc->getHeight(); 177aeb094b520d8ea49b74129927578f18f758c873eJason Sams 178aeb094b520d8ea49b74129927578f18f758c873eJason Sams SC_drawQuad(x, sh - y, z, 179aeb094b520d8ea49b74129927578f18f758c873eJason Sams x+w, sh - y, z, 180aeb094b520d8ea49b74129927578f18f758c873eJason Sams x+w, sh - (y+h), z, 181aeb094b520d8ea49b74129927578f18f758c873eJason Sams x, sh - (y+h), z); 182aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsc->setVertex((ProgramVertex *)tmp.get()); 183aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 184bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams/* 185aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSprite(float x, float y, float z, float w, float h) 186aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 187aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 188aeb094b520d8ea49b74129927578f18f758c873eJason Sams float vin[3] = {x, y, z}; 189aeb094b520d8ea49b74129927578f18f758c873eJason Sams float vout[4]; 190aeb094b520d8ea49b74129927578f18f758c873eJason Sams 191aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("ds in %f %f %f", x, y, z); 192aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsc->getVertex()->transformToScreen(rsc, vout, vin); 193aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("ds out %f %f %f %f", vout[0], vout[1], vout[2], vout[3]); 194aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[0] /= vout[3]; 195aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[1] /= vout[3]; 196aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[2] /= vout[3]; 197aeb094b520d8ea49b74129927578f18f758c873eJason Sams 198aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[0] *= rsc->getWidth() / 2; 199aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[1] *= rsc->getHeight() / 2; 200aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[0] += rsc->getWidth() / 2; 201aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[1] += rsc->getHeight() / 2; 202aeb094b520d8ea49b74129927578f18f758c873eJason Sams 203aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[0] -= w/2; 204aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[1] -= h/2; 205aeb094b520d8ea49b74129927578f18f758c873eJason Sams 206aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("ds out2 %f %f %f", vout[0], vout[1], vout[2]); 207aeb094b520d8ea49b74129927578f18f758c873eJason Sams 208aeb094b520d8ea49b74129927578f18f758c873eJason Sams // U, V, W, H 209aeb094b520d8ea49b74129927578f18f758c873eJason Sams SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w); 210aeb094b520d8ea49b74129927578f18f758c873eJason Sams //rsc->setupCheck(); 211aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 212bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams*/ 213aeb094b520d8ea49b74129927578f18f758c873eJason Sams 214aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawRect(float x1, float y1, 215aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x2, float y2, float z) 216aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 217aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z); 218aeb094b520d8ea49b74129927578f18f758c873eJason Sams SC_drawQuad(x1, y2, z, 219aeb094b520d8ea49b74129927578f18f758c873eJason Sams x2, y2, z, 220aeb094b520d8ea49b74129927578f18f758c873eJason Sams x2, y1, z, 221aeb094b520d8ea49b74129927578f18f758c873eJason Sams x1, y1, z); 222aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 223aeb094b520d8ea49b74129927578f18f758c873eJason Sams 2244e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMesh(RsMesh vsm) 2254e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk GET_TLS(); 2274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(vsm); 228aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 229aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 230aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 231aeb094b520d8ea49b74129927578f18f758c873eJason Sams sm->render(rsc); 232aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 233aeb094b520d8ea49b74129927578f18f758c873eJason Sams 2344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMeshPrimitive(RsMesh vsm, uint32_t primIndex) 235aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 236aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 2374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(vsm); 238aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 239aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 240aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 2414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitive(rsc, primIndex); 2424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMeshPrimitiveRange(RsMesh vsm, uint32_t primIndex, uint32_t start, uint32_t len) 2454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk GET_TLS(); 2474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(vsm); 2484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (!rsc->setupCheck()) { 2494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 2504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitiveRange(rsc, primIndex, start, len); 252aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 253aeb094b520d8ea49b74129927578f18f758c873eJason Sams 254ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchoukstatic void SC_meshComputeBoundingBox(RsMesh vsm, float *minX, float *minY, float *minZ, 255ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk float *maxX, float *maxY, float *maxZ) 256ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk{ 257ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk GET_TLS(); 258ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(vsm); 259ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk sm->computeBBox(); 260ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minX = sm->mBBoxMin[0]; 261ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minY = sm->mBBoxMin[1]; 262ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minZ = sm->mBBoxMin[2]; 263ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxX = sm->mBBoxMax[0]; 264ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxY = sm->mBBoxMax[1]; 265ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxZ = sm->mBBoxMax[2]; 266ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 267ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 268aeb094b520d8ea49b74129927578f18f758c873eJason Sams 269aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 270aeb094b520d8ea49b74129927578f18f758c873eJason Sams// 271aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 272aeb094b520d8ea49b74129927578f18f758c873eJason Sams 273aeb094b520d8ea49b74129927578f18f758c873eJason Sams 274aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_color(float r, float g, float b, float a) 275aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 276aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 2776445e5210c6d7f8689e94be9026153d017c9545bJason Sams ProgramFragment *pf = (ProgramFragment *)rsc->getFragment(); 2786445e5210c6d7f8689e94be9026153d017c9545bJason Sams pf->setConstantColor(r, g, b, a); 279aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 280aeb094b520d8ea49b74129927578f18f758c873eJason Sams 28122fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_uploadToTexture2(RsAllocation va, uint32_t baseMipLevel) 282aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 283aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 284aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel); 285aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 28622fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_uploadToTexture(RsAllocation va) 28722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{ 28822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams GET_TLS(); 28922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams rsi_AllocationUploadToTexture(rsc, va, false, 0); 29022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams} 291aeb094b520d8ea49b74129927578f18f758c873eJason Sams 292aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_uploadToBufferObject(RsAllocation va) 293aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 294aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 295aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_AllocationUploadToBufferObject(rsc, va); 296aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 297aeb094b520d8ea49b74129927578f18f758c873eJason Sams 29822fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_ClearColor(float r, float g, float b, float a) 299aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 300aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 30122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams if (!rsc->setupCheck()) { 30222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams return; 30322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams } 304aeb094b520d8ea49b74129927578f18f758c873eJason Sams 30522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams glClearColor(r, g, b, a); 30622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams glClear(GL_COLOR_BUFFER_BIT); 307aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 308aeb094b520d8ea49b74129927578f18f758c873eJason Sams 30922fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_ClearDepth(float v) 310aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 311aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 31222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams if (!rsc->setupCheck()) { 31322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams return; 31422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams } 31522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 31622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams glClearDepthf(v); 31722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams glClear(GL_DEPTH_BUFFER_BIT); 318aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 319aeb094b520d8ea49b74129927578f18f758c873eJason Sams 320aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic uint32_t SC_getWidth() 321aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 322aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 323aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getWidth(); 324aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 325aeb094b520d8ea49b74129927578f18f758c873eJason Sams 326aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic uint32_t SC_getHeight() 327aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 328aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 329aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getHeight(); 330aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 331aeb094b520d8ea49b74129927578f18f758c873eJason Sams 332d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_DrawTextAlloc(RsAllocation va, int x, int y) 333d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{ 334d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk GET_TLS(); 335d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk Allocation *alloc = static_cast<Allocation *>(va); 336d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk rsc->mStateFont.renderText(alloc, x, y); 337d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 338d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 339d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_DrawText(const char *text, int x, int y) 340d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{ 341d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk GET_TLS(); 342d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk rsc->mStateFont.renderText(text, x, y); 343d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 344d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 345d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_BindFont(RsFont font) 346d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{ 347d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk GET_TLS(); 348d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk rsi_ContextBindFont(rsc, font); 349d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 350aeb094b520d8ea49b74129927578f18f758c873eJason Sams 3519fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchoukstatic void SC_FontColor(float r, float g, float b, float a) 3529fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk{ 3539fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk GET_TLS(); 3549fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk rsc->mStateFont.setFontColor(r, g, b, a); 3559fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk} 3569fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk 357aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 358aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Class implementation 359aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 360aeb094b520d8ea49b74129927578f18f758c873eJason Sams 361aeb094b520d8ea49b74129927578f18f758c873eJason Sams// llvm name mangling ref 362aeb094b520d8ea49b74129927578f18f758c873eJason Sams// <builtin-type> ::= v # void 363aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= b # bool 364aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= c # char 365aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= a # signed char 366aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= h # unsigned char 367aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= s # short 368aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= t # unsigned short 369aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= i # int 370aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= j # unsigned int 371aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= l # long 372aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= m # unsigned long 373aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= x # long long, __int64 374aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= y # unsigned long long, __int64 375aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= f # float 376aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= d # double 377aeb094b520d8ea49b74129927578f18f758c873eJason Sams 378aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic ScriptCState::SymbolTable_t gSyms[] = { 3797349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_bindProgramFragment }, 3807349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_bindProgramStore }, 3817349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_bindProgramVertex }, 3827349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_bindProgramRaster }, 3837349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_bindSampler }, 3847349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_bindTexture }, 38522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 3867349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadProjectionMatrix }, 3877349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadModelMatrix }, 3887349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadTextureMatrix }, 38922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 3906445e5210c6d7f8689e94be9026153d017c9545bJason Sams { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_pfConstantColor }, 3916445e5210c6d7f8689e94be9026153d017c9545bJason Sams 3927349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z11rsgGetWidthv", (void *)&SC_getWidth }, 3937349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z12rsgGetHeightv", (void *)&SC_getHeight }, 39422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 3957349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z18rsgUploadToTexture13rs_allocationj", (void *)&SC_uploadToTexture2 }, 3968c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams { "_Z18rsgUploadToTexture13rs_allocation", (void *)&SC_uploadToTexture }, 3977349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z23rsgUploadToBufferObject13rs_allocation", (void *)&SC_uploadToBufferObject }, 39822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 3997349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z11rsgDrawRectfffff", (void *)&SC_drawRect }, 4007349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_drawQuad }, 4017349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_drawQuadTexCoords }, 4027349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_drawSpriteScreenspace }, 40322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 4044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_drawMesh }, 4057349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_drawMeshPrimitive }, 4067349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_drawMeshPrimitiveRange }, 407ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_meshComputeBoundingBox }, 4084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 4097349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z13rsgClearColorffff", (void *)&SC_ClearColor }, 4107349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth }, 41122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 412d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText }, 413d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc }, 414d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 4157349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont }, 4169fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk { "_Z12rsgFontColorffff", (void *)&SC_FontColor }, 417d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 418aeb094b520d8ea49b74129927578f18f758c873eJason Sams // misc 4197349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z5colorffff", (void *)&SC_color }, 420aeb094b520d8ea49b74129927578f18f758c873eJason Sams 421aeb094b520d8ea49b74129927578f18f758c873eJason Sams { NULL, NULL } 422aeb094b520d8ea49b74129927578f18f758c873eJason Sams}; 423aeb094b520d8ea49b74129927578f18f758c873eJason Sams 424aeb094b520d8ea49b74129927578f18f758c873eJason Samsconst ScriptCState::SymbolTable_t * ScriptCState::lookupSymbolGL(const char *sym) 425aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 426aeb094b520d8ea49b74129927578f18f758c873eJason Sams ScriptCState::SymbolTable_t *syms = gSyms; 427aeb094b520d8ea49b74129927578f18f758c873eJason Sams 428aeb094b520d8ea49b74129927578f18f758c873eJason Sams while (syms->mPtr) { 429aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!strcmp(syms->mName, sym)) { 430aeb094b520d8ea49b74129927578f18f758c873eJason Sams return syms; 431aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 432aeb094b520d8ea49b74129927578f18f758c873eJason Sams syms++; 433aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 434aeb094b520d8ea49b74129927578f18f758c873eJason Sams return NULL; 435aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 436aeb094b520d8ea49b74129927578f18f758c873eJason Sams 437