Ticket #9087: flicker.patch

File flicker.patch, 8.6 KB (added by bluddy, 15 years ago)

Flicker problem patch

  • osys_psp.cpp

     
    409409        sceGuColor(0xFFFFFFFF);
    410410
    411411        struct Vertex* vertices = (struct Vertex*)sceGuGetMemory(2 * sizeof(struct Vertex));
    412         vertices[0].u = 0.5; vertices[0].v = 0.5;
    413         vertices[1].u = _screenWidth - 0.5; vertices[1].v = _screenHeight - 0.5;
     412        vertices[0].u = 0.5f; vertices[0].v = 0.5f;
     413        vertices[1].u = _screenWidth - 0.5f; vertices[1].v = _screenHeight - 0.5f;
    414414        switch(_graphicMode) {
    415415                case CENTERED_320X200:
    416416                        vertices[0].x = (PSP_SCREEN_WIDTH - 320) / 2; vertices[0].y = (PSP_SCREEN_HEIGHT - 200) / 2; vertices[0].z = 0;
     
    437437
    438438        sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
    439439        if (_screenWidth == 640) {
     440                // 2nd draw
     441                struct Vertex* vertices2 = (struct Vertex*)sceGuGetMemory(2 * sizeof(struct Vertex));
    440442                sceGuTexImage(0, 512, 512, _screenWidth, _offscreen+512);
    441                 vertices[0].u = 512 + 0.5; vertices[1].v = _screenHeight - 0.5;
    442                 vertices[0].x += (vertices[1].x - vertices[0].x) * 511 / 640; vertices[0].y = 0; vertices[0].z = 0;
    443                 sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
     443                vertices2[0].u = 512 + 0.5f;
     444                vertices2[0].v = vertices[0].v;
     445                vertices2[1].u = vertices[1].u;
     446                vertices2[1].v = _screenHeight - 0.5f;
     447                vertices2[0].x = vertices[0].x + (vertices[1].x - vertices[0].x) * 511 / 640;
     448                vertices2[0].y = 0;
     449                vertices2[0].z = 0;
     450                vertices2[1].x = vertices[1].x;
     451                vertices2[1].y = vertices[1].y;
     452                vertices2[1].z = 0;
     453                sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices2);
    444454        }
    445455
    446456
    447457        // draw overlay
    448458        if (_overlayVisible) {
    449                 vertices[0].x = 0; vertices[0].y = 0; vertices[0].z = 0;
    450                 vertices[1].x = PSP_SCREEN_WIDTH; vertices[1].y = PSP_SCREEN_HEIGHT; vertices[1].z = 0;
    451                 vertices[0].u = 0.5; vertices[0].v = 0.5;
    452                 vertices[1].u = _overlayWidth - 0.5; vertices[1].v = _overlayHeight - 0.5;
     459                struct Vertex* vertOverlay = (struct Vertex*)sceGuGetMemory(2 * sizeof(struct Vertex));
     460                vertOverlay[0].x = 0;
     461                vertOverlay[0].y = 0;
     462                vertOverlay[0].z = 0;
     463                vertOverlay[1].x = PSP_SCREEN_WIDTH;
     464                vertOverlay[1].y = PSP_SCREEN_HEIGHT;
     465                vertOverlay[1].z = 0;
     466                vertOverlay[0].u = 0.5f;
     467                vertOverlay[0].v = 0.5f;
     468                vertOverlay[1].u = _overlayWidth - 0.5f;
     469                vertOverlay[1].v = _overlayHeight - 0.5f;
    453470                sceGuTexMode(GU_PSM_4444, 0, 0, 0); // 16-bit image
    454471                sceGuDisable(GU_ALPHA_TEST);
    455472                sceGuEnable(GU_BLEND);
     
    463480                        sceGuTexImage(0, 512, 256, _overlayWidth, _overlayBuffer);
    464481
    465482                sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
    466                 sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertices);
     483                sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertOverlay);
    467484                // need to render twice for textures > 512
    468485                if ( _overlayWidth > 512) {
     486                        struct Vertex* vertOverlay2 = (struct Vertex*)sceGuGetMemory(2 * sizeof(struct Vertex));
    469487                        sceGuTexImage(0, 512, 512, _overlayWidth, _overlayBuffer + 512);
    470                         vertices[0].u = 512 + 0.5; vertices[1].v = _overlayHeight - 0.5;
    471                         vertices[0].x = PSP_SCREEN_WIDTH * 512 / 640; vertices[0].y = 0; vertices[0].z = 0;
    472                         sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
     488                        vertOverlay2[0].u = 512 + 0.5f;
     489                        vertOverlay2[0].v = vertOverlay[0].v;
     490                        vertOverlay2[1].u = vertOverlay[1].u;
     491                        vertOverlay2[1].v = _overlayHeight - 0.5f;
     492                        vertOverlay2[0].x = PSP_SCREEN_WIDTH * 512 / 640;
     493                        vertOverlay2[0].y = 0;
     494                        vertOverlay2[0].z = 0;
     495                        vertOverlay2[1].x = PSP_SCREEN_WIDTH;
     496                        vertOverlay2[1].y = PSP_SCREEN_HEIGHT;
     497                        vertOverlay2[1].z = 0;                 
     498                        sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertOverlay2);
    473499                }
    474500                sceGuDisable(GU_BLEND);
    475501        }
     
    484510                sceGuTexImage(0, MOUSE_SIZE, MOUSE_SIZE, MOUSE_SIZE, _mouseBuf);
    485511                sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
    486512
    487                 vertices[0].u = 0.5; vertices[0].v = 0.5;
    488                 vertices[1].u = _mouseWidth - 0.5; vertices[1].v = _mouseHeight - 0.5;
     513                struct Vertex* vertMouse = (struct Vertex*)sceGuGetMemory(2 * sizeof(struct Vertex));
     514                vertMouse[0].u = 0.5f; vertMouse[0].v = 0.5f;
     515                vertMouse[1].u = _mouseWidth - 0.5f; vertMouse[1].v = _mouseHeight - 0.5f;
    489516
    490517                //adjust cursor position
    491518                int mX = _mouseX - _mouseHotspotX;
     
    497524                        scalex = (float)PSP_SCREEN_WIDTH /_overlayWidth;
    498525                        scaley = (float)PSP_SCREEN_HEIGHT /_overlayHeight;
    499526
    500                         vertices[0].x = mX * scalex; vertices[0].y = mY * scaley; vertices[0].z = 0;
    501                         vertices[1].x = vertices[0].x + _mouseWidth * scalex; vertices[1].y = vertices[0].y + _mouseHeight * scaley; vertices[0].z = 0;
     527                        vertMouse[0].x = mX * scalex; vertMouse[0].y = mY * scaley; vertMouse[0].z = 0;
     528                        vertMouse[1].x = vertMouse[0].x + _mouseWidth * scalex; vertMouse[1].y = vertMouse[0].y + _mouseHeight * scaley; vertMouse[0].z = 0;
    502529                } else
    503530                        switch(_graphicMode) {
    504531                        case CENTERED_320X200:
    505                                 vertices[0].x = (PSP_SCREEN_WIDTH - 320) / 2 + mX; vertices[0].y = (PSP_SCREEN_HEIGHT - 200) / 2 + mY; vertices[0].z = 0;
    506                                 vertices[1].x = vertices[0].x+_mouseWidth; vertices[1].y = vertices[0].y + _mouseHeight; vertices[1].z = 0;
     532                                vertMouse[0].x = (PSP_SCREEN_WIDTH - 320) / 2 + mX; vertMouse[0].y = (PSP_SCREEN_HEIGHT - 200) / 2 + mY; vertMouse[0].z = 0;
     533                                vertMouse[1].x = vertMouse[0].x+_mouseWidth; vertMouse[1].y = vertMouse[0].y + _mouseHeight; vertMouse[1].z = 0;
    507534                        break;
    508535                        case CENTERED_435X272:
    509536                        {
     
    512539                                scalex = 435.0f / _screenWidth;
    513540                                scaley = 272.0f / _screenHeight;
    514541
    515                                 vertices[0].x = (PSP_SCREEN_WIDTH - 435) / 2 + mX * scalex; vertices[0].y = mY * scaley; vertices[0].z = 0;
    516                                 vertices[1].x = vertices[0].x + _mouseWidth * scalex; vertices[1].y = vertices[0].y + _mouseHeight * scaley; vertices[0].z = 0;
     542                                vertMouse[0].x = (PSP_SCREEN_WIDTH - 435) / 2 + mX * scalex; vertMouse[0].y = mY * scaley; vertMouse[0].z = 0;
     543                                vertMouse[1].x = vertMouse[0].x + _mouseWidth * scalex; vertMouse[1].y = vertMouse[0].y + _mouseHeight * scaley; vertMouse[0].z = 0;
    517544
    518545                        }
    519546                        break;
     
    524551                                scalex = 362.0f / _screenWidth;
    525552                                scaley = 272.0f / _screenHeight;
    526553
    527                                 vertices[0].x = (PSP_SCREEN_WIDTH - 362) / 2 + mX * scalex; vertices[0].y = mY * scaley; vertices[0].z = 0;
    528                                 vertices[1].x = vertices[0].x + _mouseWidth * scalex; vertices[1].y = vertices[0].y + _mouseHeight * scaley; vertices[0].z = 0;
     554                                vertMouse[0].x = (PSP_SCREEN_WIDTH - 362) / 2 + mX * scalex; vertMouse[0].y = mY * scaley; vertMouse[0].z = 0;
     555                                vertMouse[1].x = vertMouse[0].x + _mouseWidth * scalex; vertMouse[1].y = vertMouse[0].y + _mouseHeight * scaley; vertMouse[0].z = 0;
    529556                        }
    530557                        break;
    531558                        case STRETCHED_480X272:
     
    535562                                scalex = (float)PSP_SCREEN_WIDTH / _screenWidth;
    536563                                scaley = (float)PSP_SCREEN_HEIGHT / _screenHeight;
    537564
    538                                 vertices[0].x = mX * scalex; vertices[0].y = mY * scaley; vertices[0].z = 0;
    539                                 vertices[1].x = vertices[0].x + _mouseWidth * scalex; vertices[1].y = vertices[0].y + _mouseHeight * scaley; vertices[0].z = 0;
     565                                vertMouse[0].x = mX * scalex; vertMouse[0].y = mY * scaley; vertMouse[0].z = 0;
     566                                vertMouse[1].x = vertMouse[0].x + _mouseWidth * scalex; vertMouse[1].y = vertMouse[0].y + _mouseHeight * scaley; vertMouse[0].z = 0;
    540567                        }
    541568                        break;
    542569                }
    543                 sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
     570                sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertMouse);
    544571        }
    545572
    546573        if (_keyboardVisible) {
     
    566593                }
    567594                sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
    568595
    569                 vertices[0].u = 0.5; vertices[0].v = 0.5;
    570                 vertices[1].u = PSP_SCREEN_WIDTH-0.5; vertices[1].v = PSP_SCREEN_HEIGHT-0.5;
    571                 vertices[0].x = 0; vertices[0].y = 0; vertices[0].z = 0;
    572                 vertices[1].x = PSP_SCREEN_WIDTH; vertices[1].y = PSP_SCREEN_HEIGHT; vertices[0].z = 0;
    573                 sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertices);
     596                struct Vertex* vertKB = (struct Vertex*)sceGuGetMemory(2 * sizeof(struct Vertex));
     597                vertKB[0].u = 0.5f; vertKB[0].v = 0.5f;
     598                vertKB[1].u = PSP_SCREEN_WIDTH-0.5f; vertKB[1].v = PSP_SCREEN_HEIGHT-0.5f;
     599                vertKB[0].x = 0; vertKB[0].y = 0; vertKB[0].z = 0;
     600                vertKB[1].x = PSP_SCREEN_WIDTH; vertKB[1].y = PSP_SCREEN_HEIGHT; vertKB[0].z = 0;
     601                sceGuDrawArray(GU_SPRITES,GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D,2,0,vertKB);
    574602                sceGuDisable(GU_BLEND);
    575603        }
    576         sceKernelDcacheWritebackAll();
     604        //sceKernelDcacheWritebackAll();
    577605
    578606        sceGuFinish();
    579607        sceGuSync(0,0);