rsProgramRaster.cpp revision 8cfdd24fec22080b72266d33f61befc4a98b77c6
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "rsContext.h"
18#include "rsProgramRaster.h"
19
20#include <GLES/gl.h>
21#include <GLES/glext.h>
22
23using namespace android;
24using namespace android::renderscript;
25
26
27ProgramRaster::ProgramRaster(Context *rsc,
28                             Element *in,
29                             Element *out,
30                             bool pointSmooth,
31                             bool lineSmooth,
32                             bool pointSprite) :
33    Program(rsc, in, out)
34{
35    mAllocFile = __FILE__;
36    mAllocLine = __LINE__;
37    mPointSmooth = pointSmooth;
38    mLineSmooth = lineSmooth;
39    mPointSprite = pointSprite;
40
41    mPointSize = 1.0f;
42    mLineWidth = 1.0f;
43}
44
45ProgramRaster::~ProgramRaster()
46{
47}
48
49void ProgramRaster::setLineWidth(float s)
50{
51    mLineWidth = s;
52}
53
54void ProgramRaster::setPointSize(float s)
55{
56    mPointSize = s;
57}
58
59void ProgramRaster::setupGL(const Context *rsc, ProgramRasterState *state)
60{
61    if (state->mLast.get() == this) {
62        return;
63    }
64    state->mLast.set(this);
65
66    glPointSize(mPointSize);
67    if (mPointSmooth) {
68        glEnable(GL_POINT_SMOOTH);
69    } else {
70        glDisable(GL_POINT_SMOOTH);
71    }
72
73    glLineWidth(mLineWidth);
74    if (mLineSmooth) {
75        glEnable(GL_LINE_SMOOTH);
76    } else {
77        glDisable(GL_LINE_SMOOTH);
78    }
79
80    if (rsc->checkVersion1_1()) {
81        if (mPointSprite) {
82            glEnable(GL_POINT_SPRITE_OES);
83        } else {
84            glDisable(GL_POINT_SPRITE_OES);
85        }
86    }
87}
88
89
90
91ProgramRasterState::ProgramRasterState()
92{
93}
94
95ProgramRasterState::~ProgramRasterState()
96{
97}
98
99void ProgramRasterState::init(Context *rsc, int32_t w, int32_t h)
100{
101    ProgramRaster *pr = new ProgramRaster(rsc, NULL, NULL, false, false, false);
102    mDefault.set(pr);
103}
104
105void ProgramRasterState::deinit(Context *rsc)
106{
107    mDefault.clear();
108    mLast.clear();
109}
110
111
112namespace android {
113namespace renderscript {
114
115RsProgramRaster rsi_ProgramRasterCreate(Context * rsc, RsElement in, RsElement out,
116                                      bool pointSmooth,
117                                      bool lineSmooth,
118                                      bool pointSprite)
119{
120    ProgramRaster *pr = new ProgramRaster(rsc,
121                                          static_cast<Element *>(in),
122                                          static_cast<Element *>(out),
123                                          pointSmooth,
124                                          lineSmooth,
125                                          pointSprite);
126    pr->incUserRef();
127    return pr;
128}
129
130void rsi_ProgramRasterSetPointSize(Context * rsc, RsProgramRaster vpr, float s)
131{
132    ProgramRaster *pr = static_cast<ProgramRaster *>(vpr);
133    pr->setPointSize(s);
134}
135
136void rsi_ProgramRasterSetLineWidth(Context * rsc, RsProgramRaster vpr, float s)
137{
138    ProgramRaster *pr = static_cast<ProgramRaster *>(vpr);
139    pr->setLineWidth(s);
140}
141
142
143}
144}
145
146