Roderick Colenbrander : wined3d: Render target texturing.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 28 07:15:42 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 6d16eff9a6f501c9893c155fd3b2a163256ce43d
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=6d16eff9a6f501c9893c155fd3b2a163256ce43d
Author: Roderick Colenbrander <thunderbird2k at gmx.net>
Date: Fri Jul 28 00:43:38 2006 +0200
wined3d: Render target texturing.
---
dlls/wined3d/surface.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 66 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 5856404..a763537 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -737,7 +737,8 @@ static HRESULT WINAPI IWineD3DSurfaceImp
case RTL_TEXDRAW:
case RTL_TEXTEX:
- ERR("Reading from render target with a texture isn't implemented yet\n");
+ read_from_framebuffer(This, &This->lockedRect, pLockedRect->pBits, pLockedRect->Pitch);
+ FIXME("Reading from render target with a texture isn't implemented yet, falling back to framebuffer reading\n");
break;
case RTL_DISABLE:
@@ -985,6 +986,69 @@ static void flush_to_framebuffer_drawpix
return;
}
+static void flush_to_framebuffer_texture(IWineD3DSurface *iface) {
+ IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
+ float glTexCoord[4];
+
+ glTexCoord[0] = 0.0; /* left */
+ glTexCoord[1] = (float) This->currentDesc.Width / (float) This->pow2Width; /* right */
+ glTexCoord[2] = 0.0; /* top */
+ glTexCoord[3] = (float) This->currentDesc.Height / (float) This->pow2Height; /* bottom */
+
+ IWineD3DSurface_PreLoad(iface);
+
+ ENTER_GL();
+
+ /* Disable some fancy graphics effects */
+ glDisable(GL_LIGHTING);
+ checkGLcall("glDisable GL_LIGHTING");
+ glDisable(GL_DEPTH_TEST);
+ checkGLcall("glDisable GL_DEPTH_TEST");
+ glDisable(GL_FOG);
+ checkGLcall("glDisable GL_FOG");
+ glDisable(GL_CULL_FACE);
+ checkGLcall("glDisable GL_CULL_FACE");
+ glDisable(GL_BLEND);
+ checkGLcall("glDisable GL_BLEND");
+ glDisable(GL_STENCIL_TEST);
+ checkGLcall("glDisable GL_STENCIL_TEST");
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, This->glDescription.textureName);
+ checkGLcall("glEnable glBindTexture");
+
+ /* No filtering for blts */
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ checkGLcall("glTexParameteri");
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ checkGLcall("glTexParameteri");
+
+ /* Start drawing a quad */
+ glBegin(GL_QUADS);
+
+ glColor3d(1.0f, 1.0f, 1.0f);
+ glTexCoord2f(glTexCoord[0], glTexCoord[2]);
+ glVertex3f(0, 0, 0.0);
+
+ glTexCoord2f(glTexCoord[0], glTexCoord[3]);
+ glVertex3f(0, This->currentDesc.Height, 0.0);
+
+ glTexCoord2f(glTexCoord[1], glTexCoord[3]);
+ glVertex3d(This->currentDesc.Width, This->currentDesc.Height, 0.0);
+
+ glTexCoord2f(glTexCoord[1], glTexCoord[2]);
+ glVertex3f(This->currentDesc.Width, 0, 0.0);
+
+ glEnd();
+ checkGLcall("glEnd");
+
+ /* Unbind the texture */
+ glBindTexture(GL_TEXTURE_2D, 0);
+ checkGLcall("glEnable glBindTexture");
+
+ LEAVE_GL();
+}
+
static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
IWineD3DDeviceImpl *myDevice = This->resource.wineD3DDevice;
@@ -1098,7 +1162,7 @@ static HRESULT WINAPI IWineD3DSurfaceImp
case RTL_READTEX:
case RTL_TEXTEX:
- ERR("Writing to the render target with textures is not implemented yet\n");
+ flush_to_framebuffer_texture(iface);
break;
case RTL_DISABLE:
More information about the wine-cvs
mailing list