Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Mesa
piglit
Commits
85e8a8a2
Commit
85e8a8a2
authored
Dec 17, 2008
by
Ian Romanick
Browse files
Test NPOT and rectangle textures
parent
2dba2fde
Changes
1
Hide whitespace changes
Inline
Side-by-side
tests/texturing/copytexsubimage.c
View file @
85e8a8a2
...
...
@@ -25,7 +25,7 @@
*
*/
#include
"
GL/glut.h
"
#include
<
GL/glut.h
>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
...
...
@@ -35,6 +35,12 @@
static
GLboolean
Automatic
=
GL_FALSE
;
/** Should GL_TEXTURE_RECTANGLE_ARB be tested? */
int
have_rect
=
0
;
/** Should non-power-of-two textures be tested? */
int
have_NPOT
=
0
;
static
void
rect
(
int
x1
,
int
y1
,
int
x2
,
int
y2
)
{
glBegin
(
GL_POLYGON
);
...
...
@@ -98,16 +104,26 @@ check_results(int dstx, int dsty, int w, int h)
return
pass
;
}
static
void
display
()
static
GLboolean
do_row
(
int
srcy
,
int
srcw
,
int
srch
,
GLenum
target
)
{
int
srcx
=
20
,
srcy
=
20
,
srcw
=
32
,
srch
=
32
;
int
dstx
=
80
,
dsty
=
20
;
int
dstx2
=
140
,
dsty2
=
20
;
int
texname
,
x
,
y
;
int
srcx
=
20
;
int
dstx
=
80
,
dsty
=
srcy
;
int
dstx2
=
140
,
dsty2
=
srcy
;
int
remain_width
;
int
remain_height
;
GLuint
texname
;
GLboolean
pass
=
GL_TRUE
;
glClearColor
(
0
.
5
,
0
.
5
,
0
.
5
,
1
.
0
);
glClear
(
GL_COLOR_BUFFER_BIT
);
/* Rectangle textures use coordinates on the range [0..w]x[0..h],
* where as all other textures use coordinates on the range
* [0..1]x[0..1].
*/
const
GLfloat
tex_s_max
=
(
target
==
GL_TEXTURE_RECTANGLE_ARB
)
?
(
float
)
srcw
:
1
.
0
;
const
GLfloat
tex_t_max
=
(
target
==
GL_TEXTURE_RECTANGLE_ARB
)
?
(
float
)
srch
:
1
.
0
;
/* Draw the object we're going to copy */
glColor3f
(
1
.
0
,
0
.
0
,
0
.
0
);
...
...
@@ -119,59 +135,121 @@ static void display()
/* Create a texture image and copy it in */
glGenTextures
(
1
,
&
texname
);
glBindTexture
(
GL_TEXTURE_2D
,
texname
);
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_MIN_FILTER
,
GL_NEAREST
);
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_MAG_FILTER
,
GL_NEAREST
);
glBindTexture
(
target
,
texname
);
glTexParameteri
(
target
,
GL_TEXTURE_MIN_FILTER
,
GL_NEAREST
);
glTexParameteri
(
target
,
GL_TEXTURE_MAG_FILTER
,
GL_NEAREST
);
/* The default mode is GL_REPEAT, and this mode is invalid for
* GL_TEXTURE_RECTANGLE_ARB textures.
*/
glTexParameteri
(
target
,
GL_TEXTURE_WRAP_S
,
GL_CLAMP_TO_EDGE
);
glTexParameteri
(
target
,
GL_TEXTURE_WRAP_T
,
GL_CLAMP_TO_EDGE
);
glTexEnvi
(
GL_TEXTURE_ENV
,
GL_TEXTURE_ENV_MODE
,
GL_REPLACE
);
glEnable
(
GL_TEXTURE_2D
);
glEnable
(
target
);
glTexImage2D
(
GL_TEXTURE_2D
,
0
,
GL_RGBA8
,
srcw
,
srch
,
0
,
glTexImage2D
(
target
,
0
,
GL_RGBA8
,
srcw
,
srch
,
0
,
GL_RGBA
,
GL_UNSIGNED_BYTE
,
NULL
);
glCopyTexSubImage2D
(
GL_TEXTURE_2D
,
0
,
glCopyTexSubImage2D
(
target
,
0
,
0
,
0
,
/* offset in image */
srcx
,
srcy
,
/* offset in readbuffer */
srcw
,
srch
);
/* Draw the texture image out */
glBegin
(
GL_POLYGON
);
glTexCoord2f
(
0
.
0
,
0
.
0
);
glVertex2f
(
dstx
,
dsty
);
glTexCoord2f
(
0
.
0
,
1
.
0
);
glVertex2f
(
dstx
,
dsty
+
srch
);
glTexCoord2f
(
1
.
0
,
1
.
0
);
glVertex2f
(
dstx
+
srcw
,
dsty
+
srch
);
glTexCoord2f
(
1
.
0
,
0
.
0
);
glVertex2f
(
dstx
+
srcw
,
dsty
);
glTexCoord2f
(
0
.
0
,
0
.
0
);
glVertex2f
(
dstx
,
dsty
);
glTexCoord2f
(
0
.
0
,
tex_t_max
);
glVertex2f
(
dstx
,
dsty
+
srch
);
glTexCoord2f
(
tex_s_max
,
tex_t_max
);
glVertex2f
(
dstx
+
srcw
,
dsty
+
srch
);
glTexCoord2f
(
tex_s_max
,
0
.
0
);
glVertex2f
(
dstx
+
srcw
,
dsty
);
glEnd
();
glTexImage2D
(
GL_TEXTURE_2D
,
0
,
GL_RGBA8
,
srcw
,
srch
,
0
,
glTexImage2D
(
target
,
0
,
GL_RGBA8
,
srcw
,
srch
,
0
,
GL_RGBA
,
GL_UNSIGNED_BYTE
,
NULL
);
glCopyTexSubImage2D
(
GL_TEXTURE_2D
,
0
,
remain_width
=
srcw
-
(
srcw
/
2
);
remain_height
=
srch
-
(
srch
/
2
);
glCopyTexSubImage2D
(
target
,
0
,
0
,
0
,
/* offset in image */
srcx
,
srcy
,
/* offset in readbuffer */
srcw
/
2
,
srch
/
2
);
glCopyTexSubImage2D
(
GL_TEXTURE_2D
,
0
,
glCopyTexSubImage2D
(
target
,
0
,
srcw
/
2
,
0
,
/* offset in image */
srcx
+
srcw
/
2
,
srcy
,
/* offset in readbuffer */
srcw
/
2
,
srch
/
2
);
glCopyTexSubImage2D
(
GL_TEXTURE_2D
,
0
,
remain_width
,
srch
/
2
);
glCopyTexSubImage2D
(
target
,
0
,
0
,
srch
/
2
,
/* offset in image */
srcx
,
srcy
+
srch
/
2
,
/* offset in readbuffer */
srcw
/
2
,
srch
/
2
);
glCopyTexSubImage2D
(
GL_TEXTURE_2D
,
0
,
srcw
/
2
,
remain_height
);
glCopyTexSubImage2D
(
target
,
0
,
srcw
/
2
,
srch
/
2
,
/* offset in image */
srcx
+
srcw
/
2
,
srcy
+
srch
/
2
,
/* offset in readbuffer */
srcw
/
2
,
srch
/
2
);
remain_width
,
remain_height
);
/* Draw the texture image out */
glBegin
(
GL_POLYGON
);
glTexCoord2f
(
0
.
0
,
0
.
0
);
glVertex2f
(
dstx2
,
dsty2
);
glTexCoord2f
(
0
.
0
,
1
.
0
);
glVertex2f
(
dstx2
,
dsty2
+
srch
);
glTexCoord2f
(
1
.
0
,
1
.
0
);
glVertex2f
(
dstx2
+
srcw
,
dsty2
+
srch
);
glTexCoord2f
(
1
.
0
,
0
.
0
);
glVertex2f
(
dstx2
+
srcw
,
dsty2
);
glTexCoord2f
(
0
.
0
,
0
.
0
);
glVertex2f
(
dstx2
,
dsty2
);
glTexCoord2f
(
0
.
0
,
tex_t_max
);
glVertex2f
(
dstx2
,
dsty2
+
srch
);
glTexCoord2f
(
tex_s_max
,
tex_t_max
);
glVertex2f
(
dstx2
+
srcw
,
dsty2
+
srch
);
glTexCoord2f
(
tex_s_max
,
0
.
0
);
glVertex2f
(
dstx2
+
srcw
,
dsty2
);
glEnd
();
glDisable
(
GL_TEXTURE_2D
);
glDisable
(
target
);
glDeleteTextures
(
1
,
&
texname
);
pass
&=
check_results
(
dstx
,
dsty
,
srcw
,
srch
);
pass
&=
check_results
(
dstx2
,
dsty2
,
srcw
,
srch
);
return
pass
;
}
static
void
display
()
{
GLboolean
pass
;
int
srcy
=
5
;
glClear
(
GL_COLOR_BUFFER_BIT
);
/* Test plain old 2D textures.
*/
pass
=
do_row
(
srcy
,
32
,
32
,
GL_TEXTURE_2D
);
srcy
+=
33
+
5
;
/* Test non-power-of-two 2D textures.
*/
if
(
have_NPOT
)
{
pass
&=
do_row
(
srcy
,
31
,
13
,
GL_TEXTURE_2D
);
srcy
+=
15
;
pass
&=
do_row
(
srcy
,
11
,
34
,
GL_TEXTURE_2D
);
srcy
+=
35
+
5
;
}
/* Test non-power-of-two 2D textures.
*/
if
(
have_rect
)
{
pass
&=
do_row
(
srcy
,
31
,
13
,
GL_TEXTURE_RECTANGLE_ARB
);
srcy
+=
14
;
pass
&=
do_row
(
srcy
,
11
,
34
,
GL_TEXTURE_RECTANGLE_ARB
);
srcy
+=
35
+
5
;
}
if
(
Automatic
)
{
printf
(
"PIGLIT: {'result': '%s' }
\n
"
,
pass
?
"pass"
:
"fail"
);
...
...
@@ -191,6 +269,15 @@ static void init()
glMatrixMode
(
GL_MODELVIEW
);
glPushMatrix
();
glLoadIdentity
();
glClearColor
(
0
.
5
,
0
.
5
,
0
.
5
,
1
.
0
);
have_NPOT
=
((
atof
((
const
char
*
)
glGetString
(
GL_VERSION
))
>=
2
.
0
)
||
(
glutExtensionSupported
(
"GL_ARB_texture_non_power_of_two"
)));
have_rect
=
((
glutExtensionSupported
(
"GL_ARB_texture_rectangle"
))
||
(
glutExtensionSupported
(
"GL_EXT_texture_rectangle"
))
||
(
glutExtensionSupported
(
"GL_NV_texture_rectangle"
)));
}
int
main
(
int
argc
,
char
**
argv
)
...
...
@@ -205,4 +292,6 @@ int main(int argc, char**argv)
init
();
glutDisplayFunc
(
display
);
glutMainLoop
();
return
0
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment