VirtualBox

Ignore:
Timestamp:
Oct 6, 2009 6:07:06 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
53228
Message:

crOpenGL: update to wine 1.1.30

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/arb_program_shader.c

    r22496 r23571  
    101101/* ARB_program_shader private data */
    102102
    103 struct loop_control
    104 {
    105     unsigned int count;
    106     unsigned int start;
    107     int step;
    108 };
    109 
    110103struct control_frame
    111104{
     
    125118        unsigned int                ifc_no;
    126119    };
    127     struct loop_control            loop_control;
     120    struct wined3d_shader_loop_control loop_control;
    128121    BOOL                            had_else;
    129122};
     
    142135{
    143136    struct ps_compile_args          super;
    144     DWORD                           bools; /* WORD is enough, use DWORD for alignment */
     137    WORD                            bools;
     138    WORD                            clip;  /* only a boolean, use a WORD for alignment */
    145139    unsigned char                   loop_ctrl[MAX_CONST_I][3];
    146140};
     
    282276 ********************************************************/
    283277
    284 /**
    285  * Loads floating point constants into the currently set ARB_vertex/fragment_program.
     278/* Loads floating point constants into the currently set ARB_vertex/fragment_program.
    286279 * When constant_list == NULL, it will load all the constants.
    287  * 
     280 *
    288281 * @target_type should be either GL_VERTEX_PROGRAM_ARB (for vertex shaders)
    289282 *  or GL_FRAGMENT_PROGRAM_ARB (for pixel shaders)
     
    294287{
    295288    local_constant* lconst;
    296     DWORD i = 0, j;
     289    DWORD i, j;
    297290    unsigned int ret;
    298291
    299     if (TRACE_ON(d3d_shader)) {
     292    if (TRACE_ON(d3d_constants))
     293    {
    300294        for(i = 0; i < max_constants; i++) {
    301295            if(!dirty_consts[i]) continue;
     
    305299        }
    306300    }
     301
     302    i = 0;
     303
    307304    /* In 1.X pixel shaders constants are implicitly clamped in the range [-1;1] */
    308305    if (target_type == GL_FRAGMENT_PROGRAM_ARB && This->baseShader.reg_maps.shader_version.major == 1)
     
    546543/**
    547544 * Loads the app-supplied constants into the currently set ARB_[vertex/fragment]_programs.
    548  * 
    549  * We only support float constants in ARB at the moment, so don't 
     545 *
     546 * We only support float constants in ARB at the moment, so don't
    550547 * worry about the Integers or Booleans
    551548 */
     
    632629    unsigned max_constantsF;
    633630    const local_constant *lconst;
     631    DWORD map;
    634632
    635633    /* In pixel shaders, all private constants are program local, we don't need anything
     
    675673    }
    676674
    677     for(i = 0; i < This->baseShader.limits.temporary; i++) {
    678         if (reg_maps->temporary[i])
    679             shader_addline(buffer, "TEMP R%u;\n", i);
    680     }
    681 
    682     for (i = 0; i < This->baseShader.limits.address; i++) {
    683         if (reg_maps->address[i])
    684             shader_addline(buffer, "ADDRESS A%d;\n", i);
    685     }
    686 
    687     if(pshader && reg_maps->shader_version.major == 1 && reg_maps->shader_version.minor <= 3) {
    688         for(i = 0; i < This->baseShader.limits.texcoord; i++) {
    689             if (reg_maps->texcoord[i] && pshader)
    690                 shader_addline(buffer,"TEMP T%u;\n", i);
     675    for (i = 0, map = reg_maps->temporary; map; map >>= 1, ++i)
     676    {
     677        if (map & 1) shader_addline(buffer, "TEMP R%u;\n", i);
     678    }
     679
     680    for (i = 0, map = reg_maps->address; map; map >>= 1, ++i)
     681    {
     682        if (map & 1) shader_addline(buffer, "ADDRESS A%u;\n", i);
     683    }
     684
     685    if (pshader && reg_maps->shader_version.major == 1 && reg_maps->shader_version.minor <= 3)
     686    {
     687        for (i = 0, map = reg_maps->texcoord; map; map >>= 1, ++i)
     688        {
     689            if (map & 1) shader_addline(buffer, "TEMP T%u;\n", i);
    691690        }
    692691    }
     
    12621261    if (flags & TEX_DERIV)
    12631262    {
    1264         if(flags & TEX_PROJ) FIXME("Projected texture sampling with custom derivates\n");
    1265         if(flags & TEX_BIAS) FIXME("Biased texture sampling with custom derivates\n");
     1263        if(flags & TEX_PROJ) FIXME("Projected texture sampling with custom derivatives\n");
     1264        if(flags & TEX_BIAS) FIXME("Biased texture sampling with custom derivatives\n");
    12661265        shader_addline(buffer, "TXD%s %s, %s, %s, %s, texture[%u], %s;\n", mod, dst_str, coord_reg,
    12671266                       dsx, dsy,sampler_idx, tex_type);
     
    20382037    char dst_str[50];
    20392038    char src0_name[50];
    2040     char dst_reg[8];
     2039    char dst_reg[50];
    20412040    BOOL is_color;
    20422041
     
    20812080    char src0_name[50];
    20822081    char src1_name[50];
    2083     char dst_reg[8];
     2082    char dst_reg[50];
    20842083    BOOL is_color;
    20852084
     
    30103009{
    30113010    GLuint program_id = 0;
     3011    GLint pos;
     3012
    30123013    const char *blt_vprogram =
    30133014        "!!ARBvp1.0\n"
     
    30203021    GL_EXTCALL(glGenProgramsARB(1, &program_id));
    30213022    GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, program_id));
    3022     GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(blt_vprogram), blt_vprogram));
    3023 
    3024     if (glGetError() == GL_INVALID_OPERATION) {
    3025         GLint pos;
    3026         glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     3023    GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
     3024            strlen(blt_vprogram), blt_vprogram));
     3025    checkGLcall("glProgramStringARB()");
     3026
     3027    glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     3028    if (pos != -1)
     3029    {
    30273030        FIXME("Vertex program error at position %d: %s\n", pos,
    30283031            debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
    30293032    }
     3033    else
     3034    {
     3035        GLint native;
     3036
     3037        GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native));
     3038        checkGLcall("glGetProgramivARB()");
     3039        if (!native) WARN("Program exceeds native resource limits.\n");
     3040    }
    30303041
    30313042    return program_id;
     
    30363047{
    30373048    GLuint program_id = 0;
     3049    GLint pos;
     3050
    30383051    static const char * const blt_fprograms[tex_type_count] =
    30393052    {
     
    30703083    GL_EXTCALL(glGenProgramsARB(1, &program_id));
    30713084    GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, program_id));
    3072     GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(blt_fprograms[tex_type]), blt_fprograms[tex_type]));
    3073 
    3074     if (glGetError() == GL_INVALID_OPERATION) {
    3075         GLint pos;
    3076         glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     3085    GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
     3086            strlen(blt_fprograms[tex_type]), blt_fprograms[tex_type]));
     3087    checkGLcall("glProgramStringARB()");
     3088
     3089    glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     3090    if (pos != -1)
     3091    {
    30773092        FIXME("Fragment program error at position %d: %s\n", pos,
    30783093            debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
     3094    }
     3095    else
     3096    {
     3097        GLint native;
     3098
     3099        GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native));
     3100        checkGLcall("glGetProgramivARB()");
     3101        if (!native) WARN("Program exceeds native resource limits.\n");
    30793102    }
    30803103
     
    32293252    BOOL dcl_tmp = args->super.srgb_correction, dcl_td = FALSE;
    32303253    BOOL want_nv_prog = FALSE;
    3231     struct arb_pshader_private *shader_priv = This->backend_priv;
     3254    struct arb_pshader_private *shader_priv = This->baseShader.backend_data;
     3255    GLint errPos;
     3256    DWORD map;
    32323257
    32333258    char srgbtmp[4][4];
    32343259    unsigned int i, found = 0;
    32353260
    3236     for(i = 0; i < This->baseShader.limits.temporary; i++) {
    3237 
    3238         /* Don't overwrite the color source */
    3239         if(This->color0_mov && i == This->color0_reg) continue;
    3240         else if(reg_maps->shader_version.major < 2 && i == 0) continue;
    3241 
    3242         if(reg_maps->temporary[i]) {
    3243             sprintf(srgbtmp[found], "R%u", i);
    3244             found++;
    3245             if(found == 4) break;
    3246         }
     3261    for (i = 0, map = reg_maps->temporary; map; map >>= 1, ++i)
     3262    {
     3263        if (!(map & 1)
     3264                || (This->color0_mov && i == This->color0_reg)
     3265                || (reg_maps->shader_version.major < 2 && i == 0))
     3266            continue;
     3267
     3268        sprintf(srgbtmp[found], "R%u", i);
     3269        ++found;
     3270        if (found == 4) break;
    32473271    }
    32483272
     
    33753399            lconst_map, NULL, &priv_ctx);
    33763400
    3377     for(i = 0; i < (sizeof(reg_maps->bumpmat) / sizeof(reg_maps->bumpmat[0])); i++) {
    3378         if(!reg_maps->bumpmat[i]) continue;
     3401    for (i = 0, map = reg_maps->bumpmat; map; map >>= 1, ++i)
     3402    {
     3403        if (!(map & 1)) continue;
    33793404
    33803405        cur = compiled->numbumpenvmatconsts;
     
    33983423        compiled->numbumpenvmatconsts = cur + 1;
    33993424
    3400         if(!reg_maps->luminanceparams[i]) continue;
     3425        if (!(reg_maps->luminanceparams & (1 << i))) continue;
    34013426
    34023427        compiled->luminanceconst[cur].const_num = next_local++;
     
    34863511    }
    34873512
    3488     if(shader_priv->clipplane_emulation)
    3489     {
    3490         shader_addline(buffer, "KIL fragment.texcoord[%u];\n", shader_priv->clipplane_emulation - 1);
     3513    if (shader_priv->clipplane_emulation != ~0U && args->clip)
     3514    {
     3515        shader_addline(buffer, "KIL fragment.texcoord[%u];\n", shader_priv->clipplane_emulation);
    34913516    }
    34923517
     
    35123537    GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
    35133538               buffer->bsize, buffer->buffer));
    3514 
    3515     if (glGetError() == GL_INVALID_OPERATION) {
    3516         GLint errPos;
    3517         glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
     3539    checkGLcall("glProgramStringARB()");
     3540
     3541    glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
     3542    if (errPos != -1)
     3543    {
    35183544        FIXME("HW PixelShader Error at position %d: %s\n",
    35193545              errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
    35203546        retval = 0;
     3547    }
     3548    else
     3549    {
     3550        GLint native;
     3551
     3552        GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native));
     3553        checkGLcall("glGetProgramivARB()");
     3554        if (!native) WARN("Program exceeds native resource limits.\n");
    35213555    }
    35223556
     
    37963830    struct shader_arb_ctx_priv priv_ctx;
    37973831    unsigned int i;
     3832    GLint errPos;
    37983833
    37993834    memset(&priv_ctx, 0, sizeof(priv_ctx));
     
    39053940    GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
    39063941               buffer->bsize, buffer->buffer));
    3907 
    3908     if (glGetError() == GL_INVALID_OPERATION) {
    3909         GLint errPos;
    3910         glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
     3942    checkGLcall("glProgramStringARB()");
     3943
     3944    glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
     3945    if (errPos != -1)
     3946    {
    39113947        FIXME("HW VertexShader Error at position %d: %s\n",
    39123948              errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
    39133949        ret = -1;
    3914     } else {
     3950    }
     3951    else
     3952    {
     3953        GLint native;
     3954
     3955        GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native));
     3956        checkGLcall("glGetProgramivARB()");
     3957        if (!native) WARN("Program exceeds native resource limits.\n");
     3958
    39153959        /* Load immediate constants */
    39163960        if(lconst_map) {
     
    39243968
    39253969    return ret;
    3926 }
    3927 
    3928 static void find_clip_texcoord(IWineD3DPixelShaderImpl *ps)
    3929 {
    3930     struct arb_pshader_private *shader_priv = ps->backend_priv;
    3931     int i;
    3932     const struct wined3d_gl_info *gl_info = &((IWineD3DDeviceImpl *)ps->baseShader.device)->adapter->gl_info;
    3933 
    3934     /* See if we can use fragment.texcoord[7] for clipplane emulation
    3935      *
    3936      * Don't do this if it is not supported, or fragment.texcoord[7] is used
    3937      */
    3938     if(ps->baseShader.reg_maps.shader_version.major < 3)
    3939     {
    3940         for(i = GL_LIMITS(texture_stages); i > 0; i--)
    3941         {
    3942             if(!ps->baseShader.reg_maps.texcoord[i - 1])
    3943             {
    3944                 shader_priv->clipplane_emulation = i;
    3945                 return;
    3946             }
    3947         }
    3948         WARN("Did not find a free clip reg(2.0)\n");
    3949     }
    3950     else
    3951     {
    3952         for(i = GL_LIMITS(texture_stages); i > 0; i--)
    3953         {
    3954             if(!(ps->baseShader.reg_maps.input_registers & (1 << (i - 1))))
    3955             {
    3956                 shader_priv->clipplane_emulation = i;
    3957                 return;
    3958             }
    3959         }
    3960         WARN("Did not find a free clip reg(3.0)\n");
    3961     }
    39623970}
    39633971
     
    39723980    GLuint ret;
    39733981
    3974     if(!shader->backend_priv) {
     3982    if (!shader->baseShader.backend_data)
     3983    {
    39753984        IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) shader->baseShader.device;
     3985        const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
    39763986        struct shader_arb_priv *priv = device->shader_priv;
    39773987
    3978         shader->backend_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data));
    3979         shader_data = shader->backend_priv;
     3988        shader->baseShader.backend_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data));
     3989        shader_data = shader->baseShader.backend_data;
    39803990        shader_data->clamp_consts = shader->baseShader.reg_maps.shader_version.major == 1;
    39813991
     
    39863996        TRACE("Shader got assigned input signature index %u\n", shader_data->input_signature_idx);
    39873997
    3988         if(!device->vs_clipping) find_clip_texcoord(shader);
    3989     }
    3990     shader_data = shader->backend_priv;
     3998        if (!device->vs_clipping)
     3999            shader_data->clipplane_emulation = shader_find_free_input_register(&shader->baseShader.reg_maps,
     4000                    GL_LIMITS(texture_stages) - 1);
     4001        else
     4002            shader_data->clipplane_emulation = ~0U;
     4003    }
     4004    shader_data = shader->baseShader.backend_data;
    39914005
    39924006    /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2),
     
    40624076    const struct wined3d_gl_info *gl_info = &((IWineD3DDeviceImpl *)shader->baseShader.device)->adapter->gl_info;
    40634077
    4064     if(!shader->backend_priv) {
    4065         shader->backend_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data));
    4066     }
    4067     shader_data = shader->backend_priv;
     4078    if (!shader->baseShader.backend_data)
     4079    {
     4080        shader->baseShader.backend_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data));
     4081    }
     4082    shader_data = shader->baseShader.backend_data;
    40684083
    40694084    /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2),
     
    41304145    }
    41314146
     4147    /* Only enable the clip plane emulation KIL if at least one clipplane is enabled. The KIL instruction
     4148     * is quite expensive because it forces the driver to disable early Z discards. It is cheaper to
     4149     * duplicate the shader than have a no-op KIL instruction in every shader
     4150     */
     4151    if((!((IWineD3DDeviceImpl *) shader->baseShader.device)->vs_clipping) && use_vs(stateblock) &&
     4152       stateblock->renderState[WINED3DRS_CLIPPING] && stateblock->renderState[WINED3DRS_CLIPPLANEENABLE])
     4153    {
     4154        args->clip = 1;
     4155    }
     4156    else
     4157    {
     4158        args->clip = 0;
     4159    }
     4160
    41324161    /* Skip if unused or local, or supported natively */
    41334162    int_skip = ~shader->baseShader.reg_maps.integer_constants | shader->baseShader.reg_maps.local_int_consts;
     
    41684197    {
    41694198        IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) stateblock->pixelShader;
    4170         struct arb_pshader_private *shader_priv = ps->backend_priv;
     4199        struct arb_pshader_private *shader_priv = ps->baseShader.backend_data;
    41714200        args->ps_signature = shader_priv->input_signature_idx;
    41724201
    4173         args->boolclip.clip_control[0] = shader_priv->clipplane_emulation;
     4202        args->boolclip.clip_control[0] = shader_priv->clipplane_emulation + 1;
    41744203    }
    41754204    else
     
    42644293         * a 1.x and newer shader, reload the first 8 constants
    42654294         */
    4266         if(priv->last_ps_const_clamped != ((struct arb_pshader_private *) ps->backend_priv)->clamp_consts)
    4267         {
    4268             priv->last_ps_const_clamped = ((struct arb_pshader_private *) ps->backend_priv)->clamp_consts;
     4295        if(priv->last_ps_const_clamped != ((struct arb_pshader_private *)ps->baseShader.backend_data)->clamp_consts)
     4296        {
     4297            priv->last_ps_const_clamped = ((struct arb_pshader_private *)ps->baseShader.backend_data)->clamp_consts;
    42694298            This->highest_dirty_ps_const = max(This->highest_dirty_ps_const, 8);
    42704299            for(i = 0; i < 8; i++)
     
    43824411    {
    43834412        IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *) iface;
    4384         struct arb_pshader_private *shader_data = This->backend_priv;
     4413        struct arb_pshader_private *shader_data = This->baseShader.backend_data;
    43854414        UINT i;
    43864415
     
    43974426        HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
    43984427        HeapFree(GetProcessHeap(), 0, shader_data);
    4399         This->backend_priv = NULL;
     4428        This->baseShader.backend_data = NULL;
    44004429    } else {
    44014430        IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *) iface;
    4402         struct arb_vshader_private *shader_data = This->backend_priv;
     4431        struct arb_vshader_private *shader_data = This->baseShader.backend_data;
    44034432        UINT i;
    44044433
     
    44154444        HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
    44164445        HeapFree(GetProcessHeap(), 0, shader_data);
    4417         This->backend_priv = NULL;
     4446        This->baseShader.backend_data = NULL;
    44184447    }
    44194448}
     
    44254454}
    44264455
    4427 struct wine_rb_functions sig_tree_functions =
     4456static const struct wine_rb_functions sig_tree_functions =
    44284457{
    44294458    wined3d_rb_alloc,
     
    46964725
    46974726static void get_loop_control_const(const struct wined3d_shader_instruction *ins,
    4698         IWineD3DBaseShaderImpl *This, UINT idx, struct loop_control *loop_control)
     4727        IWineD3DBaseShaderImpl *This, UINT idx, struct wined3d_shader_loop_control *loop_control)
    46994728{
    47004729    struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
     
    52395268    if (use_ps(stateblock))
    52405269    {
    5241         if(stage != 0 &&
    5242            ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.reg_maps.bumpmat[stage]) {
     5270        if (stage != 0
     5271                && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.bumpmat & (1 << stage)))
     5272        {
    52435273            /* The pixel shader has to know the bump env matrix. Do a constants update if it isn't scheduled
    52445274             * anyway
     
    52755305    if (use_ps(stateblock))
    52765306    {
    5277         if(stage != 0 &&
    5278            ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.reg_maps.luminanceparams[stage]) {
     5307        if (stage != 0
     5308                && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.luminanceparams & (1 << stage)))
     5309        {
    52795310            /* The pixel shader has to know the luminance offset. Do a constants update if it
    52805311             * isn't scheduled anyway
     
    55305561    BOOL op_equal;
    55315562    const char *final_combiner_src = "ret";
     5563    GLint pos;
    55325564
    55335565    /* Find out which textures are read */
     
    57635795    GL_EXTCALL(glGenProgramsARB(1, &ret));
    57645796    GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, ret));
    5765     GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(buffer.buffer), buffer.buffer));
    5766 
    5767     if (glGetError() == GL_INVALID_OPERATION) {
    5768         GLint pos;
    5769         glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     5797    GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
     5798            strlen(buffer.buffer), buffer.buffer));
     5799    checkGLcall("glProgramStringARB()");
     5800
     5801    glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     5802    if (pos != -1)
     5803    {
    57705804        FIXME("Fragment program error at position %d: %s\n", pos,
    57715805              debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
    57725806    }
     5807    else
     5808    {
     5809        GLint native;
     5810
     5811        GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native));
     5812        checkGLcall("glGetProgramivARB()");
     5813        if (!native) WARN("Program exceeds native resource limits.\n");
     5814    }
     5815
    57735816    shader_buffer_free(&buffer);
    57745817    return ret;
     
    63496392    char luminance_component;
    63506393    struct arbfp_blit_priv *priv = device->blit_priv;
     6394    GLint pos;
    63516395
    63526396    /* Shader header */
     
    64516495
    64526496    ENTER_GL();
    6453     GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(buffer.buffer), buffer.buffer));
    6454 
    6455     if (glGetError() == GL_INVALID_OPERATION) {
    6456         GLint pos;
    6457         glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     6497    GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
     6498            strlen(buffer.buffer), buffer.buffer));
     6499    checkGLcall("glProgramStringARB()");
     6500
     6501    glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
     6502    if (pos != -1)
     6503    {
    64586504        FIXME("Fragment program error at position %d: %s\n", pos,
    64596505              debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
    64606506    }
     6507    else
     6508    {
     6509        GLint native;
     6510
     6511        GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native));
     6512        checkGLcall("glGetProgramivARB()");
     6513        if (!native) WARN("Program exceeds native resource limits.\n");
     6514    }
     6515
    64616516    shader_buffer_free(&buffer);
    64626517    LEAVE_GL();
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette