Add glViewport to cached gl state. Add a couple of missing VFPU ops.

This commit is contained in:
Henrik Rydgard 2013-01-06 23:23:36 +01:00
parent 7a7c92edeb
commit 9363a867e2
9 changed files with 34 additions and 14 deletions

View File

@ -475,8 +475,8 @@ namespace MIPSInt
case 21: d[i] = logf(s[i])/log(2.0f); break;
case 22: d[i] = sqrtf(s[i]); break; //vsqrt
case 23: d[i] = asinf(s[i] * (float)M_2_PI); break; //vasin
// case 24: vnrcp
// case 26: vnsin
case 24: d[i] = -1.0f / s[i]; break; // vnrcp
case 26: d[i] = -sinf((float)M_PI_2 * s[i]); break; // vnsin
case 28: d[i] = 1.0f / expf(s[i] * (float)M_LOG2E); break; // vrexp2
default:
_dbg_assert_msg_(CPU,0,"Trying to interpret VV2Op instruction that can't be interpreted");

View File

@ -36,7 +36,7 @@ static int atlasHeight;
struct PPGeVertex {
u16 u, v;
u32 color;
s16 x, y; u16 z;
float x, y, z;
};
static u32 savedContextPtr;
@ -209,7 +209,7 @@ void PPGeBegin()
WriteCmd(GE_CMD_MAXZ, 0xFFFF);
// Through mode, so we don't have to bother with matrices
WriteCmd(GE_CMD_VERTEXTYPE, GE_VTYPE_TC_16BIT | GE_VTYPE_COL_8888 | GE_VTYPE_POS_16BIT | GE_VTYPE_THROUGH);
WriteCmd(GE_CMD_VERTEXTYPE, GE_VTYPE_TC_16BIT | GE_VTYPE_COL_8888 | GE_VTYPE_POS_FLOAT | GE_VTYPE_THROUGH);
}
void PPGeEnd()
@ -340,6 +340,21 @@ void PPGeDraw4Patch(int atlasImage, float x, float y, float w, float h, u32 colo
EndVertexDataAndDraw(GE_PRIM_RECTANGLES);
}
void PPGeDrawRect(float x1, float y1, float x2, float y2, u32 color)
{
if (!dlPtr)
return;
WriteCmd(GE_CMD_TEXTUREMAPENABLE, 0);
BeginVertexData();
Vertex(x1, y1, 0, 0, 0, 0, color);
Vertex(x2, y2, 0, 0, 0, 0, color);
EndVertexDataAndDraw(GE_PRIM_RECTANGLES);
WriteCmd(GE_CMD_TEXTUREMAPENABLE, 1);
}
// Just blits an image to the screen, multiplied with the color.
void PPGeDrawImage(int atlasImage, float x, float y, int align, u32 color)
{

View File

@ -74,6 +74,8 @@ void PPGeDrawImage(int atlasImage, float x, float y, int align, u32 color = 0xFF
void PPGeDrawImage(int atlasImage, float x, float y, float w, float h, int align, u32 color = 0xFFFFFFFF);
void PPGeDrawImage(float x, float y, float w, float h, float u1, float v1, float u2, float v2, int tw, int th, u32 color);
void PPGeDrawRect(float x1, float y1, float x2, float y2, u32 color);
void PPGeSetDefaultTexture();
void PPGeSetTexture(u32 dataAddr, int width, int height);
void PPGeDisableTexture();

View File

@ -191,7 +191,7 @@ void GLES_GPU::InitClear() {
// glClearColor(1,0,1,1);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
}
glViewport(0, 0, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight);
glstate.viewport.set(0, 0, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight);
}
void GLES_GPU::DumpNextFrame() {
@ -247,7 +247,7 @@ void GLES_GPU::CopyDisplayToOutput() {
VirtualFramebuffer *vfb = GetDisplayFBO();
fbo_unbind();
glViewport(0, 0, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight);
glstate.viewport.set(0, 0, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight);
currentRenderVfb_ = 0;
@ -347,7 +347,7 @@ void GLES_GPU::SetRenderFrameBuffer() {
vfb->fbo = fbo_create(vfb->width * renderWidthFactor_, vfb->height * renderHeightFactor_, 1, true);
vfbs_.push_back(vfb);
fbo_bind_as_render_target(vfb->fbo);
glViewport(0, 0, renderWidth_, renderHeight_);
glstate.viewport.set(0, 0, renderWidth_, renderHeight_);
currentRenderVfb_ = vfb;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
INFO_LOG(HLE, "Creating FBO for %08x : %i x %i", vfb->fb_address, vfb->width, vfb->height);
@ -360,7 +360,7 @@ void GLES_GPU::SetRenderFrameBuffer() {
DEBUG_LOG(HLE, "Switching render target to FBO for %08x", vfb->fb_address);
gstate_c.textureChanged = true;
fbo_bind_as_render_target(vfb->fbo);
glViewport(0, 0, renderWidth_, renderHeight_);
glstate.viewport.set(0, 0, renderWidth_, renderHeight_);
currentRenderVfb_ = vfb;
}
}

View File

@ -181,7 +181,7 @@ void UpdateViewportAndProjection() {
if (throughmode) {
// No viewport transform here. Let's experiment with using region.
glViewport((0 + regionX1) * renderWidthFactor, (0 - regionY1) * renderHeightFactor, (regionX2 - regionX1) * renderWidthFactor, (regionY2 - regionY1) * renderHeightFactor);
glstate.viewport.set((0 + regionX1) * renderWidthFactor, (0 - regionY1) * renderHeightFactor, (regionX2 - regionX1) * renderWidthFactor, (regionY2 - regionY1) * renderHeightFactor);
} else {
// These we can turn into a glViewport call, offset by offsetX and offsetY. Math after.
float vpXa = getFloat24(gstate.viewportx1);
@ -216,7 +216,7 @@ void UpdateViewportAndProjection() {
// Flip vpY0 to match the OpenGL coordinate system.
vpY0 = renderHeight - (vpY0 + vpHeight);
glViewport(vpX0, vpY0, vpWidth, vpHeight);
glstate.viewport.set(vpX0, vpY0, vpWidth, vpHeight);
// Sadly, as glViewport takes integers, we will not be able to support sub pixel offsets this way. But meh.
// shaderManager_->DirtyUniform(DIRTY_PROJMATRIX);
}

View File

@ -46,7 +46,8 @@ void GL_Resized() // Resize And Initialize The GL Window
{
yres=1; // Making Height Equal One
}
glViewport(0,0,xres,yres); // Reset The Current Viewport
glstate.viewport.set(0, 0, xres, yres);
glstate.viewport.restore();
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
glOrtho(0.0f,xres,yres,0.0f,-1.0f,1.0f); // Create Ortho 640x480 View (0,0 At Top Left)

View File

@ -176,7 +176,8 @@ void EmuScreen::render()
uiTexture->Bind(0);
glViewport(0, 0, pixel_xres, pixel_yres);
glstate.viewport.set(0, 0, pixel_xres, pixel_yres);
glstate.viewport.restore();
ui_draw2d.Begin(DBMODE_NORMAL);

View File

@ -154,7 +154,8 @@ bool WindowsHeadlessHost::ResizeGL()
RECT rc;
GetWindowRect(hWnd, &rc);
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
glstate.viewport.set(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
glstate.viewport.restore();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, WINDOW_WIDTH, WINDOW_HEIGHT, 0.0f, -1.0f, 1.0f);

2
native

@ -1 +1 @@
Subproject commit dbda5f8037e3da7fda5e5ec4cb59a8047c319e38
Subproject commit 8f7fa5e4e2738a1da83b2f52540b359c801ea3c0