mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-22 03:10:41 +02:00
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.
This commit is contained in:
parent
07a248a366
commit
ee29b86129
1 changed files with 33 additions and 1 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue