rsScriptC_LibGL.cpp revision 383e5b1f68c321a77bfd7466fa1171a9bfab4a6f
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 "utils/Timers.h" 22aeb094b520d8ea49b74129927578f18f758c873eJason Sams 23aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GL_GLEXT_PROTOTYPES 24aeb094b520d8ea49b74129927578f18f758c873eJason Sams 25aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/gl.h> 26aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/glext.h> 27aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2.h> 28aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2ext.h> 29aeb094b520d8ea49b74129927578f18f758c873eJason Sams 30aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <time.h> 31aeb094b520d8ea49b74129927578f18f758c873eJason Sams 32aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android; 33aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android::renderscript; 34aeb094b520d8ea49b74129927578f18f758c873eJason Sams 35aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GET_TLS() Context::ScriptTLSStruct * tls = \ 36aeb094b520d8ea49b74129927578f18f758c873eJason Sams (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \ 37aeb094b520d8ea49b74129927578f18f758c873eJason Sams Context * rsc = tls->mContext; \ 38aeb094b520d8ea49b74129927578f18f758c873eJason Sams ScriptC * sc = (ScriptC *) tls->mScript 39aeb094b520d8ea49b74129927578f18f758c873eJason Sams 40aeb094b520d8ea49b74129927578f18f758c873eJason Sams 41aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 42aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Context 43aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 44aeb094b520d8ea49b74129927578f18f758c873eJason Sams 45aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va) 46aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 47aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 48aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_ProgramBindTexture(rsc, 49aeb094b520d8ea49b74129927578f18f758c873eJason Sams static_cast<ProgramFragment *>(vpf), 50aeb094b520d8ea49b74129927578f18f758c873eJason Sams slot, 51aeb094b520d8ea49b74129927578f18f758c873eJason Sams static_cast<Allocation *>(va)); 52aeb094b520d8ea49b74129927578f18f758c873eJason Sams 53aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 54aeb094b520d8ea49b74129927578f18f758c873eJason Sams 55aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs) 56aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 57aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 58aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_ProgramBindSampler(rsc, 59aeb094b520d8ea49b74129927578f18f758c873eJason Sams static_cast<ProgramFragment *>(vpf), 60aeb094b520d8ea49b74129927578f18f758c873eJason Sams slot, 61aeb094b520d8ea49b74129927578f18f758c873eJason Sams static_cast<Sampler *>(vs)); 62aeb094b520d8ea49b74129927578f18f758c873eJason Sams 63aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 64aeb094b520d8ea49b74129927578f18f758c873eJason Sams 65aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramStore(RsProgramStore pfs) 66aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 67aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 68aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_ContextBindProgramStore(rsc, pfs); 69aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 70aeb094b520d8ea49b74129927578f18f758c873eJason Sams 71aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramFragment(RsProgramFragment pf) 72aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 73aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 74aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_ContextBindProgramFragment(rsc, pf); 75aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 76aeb094b520d8ea49b74129927578f18f758c873eJason Sams 77aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramVertex(RsProgramVertex pv) 78aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 79aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 80aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_ContextBindProgramVertex(rsc, pv); 81aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 82aeb094b520d8ea49b74129927578f18f758c873eJason Sams 83aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_bindProgramRaster(RsProgramRaster pv) 84aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 85aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 86aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_ContextBindProgramRaster(rsc, pv); 87aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 88aeb094b520d8ea49b74129927578f18f758c873eJason Sams 89aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 90aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP 91aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 92aeb094b520d8ea49b74129927578f18f758c873eJason Sams 93a490f1003a76286e0f00606adff4ef85fdd78b02Jim Millerstatic void SC_vpLoadProjectionMatrix(const rsc_Matrix *m) 94a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller{ 95a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller GET_TLS(); 96383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->getVertex()->setProjectionMatrix(rsc, m); 97a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller} 98a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller 99aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_vpLoadModelMatrix(const rsc_Matrix *m) 100aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 101aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 102383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->getVertex()->setModelviewMatrix(rsc, m); 103aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 104aeb094b520d8ea49b74129927578f18f758c873eJason Sams 105aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_vpLoadTextureMatrix(const rsc_Matrix *m) 106aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 107aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 108383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->getVertex()->setTextureMatrix(rsc, m); 109aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 110aeb094b520d8ea49b74129927578f18f758c873eJason Sams 111aeb094b520d8ea49b74129927578f18f758c873eJason Sams 1126445e5210c6d7f8689e94be9026153d017c9545bJason Samsstatic void SC_pfConstantColor(RsProgramFragment vpf, float r, float g, float b, float a) 1136445e5210c6d7f8689e94be9026153d017c9545bJason Sams{ 114383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk GET_TLS(); 1156445e5210c6d7f8689e94be9026153d017c9545bJason Sams ProgramFragment *pf = static_cast<ProgramFragment *>(vpf); 116383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 1176445e5210c6d7f8689e94be9026153d017c9545bJason Sams} 1186445e5210c6d7f8689e94be9026153d017c9545bJason Sams 11995333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchoukstatic void SC_vpGetProjectionMatrix(rsc_Matrix *m) 12095333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk{ 12195333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk GET_TLS(); 122383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->getVertex()->getProjectionMatrix(rsc, m); 12395333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk} 12495333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk 125aeb094b520d8ea49b74129927578f18f758c873eJason Sams 126aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 127aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing 128aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 129aeb094b520d8ea49b74129927578f18f758c873eJason Sams 130aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuadTexCoords(float x1, float y1, float z1, 131aeb094b520d8ea49b74129927578f18f758c873eJason Sams float u1, float v1, 132aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x2, float y2, float z2, 133aeb094b520d8ea49b74129927578f18f758c873eJason Sams float u2, float v2, 134aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x3, float y3, float z3, 135aeb094b520d8ea49b74129927578f18f758c873eJason Sams float u3, float v3, 136aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x4, float y4, float z4, 137aeb094b520d8ea49b74129927578f18f758c873eJason Sams float u4, float v4) 138aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 139aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 140aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 141aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 142aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 143aeb094b520d8ea49b74129927578f18f758c873eJason Sams 144aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("Quad"); 145aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1); 146aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2); 147aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3); 148aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4); 149aeb094b520d8ea49b74129927578f18f758c873eJason Sams 150aeb094b520d8ea49b74129927578f18f758c873eJason Sams float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4}; 151aeb094b520d8ea49b74129927578f18f758c873eJason Sams const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4}; 152aeb094b520d8ea49b74129927578f18f758c873eJason Sams 153aeb094b520d8ea49b74129927578f18f758c873eJason Sams VertexArray va; 15479f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams va.add(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "position"); 15579f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams va.add(GL_FLOAT, 2, 8, false, (uint32_t)tex, "texture0"); 15679f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache); 157aeb094b520d8ea49b74129927578f18f758c873eJason Sams 158aeb094b520d8ea49b74129927578f18f758c873eJason Sams glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 159aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 160aeb094b520d8ea49b74129927578f18f758c873eJason Sams 161aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawQuad(float x1, float y1, float z1, 162aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x2, float y2, float z2, 163aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x3, float y3, float z3, 164aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x4, float y4, float z4) 165aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 166aeb094b520d8ea49b74129927578f18f758c873eJason Sams SC_drawQuadTexCoords(x1, y1, z1, 0, 1, 167aeb094b520d8ea49b74129927578f18f758c873eJason Sams x2, y2, z2, 1, 1, 168aeb094b520d8ea49b74129927578f18f758c873eJason Sams x3, y3, z3, 1, 0, 169aeb094b520d8ea49b74129927578f18f758c873eJason Sams x4, y4, z4, 0, 0); 170aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 171aeb094b520d8ea49b74129927578f18f758c873eJason Sams 172aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h) 173aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 174aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 175aeb094b520d8ea49b74129927578f18f758c873eJason Sams ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex()); 176aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsc->setVertex(rsc->getDefaultProgramVertex()); 177aeb094b520d8ea49b74129927578f18f758c873eJason Sams //rsc->setupCheck(); 178aeb094b520d8ea49b74129927578f18f758c873eJason Sams 179aeb094b520d8ea49b74129927578f18f758c873eJason Sams //GLint crop[4] = {0, h, w, -h}; 180aeb094b520d8ea49b74129927578f18f758c873eJason Sams 181aeb094b520d8ea49b74129927578f18f758c873eJason Sams float sh = rsc->getHeight(); 182aeb094b520d8ea49b74129927578f18f758c873eJason Sams 183aeb094b520d8ea49b74129927578f18f758c873eJason Sams SC_drawQuad(x, sh - y, z, 184aeb094b520d8ea49b74129927578f18f758c873eJason Sams x+w, sh - y, z, 185aeb094b520d8ea49b74129927578f18f758c873eJason Sams x+w, sh - (y+h), z, 186aeb094b520d8ea49b74129927578f18f758c873eJason Sams x, sh - (y+h), z); 187aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsc->setVertex((ProgramVertex *)tmp.get()); 188aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 189bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams/* 190aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawSprite(float x, float y, float z, float w, float h) 191aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 192aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 193aeb094b520d8ea49b74129927578f18f758c873eJason Sams float vin[3] = {x, y, z}; 194aeb094b520d8ea49b74129927578f18f758c873eJason Sams float vout[4]; 195aeb094b520d8ea49b74129927578f18f758c873eJason Sams 196aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("ds in %f %f %f", x, y, z); 197aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsc->getVertex()->transformToScreen(rsc, vout, vin); 198aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("ds out %f %f %f %f", vout[0], vout[1], vout[2], vout[3]); 199aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[0] /= vout[3]; 200aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[1] /= vout[3]; 201aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[2] /= vout[3]; 202aeb094b520d8ea49b74129927578f18f758c873eJason Sams 203aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[0] *= rsc->getWidth() / 2; 204aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[1] *= rsc->getHeight() / 2; 205aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[0] += rsc->getWidth() / 2; 206aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[1] += rsc->getHeight() / 2; 207aeb094b520d8ea49b74129927578f18f758c873eJason Sams 208aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[0] -= w/2; 209aeb094b520d8ea49b74129927578f18f758c873eJason Sams vout[1] -= h/2; 210aeb094b520d8ea49b74129927578f18f758c873eJason Sams 211aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("ds out2 %f %f %f", vout[0], vout[1], vout[2]); 212aeb094b520d8ea49b74129927578f18f758c873eJason Sams 213aeb094b520d8ea49b74129927578f18f758c873eJason Sams // U, V, W, H 214aeb094b520d8ea49b74129927578f18f758c873eJason Sams SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w); 215aeb094b520d8ea49b74129927578f18f758c873eJason Sams //rsc->setupCheck(); 216aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 217bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams*/ 218aeb094b520d8ea49b74129927578f18f758c873eJason Sams 219aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_drawRect(float x1, float y1, 220aeb094b520d8ea49b74129927578f18f758c873eJason Sams float x2, float y2, float z) 221aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 222aeb094b520d8ea49b74129927578f18f758c873eJason Sams //LOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z); 223aeb094b520d8ea49b74129927578f18f758c873eJason Sams SC_drawQuad(x1, y2, z, 224aeb094b520d8ea49b74129927578f18f758c873eJason Sams x2, y2, z, 225aeb094b520d8ea49b74129927578f18f758c873eJason Sams x2, y1, z, 226aeb094b520d8ea49b74129927578f18f758c873eJason Sams x1, y1, z); 227aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 228aeb094b520d8ea49b74129927578f18f758c873eJason Sams 2294e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMesh(RsMesh vsm) 2304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk GET_TLS(); 2324e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(vsm); 233aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 234aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 235aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 236aeb094b520d8ea49b74129927578f18f758c873eJason Sams sm->render(rsc); 237aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 238aeb094b520d8ea49b74129927578f18f758c873eJason Sams 2394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMeshPrimitive(RsMesh vsm, uint32_t primIndex) 240aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 241aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 2424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(vsm); 243aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 244aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 245aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 2464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitive(rsc, primIndex); 2474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukstatic void SC_drawMeshPrimitiveRange(RsMesh vsm, uint32_t primIndex, uint32_t start, uint32_t len) 2504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk GET_TLS(); 2524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(vsm); 2534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (!rsc->setupCheck()) { 2544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 2554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitiveRange(rsc, primIndex, start, len); 257aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 258aeb094b520d8ea49b74129927578f18f758c873eJason Sams 259ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchoukstatic void SC_meshComputeBoundingBox(RsMesh vsm, float *minX, float *minY, float *minZ, 260ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk float *maxX, float *maxY, float *maxZ) 261ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk{ 262ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk GET_TLS(); 263ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(vsm); 264ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk sm->computeBBox(); 265ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minX = sm->mBBoxMin[0]; 266ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minY = sm->mBBoxMin[1]; 267ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minZ = sm->mBBoxMin[2]; 268ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxX = sm->mBBoxMax[0]; 269ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxY = sm->mBBoxMax[1]; 270ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxZ = sm->mBBoxMax[2]; 271ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 272ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 273aeb094b520d8ea49b74129927578f18f758c873eJason Sams 274aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 275aeb094b520d8ea49b74129927578f18f758c873eJason Sams// 276aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 277aeb094b520d8ea49b74129927578f18f758c873eJason Sams 278aeb094b520d8ea49b74129927578f18f758c873eJason Sams 279aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_color(float r, float g, float b, float a) 280aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 281aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 2826445e5210c6d7f8689e94be9026153d017c9545bJason Sams ProgramFragment *pf = (ProgramFragment *)rsc->getFragment(); 283383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 284aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 285aeb094b520d8ea49b74129927578f18f758c873eJason Sams 28622fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_uploadToTexture2(RsAllocation va, uint32_t baseMipLevel) 287aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 288aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 289aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel); 290aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 29122fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_uploadToTexture(RsAllocation va) 29222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams{ 29322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams GET_TLS(); 29422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams rsi_AllocationUploadToTexture(rsc, va, false, 0); 29522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams} 296aeb094b520d8ea49b74129927578f18f758c873eJason Sams 297aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic void SC_uploadToBufferObject(RsAllocation va) 298aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 299aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 300aeb094b520d8ea49b74129927578f18f758c873eJason Sams rsi_AllocationUploadToBufferObject(rsc, va); 301aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 302aeb094b520d8ea49b74129927578f18f758c873eJason Sams 30322fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_ClearColor(float r, float g, float b, float a) 304aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 305aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 30622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams if (!rsc->setupCheck()) { 30722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams return; 30822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams } 309aeb094b520d8ea49b74129927578f18f758c873eJason Sams 31022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams glClearColor(r, g, b, a); 31122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams glClear(GL_COLOR_BUFFER_BIT); 312aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 313aeb094b520d8ea49b74129927578f18f758c873eJason Sams 31422fa371bf64b8aae786acfe5d711af21afb13a93Jason Samsstatic void SC_ClearDepth(float v) 315aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 316aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 31722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams if (!rsc->setupCheck()) { 31822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams return; 31922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams } 32022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 32122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams glClearDepthf(v); 32222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams glClear(GL_DEPTH_BUFFER_BIT); 323aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 324aeb094b520d8ea49b74129927578f18f758c873eJason Sams 325aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic uint32_t SC_getWidth() 326aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 327aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 328aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getWidth(); 329aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 330aeb094b520d8ea49b74129927578f18f758c873eJason Sams 331aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic uint32_t SC_getHeight() 332aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 333aeb094b520d8ea49b74129927578f18f758c873eJason Sams GET_TLS(); 334aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getHeight(); 335aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 336aeb094b520d8ea49b74129927578f18f758c873eJason Sams 337d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_DrawTextAlloc(RsAllocation va, int x, int y) 338d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{ 339d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk GET_TLS(); 340d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk Allocation *alloc = static_cast<Allocation *>(va); 341d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk rsc->mStateFont.renderText(alloc, x, y); 342d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 343d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 344d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_DrawText(const char *text, int x, int y) 345d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{ 346d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk GET_TLS(); 347d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk rsc->mStateFont.renderText(text, x, y); 348d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 349d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 350d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukstatic void SC_BindFont(RsFont font) 351d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk{ 352d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk GET_TLS(); 353d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk rsi_ContextBindFont(rsc, font); 354d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 355aeb094b520d8ea49b74129927578f18f758c873eJason Sams 3569fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchoukstatic void SC_FontColor(float r, float g, float b, float a) 3579fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk{ 3589fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk GET_TLS(); 3599fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk rsc->mStateFont.setFontColor(r, g, b, a); 3609fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk} 3619fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk 362aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 363aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Class implementation 364aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 365aeb094b520d8ea49b74129927578f18f758c873eJason Sams 366aeb094b520d8ea49b74129927578f18f758c873eJason Sams// llvm name mangling ref 367aeb094b520d8ea49b74129927578f18f758c873eJason Sams// <builtin-type> ::= v # void 368aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= b # bool 369aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= c # char 370aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= a # signed char 371aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= h # unsigned char 372aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= s # short 373aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= t # unsigned short 374aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= i # int 375aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= j # unsigned int 376aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= l # long 377aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= m # unsigned long 378aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= x # long long, __int64 379aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= y # unsigned long long, __int64 380aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= f # float 381aeb094b520d8ea49b74129927578f18f758c873eJason Sams// ::= d # double 382aeb094b520d8ea49b74129927578f18f758c873eJason Sams 383aeb094b520d8ea49b74129927578f18f758c873eJason Samsstatic ScriptCState::SymbolTable_t gSyms[] = { 3847349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_bindProgramFragment }, 3857349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_bindProgramStore }, 3867349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_bindProgramVertex }, 3877349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_bindProgramRaster }, 3887349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_bindSampler }, 3897349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_bindTexture }, 39022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 3917349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadProjectionMatrix }, 3927349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadModelMatrix }, 3937349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_vpLoadTextureMatrix }, 39422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 39595333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_vpGetProjectionMatrix }, 39695333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk 3976445e5210c6d7f8689e94be9026153d017c9545bJason Sams { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_pfConstantColor }, 3986445e5210c6d7f8689e94be9026153d017c9545bJason Sams 3997349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z11rsgGetWidthv", (void *)&SC_getWidth }, 4007349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z12rsgGetHeightv", (void *)&SC_getHeight }, 40122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 4027349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z18rsgUploadToTexture13rs_allocationj", (void *)&SC_uploadToTexture2 }, 4038c88090e8cccab103eebe2ff569e116e9f5fb208Jason Sams { "_Z18rsgUploadToTexture13rs_allocation", (void *)&SC_uploadToTexture }, 4047349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z23rsgUploadToBufferObject13rs_allocation", (void *)&SC_uploadToBufferObject }, 40522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 4067349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z11rsgDrawRectfffff", (void *)&SC_drawRect }, 4077349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_drawQuad }, 4087349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_drawQuadTexCoords }, 4097349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_drawSpriteScreenspace }, 41022fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 4114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_drawMesh }, 4127349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_drawMeshPrimitive }, 4137349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_drawMeshPrimitiveRange }, 414ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_meshComputeBoundingBox }, 4154e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 4167349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z13rsgClearColorffff", (void *)&SC_ClearColor }, 4177349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth }, 41822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 419d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText }, 420d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc }, 421d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 4227349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont }, 4239fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk { "_Z12rsgFontColorffff", (void *)&SC_FontColor }, 424d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 425aeb094b520d8ea49b74129927578f18f758c873eJason Sams // misc 4267349547db61d2d458b31c074b902d56d082e5d84Jason Sams { "_Z5colorffff", (void *)&SC_color }, 427aeb094b520d8ea49b74129927578f18f758c873eJason Sams 428aeb094b520d8ea49b74129927578f18f758c873eJason Sams { NULL, NULL } 429aeb094b520d8ea49b74129927578f18f758c873eJason Sams}; 430aeb094b520d8ea49b74129927578f18f758c873eJason Sams 431aeb094b520d8ea49b74129927578f18f758c873eJason Samsconst ScriptCState::SymbolTable_t * ScriptCState::lookupSymbolGL(const char *sym) 432aeb094b520d8ea49b74129927578f18f758c873eJason Sams{ 433aeb094b520d8ea49b74129927578f18f758c873eJason Sams ScriptCState::SymbolTable_t *syms = gSyms; 434aeb094b520d8ea49b74129927578f18f758c873eJason Sams 435aeb094b520d8ea49b74129927578f18f758c873eJason Sams while (syms->mPtr) { 436aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!strcmp(syms->mName, sym)) { 437aeb094b520d8ea49b74129927578f18f758c873eJason Sams return syms; 438aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 439aeb094b520d8ea49b74129927578f18f758c873eJason Sams syms++; 440aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 441aeb094b520d8ea49b74129927578f18f758c873eJason Sams return NULL; 442aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 443aeb094b520d8ea49b74129927578f18f758c873eJason Sams 444