[Piglit] [PATCH] util: Add geometry shader version of piglit_build_simple_program functions
Ian Romanick
idr at freedesktop.org
Wed Sep 4 14:30:03 PDT 2013
On 09/04/2013 02:25 PM, Ian Romanick wrote:
> On 09/04/2013 11:08 AM, Jacob Penner wrote:
>> Add piglit_link_simple_program_with_gs()
>> Add piglit_build_simple_program_with_gs()
>> Add piglit_build_simple_program_unlinked_with_gs()
>> ---
>> tests/util/piglit-shader.c | 102 +++++++++++++++++++++++++++++++++++++++++++++
>> tests/util/piglit-shader.h | 7 ++++
>> 2 files changed, 109 insertions(+)
>>
>> diff --git a/tests/util/piglit-shader.c b/tests/util/piglit-shader.c
>> index f7bd06f..227f80c 100644
>> --- a/tests/util/piglit-shader.c
>> +++ b/tests/util/piglit-shader.c
>> @@ -322,3 +322,105 @@ piglit_build_simple_program(const char *vs_source, const char *fs_source)
>>
>> return prog;
>> }
>> +
>> +GLint piglit_link_simple_program_with_gs(GLint vs, GLint gs, GLint fs)
>
> Yuck. What's going to happen when we have tesselation shaders? In
> computers, there at most 4 numbers: zero, one, two, and N. Some will
> argue whether or not two should be in that list.
> piglit_link_simple_program already handles one and two, and there's no
> need for zero. I'd suggest making a new function:
>
> GLint piglit_link_program_mulitple_shaders(GLint sh1, ...)
> {
> va_list ap;
> GLint prog;
>
> piglit_require_GLSL();
>
> prog = glCreateProgram();
>
> va_start(ap, sh1);
>
> sh = sh1;
> do {
> glAttachShader(prog, sh);
> sh = va_arg(ap, GLint);
> } while (sh != 0);
>
> va_end(ap);
>
> /* If the shaders reference piglit_vertex or piglit_tex, bind
> * them to some fixed attribute locations so they can be used
> * with piglit_draw_rect_tex() in GLES.
> */
> glBindAttribLocation(prog, PIGLIT_ATTRIB_POS, "piglit_vertex");
> glBindAttribLocation(prog, PIGLIT_ATTRIB_TEX, "piglit_texcoord");
>
> glLinkProgram(prog);
>
> if (!piglit_link_check_status(prog)) {
> glDeleteProgram(prog);
> prog = 0;
> }
>
> return prog;
> }
>
> Use 0 to terminate the list, and use varargs macros to iterate the list.
>
> Do the same thing for the other variations.
>
>> +{
>> + GLint prog;
>> +
>> + piglit_require_GLSL();
>> +
>> + prog = glCreateProgram();
>> + if (vs)
>> + glAttachShader(prog, vs);
>> + if (gs)
>> + glAttachShader(prog, gs);
>> + if (fs)
>> + glAttachShader(prog, fs);
>> +
>> + /* If the shaders reference piglit_vertex or piglit_tex, bind
>> + * them to some fixed attribute locations so they can be used
>> + * with piglit_draw_rect_tex() in GLES.
>> + */
>> + glBindAttribLocation(prog, PIGLIT_ATTRIB_POS, "piglit_vertex");
>> + glBindAttribLocation(prog, PIGLIT_ATTRIB_TEX, "piglit_texcoord");
>> +
>> + glLinkProgram(prog);
>> +
>> + if (!piglit_link_check_status(prog)) {
>> + glDeleteProgram(prog);
>> + prog = 0;
>> + }
>> +
>> + return prog;
>> +}
>> +
>> +/**
>> + * Builds a program from optional VS, GS and FS sources, but does not link
>> + * it. If there is a compile failure, the test is terminated.
>> + */
>> +GLint
>> +piglit_build_simple_program_unlinked_with_gs(const char *vs_source,
>> + const char *gs_source,
>> + const char *fs_source)
I should have pointed out the signature for this version is more
complicated, but the idea is the same:
GLint
piglit_build_simple_program_unlinked_with_gs(const char *source1,
GLenum target1,
...);
>> +{
>> + GLuint prog;
>> +
>> + piglit_require_GLSL();
>> + prog = glCreateProgram();
>> + if (vs_source) {
>> + GLuint vs = piglit_compile_shader_text(GL_VERTEX_SHADER,
>> + vs_source);
>> + glAttachShader(prog, vs);
>> + glDeleteShader(vs);
>> + }
>> + if (gs_source) {
>> + GLuint gs = piglit_compile_shader_text(GL_GEOMETRY_SHADER,
>> + gs_source);
>> + glAttachShader(prog, gs);
>> + glDeleteShader(gs);
>> + }
>> + if (fs_source) {
>> + GLuint fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER,
>> + fs_source);
>> + glAttachShader(prog, fs);
>> + glDeleteShader(fs);
>> + }
>> + return prog;
>> +}
>> +
>> +/**
>> + * Builds and links a program from optional VS, GS and FS sources,
>> + * throwing PIGLIT_FAIL on error.
>> + */
>> +GLint
>> +piglit_build_simple_program_with_gs(const char *vs_source,
>> + const char *gs_source,
>> + const char *fs_source)
>> +{
>> + GLuint vs = 0, gs = 0, fs = 0, prog;
>> +
>> + if (vs_source) {
>> + vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_source);
>> + }
>> +
>> + if (gs_source) {
>> + gs = piglit_compile_shader_text(GL_GEOMETRY_SHADER, gs_source);
>> + }
>> +
>> + if (fs_source) {
>> + fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_source);
>> + }
>> +
>> + prog = piglit_link_simple_program_with_gs(vs, gs, fs);
>> + if (!prog)
>> + piglit_report_result(PIGLIT_FAIL);
>> +
>> + if (fs)
>> + glDeleteShader(fs);
>> + if (gs)
>> + glDeleteShader(gs);
>> + if (vs)
>> + glDeleteShader(vs);
>> +
>> + return prog;
>> +}
>> diff --git a/tests/util/piglit-shader.h b/tests/util/piglit-shader.h
>> index 8f18f0a..91acbe8 100644
>> --- a/tests/util/piglit-shader.h
>> +++ b/tests/util/piglit-shader.h
>> @@ -38,6 +38,13 @@ GLint piglit_link_simple_program(GLint vs, GLint fs);
>> GLint piglit_build_simple_program(const char *vs_source, const char *fs_source);
>> GLuint piglit_build_simple_program_unlinked(const char *vs_source,
>> const char *fs_source);
>> +GLint piglit_link_simple_program_with_gs(GLint vs, GLint gs, GLint fs);
>> +GLint piglit_build_simple_program_with_gs(const char *vs_source,
>> + const char *gs_source,
>> + const char *fs_source);
>> +GLint piglit_build_simple_program_unlinked_with_gs(const char *vs_source,
>> + const char *gs_source,
>> + const char *fs_source);
>>
>> #if defined(PIGLIT_USE_OPENGL_ES1)
>> #define glAttachShader assert(!"glAttachShader does not exist in ES1")
>>
More information about the Piglit
mailing list