Przeglądaj źródła

i965: Reject shaders with uninlined function calls instead of hanging.

Most of the failure from using uninlined function calls ends up being
just bad rendering, but nested function calls in the VS currently hang
the GPU, so reject them and explain why.
tags/mesa-7.9-rc1
Eric Anholt 15 lat temu
rodzic
commit
ee29b86129
1 zmienionych plików z 33 dodań i 1 usunięć
  1. 33
    1
      src/mesa/drivers/dri/i965/brw_program.c

+ 33
- 1
src/mesa/drivers/dri/i965/brw_program.c Wyświetl plik

@@ -34,6 +34,7 @@
#include "shader/prog_parameter.h"
#include "shader/program.h"
#include "shader/programopt.h"
#include "shader/shader_api.h"
#include "tnl/tnl.h"

#include "brw_context.h"
@@ -119,12 +120,28 @@ static GLboolean brwIsProgramNative( GLcontext *ctx,
return GL_TRUE;
}

static void
shader_error(GLcontext *ctx, struct gl_program *prog, const char *msg)
{
struct gl_shader_program *shader;

shader = _mesa_lookup_shader_program(ctx, prog->Id);

if (shader) {
if (shader->InfoLog) {
free(shader->InfoLog);
}
shader->InfoLog = _mesa_strdup(msg);
shader->LinkStatus = GL_FALSE;
}
}

static GLboolean brwProgramStringNotify( GLcontext *ctx,
GLenum target,
struct gl_program *prog )
{
struct brw_context *brw = brw_context(ctx);
int i;

if (target == GL_FRAGMENT_PROGRAM_ARB) {
struct gl_fragment_program *fprog = (struct gl_fragment_program *) prog;
@@ -160,7 +177,22 @@ static GLboolean brwProgramStringNotify( GLcontext *ctx,
_tnl_program_string(ctx, target, prog);
}

/* XXX check if program is legal, within limits */
/* Reject programs with subroutines, which are totally broken at the moment
* (all program flows return when any program flow returns, and
* the VS also hangs if a function call calls a function.
*
* See piglit glsl-{vs,fs}-functions-[23] tests.
*/
for (i = 0; i < prog->NumInstructions; i++) {
if (prog->Instructions[i].Opcode == OPCODE_CAL) {
shader_error(ctx, prog,
"i965 driver doesn't yet support uninlined function "
"calls. Move to using a single return statement at "
"the end of the function to work around it.");
return GL_FALSE;
}
}

return GL_TRUE;
}


Ładowanie…
Anuluj
Zapisz