mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 04:48:08 +02:00
nouveau: fail translate if we use too many params somehow
This commit is contained in:
parent
9622a634f6
commit
4185037af2
3 changed files with 31 additions and 5 deletions
|
|
@ -96,7 +96,9 @@ nouveauProgramStringNotify(GLcontext *ctx, GLenum target,
|
|||
|
||||
if (nvs->translated)
|
||||
FREE(nvs->program);
|
||||
nvs->translated = 0;
|
||||
|
||||
nvs->error = GL_FALSE;
|
||||
nvs->translated = GL_FALSE;
|
||||
|
||||
_tnl_program_string(ctx, target, prog);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ typedef struct _nouveauShader {
|
|||
nvsFunc *func;
|
||||
|
||||
/* State of the final program */
|
||||
GLboolean error;
|
||||
GLboolean translated;
|
||||
GLboolean on_hardware;
|
||||
unsigned int *program;
|
||||
|
|
@ -424,6 +425,12 @@ nvsSwizzle(nvsRegister reg, nvsSwzComp x, nvsSwzComp y,
|
|||
return reg;
|
||||
}
|
||||
|
||||
#define nvsProgramError(nvs,fmt,args...) do { \
|
||||
fprintf(stderr, "nvsProgramError (%s): "fmt, __func__, ##args); \
|
||||
(nvs)->error = GL_TRUE; \
|
||||
(nvs)->translated = GL_FALSE; \
|
||||
} while(0)
|
||||
|
||||
extern GLboolean nvsUpdateShader(GLcontext *ctx, nouveauShader *nvs);
|
||||
extern void nvsDisasmHWShader(nvsPtr);
|
||||
extern void nvsDumpFragmentList(nvsFragmentHeader *f, int lvl);
|
||||
|
|
|
|||
|
|
@ -924,7 +924,7 @@ pass0_rebase_mesa_consts(nouveauShader *nvs)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
static GLboolean
|
||||
pass0_resolve_mesa_consts(nouveauShader *nvs)
|
||||
{
|
||||
struct pass0_rec *rec = nvs->pass_rec;
|
||||
|
|
@ -945,6 +945,11 @@ pass0_resolve_mesa_consts(nouveauShader *nvs)
|
|||
for (i=0; i<plist->NumParameters; i++) {
|
||||
int hw = rec->mesa_const_base + i;
|
||||
|
||||
if (hw > NVS_MAX_CONSTS) {
|
||||
nvsProgramError(nvs, "hw = %d > NVS_MAX_CONSTS!\n", hw);
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
switch (plist->Parameters[i].Type) {
|
||||
case PROGRAM_NAMED_PARAM:
|
||||
case PROGRAM_STATE_VAR:
|
||||
|
|
@ -958,10 +963,13 @@ pass0_resolve_mesa_consts(nouveauShader *nvs)
|
|||
COPY_4V(nvs->params[hw].val, plist->ParameterValues[i]);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
nvsProgramError(nvs, "hit bad type=%d on param %d\n",
|
||||
plist->Parameters[i].Type, i);
|
||||
return GL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
GLboolean
|
||||
|
|
@ -976,6 +984,14 @@ nouveau_shader_pass0(GLcontext *ctx, nouveauShader *nvs)
|
|||
|
||||
NVSDBG("start: nvs=%p\n", nvs);
|
||||
|
||||
/* Previously detected an error, and haven't recieved new program
|
||||
* string, so fail immediately.
|
||||
*/
|
||||
if (nvs->error) {
|
||||
NVSDBG("failed previous compile attempt, not retrying\n");
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
rec = CALLOC_STRUCT(pass0_rec);
|
||||
if (!rec)
|
||||
return GL_FALSE;
|
||||
|
|
@ -1020,7 +1036,8 @@ nouveau_shader_pass0(GLcontext *ctx, nouveauShader *nvs)
|
|||
|
||||
ret = pass0_translate_instructions(nvs, 0, 0, nvs->program_tree);
|
||||
if (ret)
|
||||
pass0_resolve_mesa_consts(nvs);
|
||||
ret = pass0_resolve_mesa_consts(nvs);
|
||||
|
||||
/*XXX: if (!ret) DESTROY TREE!!! */
|
||||
|
||||
FREE(rec);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue