rsProgramRaster.cpp revision 771565f47fc44608444c00aa8fa3bda769ceaece
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                             bool pointSmooth,
29                             bool lineSmooth,
30                             bool pointSprite) :
31    Program(rsc)
32{
33    mAllocFile = __FILE__;
34    mAllocLine = __LINE__;
35    mPointSmooth = pointSmooth;
36    mLineSmooth = lineSmooth;
37    mPointSprite = pointSprite;
38
39    mPointSize = 1.0f;
40    mLineWidth = 1.0f;
41}
42
43ProgramRaster::~ProgramRaster()
44{
45}
46
47void ProgramRaster::setLineWidth(float s)
48{
49    mLineWidth = s;
50}
51
52void ProgramRaster::setPointSize(float s)
53{
54    mPointSize = s;
55}
56
57void ProgramRaster::setupGL(const Context *rsc, ProgramRasterState *state)
58{
59    if (state->mLast.get() == this) {
60        return;
61    }
62    state->mLast.set(this);
63
64    glPointSize(mPointSize);
65    if (mPointSmooth) {
66        glEnable(GL_POINT_SMOOTH);
67    } else {
68        glDisable(GL_POINT_SMOOTH);
69    }
70
71    glLineWidth(mLineWidth);
72    if (mLineSmooth) {
73        glEnable(GL_LINE_SMOOTH);
74    } else {
75        glDisable(GL_LINE_SMOOTH);
76    }
77
78    if (rsc->checkVersion1_1()) {
79        if (mPointSprite) {
80            glEnable(GL_POINT_SPRITE_OES);
81        } else {
82            glDisable(GL_POINT_SPRITE_OES);
83        }
84    }
85}
86
87void ProgramRaster::setupGL2(const Context *rsc, ProgramRasterState *state)
88{
89    if (state->mLast.get() == this) {
90        return;
91    }
92    state->mLast.set(this);
93}
94
95
96
97ProgramRasterState::ProgramRasterState()
98{
99}
100
101ProgramRasterState::~ProgramRasterState()
102{
103}
104
105void ProgramRasterState::init(Context *rsc)
106{
107    ProgramRaster *pr = new ProgramRaster(rsc, false, false, false);
108    mDefault.set(pr);
109}
110
111void ProgramRasterState::deinit(Context *rsc)
112{
113    mDefault.clear();
114    mLast.clear();
115}
116
117
118namespace android {
119namespace renderscript {
120
121RsProgramRaster rsi_ProgramRasterCreate(Context * rsc, RsElement in, RsElement out,
122                                      bool pointSmooth,
123                                      bool lineSmooth,
124                                      bool pointSprite)
125{
126    ProgramRaster *pr = new ProgramRaster(rsc,
127                                          pointSmooth,
128                                          lineSmooth,
129                                          pointSprite);
130    pr->incUserRef();
131    return pr;
132}
133
134void rsi_ProgramRasterSetPointSize(Context * rsc, RsProgramRaster vpr, float s)
135{
136    ProgramRaster *pr = static_cast<ProgramRaster *>(vpr);
137    pr->setPointSize(s);
138}
139
140void rsi_ProgramRasterSetLineWidth(Context * rsc, RsProgramRaster vpr, float s)
141{
142    ProgramRaster *pr = static_cast<ProgramRaster *>(vpr);
143    pr->setLineWidth(s);
144}
145
146
147}
148}
149
150