arbprogram.c
来自「mesa-6.5-minigui源码」· C语言 代码 · 共 678 行 · 第 1/2 页
C
678 行
struct program *prog; ASSERT_OUTSIDE_BEGIN_END(ctx); FLUSH_VERTICES(ctx, _NEW_PROGRAM); if ((target == GL_FRAGMENT_PROGRAM_NV && ctx->Extensions.NV_fragment_program) || (target == GL_FRAGMENT_PROGRAM_ARB && ctx->Extensions.ARB_fragment_program)) { if (index >= ctx->Const.FragmentProgram.MaxLocalParams) { _mesa_error(ctx, GL_INVALID_VALUE, "glProgramLocalParameterARB"); return; } prog = &(ctx->FragmentProgram.Current->Base); } else if (target == GL_VERTEX_PROGRAM_ARB && ctx->Extensions.ARB_vertex_program) { if (index >= ctx->Const.VertexProgram.MaxLocalParams) { _mesa_error(ctx, GL_INVALID_VALUE, "glProgramLocalParameterARB"); return; } prog = &(ctx->VertexProgram.Current->Base); } else { _mesa_error(ctx, GL_INVALID_ENUM, "glProgramLocalParameterARB"); return; } ASSERT(index < MAX_PROGRAM_LOCAL_PARAMS); prog->LocalParams[index][0] = x; prog->LocalParams[index][1] = y; prog->LocalParams[index][2] = z; prog->LocalParams[index][3] = w;}/** * Note, this function is also used by the GL_NV_fragment_program extension. */void GLAPIENTRY_mesa_ProgramLocalParameter4fvARB(GLenum target, GLuint index, const GLfloat *params){ _mesa_ProgramLocalParameter4fARB(target, index, params[0], params[1], params[2], params[3]);}/** * Note, this function is also used by the GL_NV_fragment_program extension. */void GLAPIENTRY_mesa_ProgramLocalParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w){ _mesa_ProgramLocalParameter4fARB(target, index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);}/** * Note, this function is also used by the GL_NV_fragment_program extension. */void GLAPIENTRY_mesa_ProgramLocalParameter4dvARB(GLenum target, GLuint index, const GLdouble *params){ _mesa_ProgramLocalParameter4fARB(target, index, (GLfloat) params[0], (GLfloat) params[1], (GLfloat) params[2], (GLfloat) params[3]);}/** * Note, this function is also used by the GL_NV_fragment_program extension. */void GLAPIENTRY_mesa_GetProgramLocalParameterfvARB(GLenum target, GLuint index, GLfloat *params){ const struct program *prog; GLuint maxParams; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END(ctx); if (target == GL_VERTEX_PROGRAM_ARB && ctx->Extensions.ARB_vertex_program) { prog = &(ctx->VertexProgram.Current->Base); maxParams = ctx->Const.VertexProgram.MaxLocalParams; } else if (target == GL_FRAGMENT_PROGRAM_ARB && ctx->Extensions.ARB_fragment_program) { prog = &(ctx->FragmentProgram.Current->Base); maxParams = ctx->Const.FragmentProgram.MaxLocalParams; } else if (target == GL_FRAGMENT_PROGRAM_NV && ctx->Extensions.NV_fragment_program) { prog = &(ctx->FragmentProgram.Current->Base); maxParams = MAX_NV_FRAGMENT_PROGRAM_PARAMS; } else { _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramLocalParameterARB(target)"); return; } if (index >= maxParams) { _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramLocalParameterARB(index)"); return; } ASSERT(prog); ASSERT(index < MAX_PROGRAM_LOCAL_PARAMS); COPY_4V(params, prog->LocalParams[index]);}/** * Note, this function is also used by the GL_NV_fragment_program extension. */void GLAPIENTRY_mesa_GetProgramLocalParameterdvARB(GLenum target, GLuint index, GLdouble *params){ GET_CURRENT_CONTEXT(ctx); GLfloat floatParams[4]; _mesa_GetProgramLocalParameterfvARB(target, index, floatParams); if (ctx->ErrorValue == GL_NO_ERROR) { COPY_4V(params, floatParams); }}void GLAPIENTRY_mesa_GetProgramivARB(GLenum target, GLenum pname, GLint *params){ const struct gl_program_constants *limits; struct program *prog; GET_CURRENT_CONTEXT(ctx); if (!ctx->_CurrentProgram) ASSERT_OUTSIDE_BEGIN_END(ctx); if (target == GL_VERTEX_PROGRAM_ARB && ctx->Extensions.ARB_vertex_program) { prog = &(ctx->VertexProgram.Current->Base); limits = &ctx->Const.VertexProgram; } else if (target == GL_FRAGMENT_PROGRAM_ARB && ctx->Extensions.ARB_fragment_program) { prog = &(ctx->FragmentProgram.Current->Base); limits = &ctx->Const.FragmentProgram; } else { _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramivARB(target)"); return; } ASSERT(prog); ASSERT(limits); /* Queries supported for both vertex and fragment programs */ switch (pname) { case GL_PROGRAM_LENGTH_ARB: *params = prog->String ? (GLint) _mesa_strlen((char *) prog->String) : 0; return; case GL_PROGRAM_FORMAT_ARB: *params = prog->Format; return; case GL_PROGRAM_BINDING_ARB: *params = prog->Id; return; case GL_PROGRAM_INSTRUCTIONS_ARB: *params = prog->NumInstructions; return; case GL_MAX_PROGRAM_INSTRUCTIONS_ARB: *params = limits->MaxInstructions; return; case GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB: *params = prog->NumNativeInstructions; return; case GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB: *params = limits->MaxNativeInstructions; return; case GL_PROGRAM_TEMPORARIES_ARB: *params = prog->NumTemporaries; return; case GL_MAX_PROGRAM_TEMPORARIES_ARB: *params = limits->MaxTemps; return; case GL_PROGRAM_NATIVE_TEMPORARIES_ARB: *params = prog->NumNativeTemporaries; return; case GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB: *params = limits->MaxNativeTemps; return; case GL_PROGRAM_PARAMETERS_ARB: *params = prog->NumParameters; return; case GL_MAX_PROGRAM_PARAMETERS_ARB: *params = limits->MaxParameters; return; case GL_PROGRAM_NATIVE_PARAMETERS_ARB: *params = prog->NumNativeParameters; return; case GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB: *params = limits->MaxNativeParameters; return; case GL_PROGRAM_ATTRIBS_ARB: *params = prog->NumAttributes; return; case GL_MAX_PROGRAM_ATTRIBS_ARB: *params = limits->MaxAttribs; return; case GL_PROGRAM_NATIVE_ATTRIBS_ARB: *params = prog->NumNativeAttributes; return; case GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB: *params = limits->MaxNativeAttribs; return; case GL_PROGRAM_ADDRESS_REGISTERS_ARB: *params = prog->NumAddressRegs; return; case GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB: *params = limits->MaxAddressRegs; return; case GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB: *params = prog->NumNativeAddressRegs; return; case GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB: *params = limits->MaxNativeAddressRegs; return; case GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB: *params = limits->MaxLocalParams; return; case GL_MAX_PROGRAM_ENV_PARAMETERS_ARB: *params = limits->MaxEnvParams; return; case GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB: /* * XXX we may not really need a driver callback here. * If the number of native instructions, registers, etc. used * are all below the maximums, we could return true. * The spec says that even if this query returns true, there's * no guarantee that the program will run in hardware. */ if (ctx->Driver.IsProgramNative) *params = ctx->Driver.IsProgramNative( ctx, target, prog ); else *params = GL_TRUE; return; default: /* continue with fragment-program only queries below */ break; } /* * The following apply to fragment programs only (at this time) */ if (target == GL_FRAGMENT_PROGRAM_ARB) { const struct fragment_program *fp = ctx->FragmentProgram.Current; switch (pname) { case GL_PROGRAM_ALU_INSTRUCTIONS_ARB: *params = fp->NumNativeAluInstructions; return; case GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB: *params = fp->NumAluInstructions; return; case GL_PROGRAM_TEX_INSTRUCTIONS_ARB: *params = fp->NumTexInstructions; return; case GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB: *params = fp->NumNativeTexInstructions; return; case GL_PROGRAM_TEX_INDIRECTIONS_ARB: *params = fp->NumTexIndirections; return; case GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB: *params = fp->NumNativeTexIndirections; return; case GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB: *params = limits->MaxAluInstructions; return; case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB: *params = limits->MaxNativeAluInstructions; return; case GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB: *params = limits->MaxTexInstructions; return; case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB: *params = limits->MaxNativeTexInstructions; return; case GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB: *params = limits->MaxTexIndirections; return; case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB: *params = limits->MaxNativeTexIndirections; return; default: _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramivARB(pname)"); return; } }}void GLAPIENTRY_mesa_GetProgramStringARB(GLenum target, GLenum pname, GLvoid *string){ const struct program *prog; GET_CURRENT_CONTEXT(ctx); if (!ctx->_CurrentProgram) ASSERT_OUTSIDE_BEGIN_END(ctx); if (target == GL_VERTEX_PROGRAM_ARB) { prog = &(ctx->VertexProgram.Current->Base); } else if (target == GL_FRAGMENT_PROGRAM_ARB) { prog = &(ctx->FragmentProgram.Current->Base); } else { _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramStringARB(target)"); return; } ASSERT(prog); if (pname != GL_PROGRAM_STRING_ARB) { _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramStringARB(pname)"); return; } _mesa_memcpy(string, prog->String, _mesa_strlen((char *) prog->String));}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?