VirtualBox

Ignore:
Timestamp:
Jul 21, 2009 9:16:52 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
50306
Message:

crOpenGL: update to wine 1.1.26

File:
1 edited

Legend:

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

    r20612 r21731  
    148148}
    149149
    150 static inline BOOL shader_is_version_token(DWORD token) {
    151     return shader_is_pshader_version(token) ||
    152            shader_is_vshader_version(token);
    153 }
    154 
    155 void shader_buffer_init(struct SHADER_BUFFER *buffer)
    156 {
    157     buffer->buffer = HeapAlloc(GetProcessHeap(), 0, SHADER_PGMSIZE);
     150void shader_buffer_clear(struct wined3d_shader_buffer *buffer)
     151{
    158152    buffer->buffer[0] = '\0';
    159153    buffer->bsize = 0;
     
    162156}
    163157
    164 void shader_buffer_free(struct SHADER_BUFFER *buffer)
     158BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer)
     159{
     160    buffer->buffer = HeapAlloc(GetProcessHeap(), 0, SHADER_PGMSIZE);
     161    if (!buffer->buffer)
     162    {
     163        ERR("Failed to allocate shader buffer memory.\n");
     164        return FALSE;
     165    }
     166
     167    shader_buffer_clear(buffer);
     168    return TRUE;
     169}
     170
     171void shader_buffer_free(struct wined3d_shader_buffer *buffer)
    165172{
    166173    HeapFree(GetProcessHeap(), 0, buffer->buffer);
    167174}
    168175
    169 int shader_vaddline(SHADER_BUFFER* buffer, const char *format, va_list args)
     176int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *format, va_list args)
    170177{
    171178    char* base = buffer->buffer + buffer->bsize;
     
    174181    rc = _vsnprintf(base, SHADER_PGMSIZE - 1 - buffer->bsize, format, args);
    175182
    176     if (rc < 0 ||                                   /* C89 */
    177         rc > SHADER_PGMSIZE - 1 - buffer->bsize) {  /* C99 */
    178 
     183    if (rc < 0 /* C89 */ || (unsigned int)rc > SHADER_PGMSIZE - 1 - buffer->bsize /* C99 */)
     184    {
    179185        ERR("The buffer allocated for the shader program string "
    180186            "is too small at %d bytes.\n", SHADER_PGMSIZE);
     
    198204}
    199205
    200 int shader_addline(SHADER_BUFFER* buffer, const char *format, ...)
     206int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ...)
    201207{
    202208    int ret;
     
    256262
    257263static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct shader_reg_maps *reg_maps,
    258         const struct wined3d_shader_register *reg, BOOL pshader)
     264        const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type)
    259265{
    260266    switch (reg->type)
    261267    {
    262268        case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */
    263             if (pshader) reg_maps->texcoord[reg->idx] = 1;
     269            if (shader_type == WINED3D_SHADER_TYPE_PIXEL) reg_maps->texcoord[reg->idx] = 1;
    264270            else reg_maps->address[reg->idx] = 1;
    265271            break;
     
    270276
    271277        case WINED3DSPR_INPUT:
    272             if (!pshader) reg_maps->input_registers |= 1 << reg->idx;
    273             else
     278            if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
    274279            {
    275280                if (reg->rel_addr)
     
    289294                }
    290295            }
     296            else reg_maps->input_registers |= 1 << reg->idx;
    291297            break;
    292298
     
    296302
    297303        case WINED3DSPR_MISCTYPE:
    298             if (pshader && reg->idx == 0) reg_maps->vpos = 1;
     304            if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
     305            {
     306                if (reg->idx == 0) reg_maps->vpos = 1;
     307                else if (reg->idx == 1) reg_maps->usesfacing = 1;
     308            }
    299309            break;
    300310
     
    302312            if (reg->rel_addr)
    303313            {
    304                 if (!pshader)
     314                if (shader_type != WINED3D_SHADER_TYPE_PIXEL)
    305315                {
    306                     if (reg->idx <= ((IWineD3DVertexShaderImpl *)This)->min_rel_offset)
     316                    if (reg->idx < ((IWineD3DVertexShaderImpl *)This)->min_rel_offset)
     317                    {
    307318                        ((IWineD3DVertexShaderImpl *)This)->min_rel_offset = reg->idx;
    308                     else if (reg->idx >= ((IWineD3DVertexShaderImpl *)This)->max_rel_offset)
     319                    }
     320                    if (reg->idx > ((IWineD3DVertexShaderImpl *)This)->max_rel_offset)
     321                    {
    309322                        ((IWineD3DVertexShaderImpl *)This)->max_rel_offset = reg->idx;
     323                    }
    310324                }
    311325                reg_maps->usesrelconstF = TRUE;
     
    323337        case WINED3DSPR_CONSTBOOL:
    324338            reg_maps->boolean_constants |= (1 << reg->idx);
     339            break;
     340
     341        case WINED3DSPR_COLOROUT:
     342            reg_maps->highest_render_target = max(reg_maps->highest_render_target, reg->idx);
    325343            break;
    326344
     
    409427    unsigned int cur_loop_depth = 0, max_loop_depth = 0;
    410428    const DWORD* pToken = byte_code;
    411     char pshader;
    412429
    413430    /* There are some minor differences between pixel and vertex shaders */
     
    424441    fe->shader_read_header(fe_data, &pToken, &shader_version);
    425442    reg_maps->shader_version = shader_version;
    426     pshader = shader_is_pshader_version(shader_version.type);
    427443
    428444    reg_maps->constf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
     
    510526
    511527            /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */
    512             if (shader_version.major == 1 && pshader)
     528            if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
    513529            {
    514530                float *value = (float *) lconst->value;
    515                 if(value[0] < -1.0) value[0] = -1.0;
    516                 else if(value[0] >  1.0) value[0] =  1.0;
    517                 if(value[1] < -1.0) value[1] = -1.0;
    518                 else if(value[1] >  1.0) value[1] =  1.0;
    519                 if(value[2] < -1.0) value[2] = -1.0;
    520                 else if(value[2] >  1.0) value[2] =  1.0;
    521                 if(value[3] < -1.0) value[3] = -1.0;
    522                 else if(value[3] >  1.0) value[3] =  1.0;
     531                if (value[0] < -1.0f) value[0] = -1.0f;
     532                else if (value[0] > 1.0f) value[0] = 1.0f;
     533                if (value[1] < -1.0f) value[1] = -1.0f;
     534                else if (value[1] > 1.0f) value[1] = 1.0f;
     535                if (value[2] < -1.0f) value[2] = -1.0f;
     536                else if (value[2] > 1.0f) value[2] = 1.0f;
     537                if (value[3] < -1.0f) value[3] = -1.0f;
     538                else if (value[3] > 1.0f) value[3] = 1.0f;
    523539            }
    524540
     
    540556
    541557            list_add_head(&This->baseShader.constantsI, &lconst->entry);
     558            reg_maps->local_int_consts |= (1 << dst.reg.idx);
    542559        }
    543560        else if (ins.handler_idx == WINED3DSIH_DEFB)
     
    614631                fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr);
    615632
     633                shader_record_register_usage(This, reg_maps, &dst_param.reg, shader_version.type);
     634
    616635                /* WINED3DSPR_TEXCRDOUT is the same as WINED3DSPR_OUTPUT. _OUTPUT can be > MAX_REG_TEXCRD and
    617636                 * is used in >= 3.0 shaders. Filter 3.0 shaders to prevent overflows, and also filter pixel
    618637                 * shaders because TECRDOUT isn't used in them, but future register types might cause issues */
    619                 if (!pshader && shader_version.major < 3 && dst_param.reg.type == WINED3DSPR_TEXCRDOUT)
     638                if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3
     639                        && dst_param.reg.type == WINED3DSPR_TEXCRDOUT)
    620640                {
    621                     reg_maps->texcoord_mask[dst_param.reg.type] |= dst_param.write_mask;
     641                    reg_maps->texcoord_mask[dst_param.reg.idx] |= dst_param.write_mask;
    622642                }
    623                 else
     643
     644                if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
    624645                {
    625                     if(pshader && dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0)
     646                    IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)This;
     647
     648                    if(dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0)
    626649                    {
    627                         IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) This;
     650                    /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to
     651                     * COLOROUT 0. If we know this in advance, the ARB shader backend can skip
     652                     * the mov and perform the sRGB write correction from the source register.
     653                     *
     654                     * However, if the mov is only partial, we can't do this, and if the write
     655                     * comes from an instruction other than MOV it is hard to do as well. If
     656                     * COLOROUT 0 is overwritten partially later, the marker is dropped again. */
     657
     658                        ps->color0_mov = FALSE;
     659                        if (ins.handler_idx == WINED3DSIH_MOV)
     660                        {
     661                            /* Used later when the source register is read. */
     662                            color0_mov = TRUE;
     663                        }
     664                    }
     665                    /* Also drop the MOV marker if the source register is overwritten prior to the shader
     666                     * end
     667                     */
     668                    else if(dst_param.reg.type == WINED3DSPR_TEMP && dst_param.reg.idx == ps->color0_reg)
     669                    {
    628670                        ps->color0_mov = FALSE;
    629671                    }
    630                     shader_record_register_usage(This, reg_maps, &dst_param.reg, pshader);
    631672                }
    632673
    633674                /* Declare 1.X samplers implicitly, based on the destination reg. number */
    634675                if (shader_version.major == 1
    635                         && pshader /* Filter different instructions with the same enum values in VS */
    636676                        && (ins.handler_idx == WINED3DSIH_TEX
    637677                            || ins.handler_idx == WINED3DSIH_TEXBEM
     
    663703                    }
    664704                }
    665                 else if (pshader && ins.handler_idx == WINED3DSIH_BEM)
     705                else if (ins.handler_idx == WINED3DSIH_BEM)
    666706                {
    667707                    reg_maps->bumpmat[dst_param.reg.idx] = TRUE;
    668708                }
    669                 else if(pshader && ins.handler_idx == WINED3DSIH_MOV)
    670                 {
    671                     /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to
    672                      * COLOROUT 0. If we know this in advance, the ARB shader backend can skip
    673                      * the mov and perform the sRGB write correction from the source register.
    674                      *
    675                      * However, if the mov is only partial, we can't do this, and if the write
    676                      * comes from an instruction other than MOV it is hard to do as well. If
    677                      * COLOROUT 0 is overwritten partially later, the marker is dropped again
    678                      */
    679                     if(dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0)
    680                     {
    681                         /* Used later when the source register is read */
    682                         color0_mov = TRUE;
    683                     }
    684                 }
    685709            }
    686710
     
    701725                reg_maps->usestexldd = 1;
    702726            }
     727            else if(ins.handler_idx == WINED3DSIH_TEXLDL)
     728            {
     729                reg_maps->usestexldl = 1;
     730            }
    703731            else if(ins.handler_idx == WINED3DSIH_MOVA)
    704732            {
    705733                reg_maps->usesmova = 1;
     734            }
     735            else if(ins.handler_idx == WINED3DSIH_IFC)
     736            {
     737                reg_maps->usesifc = 1;
     738            }
     739            else if(ins.handler_idx == WINED3DSIH_CALL)
     740            {
     741                reg_maps->usescall = 1;
    706742            }
    707743
     
    715751                count = get_instr_extra_regcount(ins.handler_idx, i);
    716752
    717                 shader_record_register_usage(This, reg_maps, &src_param.reg, pshader);
     753                shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type);
    718754                while (count)
    719755                {
    720756                    ++src_param.reg.idx;
    721                     shader_record_register_usage(This, reg_maps, &src_param.reg, pshader);
     757                    shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type);
    722758                    --count;
    723759                }
     
    738774    reg_maps->loop_depth = max_loop_depth;
    739775
    740     This->baseShader.functionLength = ((char *)pToken - (char *)byte_code);
     776    This->baseShader.functionLength = ((const char *)pToken - (const char *)byte_code);
    741777
    742778    return WINED3D_OK;
     
    761797    {
    762798        /* Pixel shaders 3.0 don't have usage semantics */
    763         if (shader_is_pshader_version(shader_version->type) && shader_version->major < 3)
     799        if (shader_version->major < 3 && shader_version->type == WINED3D_SHADER_TYPE_PIXEL)
    764800            return;
    765801        else
     
    843879
    844880        case WINED3DSPR_TEXTURE: /* vs: case WINED3DSPR_ADDR */
    845             TRACE("%c", shader_is_pshader_version(shader_version->type) ? 't' : 'a');
     881            TRACE("%c", shader_version->type == WINED3D_SHADER_TYPE_PIXEL ? 't' : 'a');
    846882            break;
    847883
     
    902938            break;
    903939
     940        case WINED3DSPR_CONSTBUFFER:
     941            TRACE("cb");
     942            break;
     943
    904944        default:
    905945            TRACE("unhandled_rtype(%#x)", reg->type);
     
    913953        {
    914954            case WINED3D_IMMCONST_FLOAT:
    915                 TRACE("%.8e", *(float *)reg->immconst_data);
     955                TRACE("%.8e", *(const float *)reg->immconst_data);
    916956                break;
    917957
    918958            case WINED3D_IMMCONST_FLOAT4:
    919959                TRACE("%.8e, %.8e, %.8e, %.8e",
    920                         *(float *)&reg->immconst_data[0], *(float *)&reg->immconst_data[1],
    921                         *(float *)&reg->immconst_data[2], *(float *)&reg->immconst_data[3]);
     960                        *(const float *)&reg->immconst_data[0], *(const float *)&reg->immconst_data[1],
     961                        *(const float *)&reg->immconst_data[2], *(const float *)&reg->immconst_data[3]);
    922962                break;
    923963
     
    930970    else if (reg->type != WINED3DSPR_RASTOUT && reg->type != WINED3DSPR_MISCTYPE)
    931971    {
    932         if (reg->rel_addr)
    933         {
    934             TRACE("[");
    935             shader_dump_src_param(reg->rel_addr, shader_version);
    936             TRACE(" + ");
    937         }
    938         TRACE("%u", offset);
    939         if (reg->rel_addr) TRACE("]");
     972        if (reg->array_idx != ~0U)
     973        {
     974            TRACE("%u[%u", offset, reg->array_idx);
     975            if (reg->rel_addr)
     976            {
     977                TRACE(" + ");
     978                shader_dump_src_param(reg->rel_addr, shader_version);
     979            }
     980            TRACE("]");
     981        }
     982        else
     983        {
     984            if (reg->rel_addr)
     985            {
     986                TRACE("[");
     987                shader_dump_src_param(reg->rel_addr, shader_version);
     988                TRACE(" + ");
     989            }
     990            TRACE("%u", offset);
     991            if (reg->rel_addr) TRACE("]");
     992        }
    940993    }
    941994}
     
    10291082/* Shared code in order to generate the bulk of the shader string.
    10301083 * NOTE: A description of how to parse tokens can be found on msdn */
    1031 void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER *buffer,
     1084void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer,
    10321085        const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx)
    10331086{
     
    10851138                || ins.handler_idx == WINED3DSIH_DEFI
    10861139                || ins.handler_idx == WINED3DSIH_DEFB
    1087                 || ins.handler_idx == WINED3DSIH_PHASE
    1088                 || ins.handler_idx == WINED3DSIH_RET)
     1140                || ins.handler_idx == WINED3DSIH_PHASE)
    10891141        {
    10901142            pToken += param_size;
     
    11381190    struct wined3d_shader_version shader_version;
    11391191    const DWORD* pToken = pFunction;
     1192    const char *type_prefix;
    11401193    DWORD i;
    11411194
     
    11441197    fe->shader_read_header(fe_data, &pToken, &shader_version);
    11451198
    1146     TRACE("%s_%u_%u\n", shader_is_pshader_version(shader_version.type) ? "ps": "vs",
    1147             shader_version.major, shader_version.minor);
     1199    switch (shader_version.type)
     1200    {
     1201        case WINED3D_SHADER_TYPE_VERTEX:
     1202            type_prefix = "vs";
     1203            break;
     1204
     1205        case WINED3D_SHADER_TYPE_GEOMETRY:
     1206            type_prefix = "gs";
     1207            break;
     1208
     1209        case WINED3D_SHADER_TYPE_PIXEL:
     1210            type_prefix = "ps";
     1211            break;
     1212
     1213        default:
     1214            FIXME("Unhandled shader type %#x.\n", shader_version.type);
     1215            type_prefix = "unknown";
     1216            break;
     1217    }
     1218
     1219    TRACE("%s_%u_%u\n", type_prefix, shader_version.major, shader_version.minor);
    11481220
    11491221    while (!fe->shader_is_end(fe_data, &pToken))
     
    13171389
    13181390#define GLINFO_LOCATION      (*gl_info)
    1319 static void shader_none_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *gl_info, struct shader_caps *pCaps)
     1391static void shader_none_get_caps(WINED3DDEVTYPE devtype,
     1392        const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
    13201393{
    13211394    /* Set the shader caps to 0 for the none shader backend */
    13221395    pCaps->VertexShaderVersion  = 0;
    13231396    pCaps->PixelShaderVersion    = 0;
    1324     pCaps->PixelShader1xMaxValue = 0.0;
     1397    pCaps->PixelShader1xMaxValue = 0.0f;
    13251398}
    13261399#undef GLINFO_LOCATION
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