summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorrodolfoosvaldobogado <rodolfoosvaldobogado@gmail.com>2012-11-12 19:37:08 -0300
committerrodolfoosvaldobogado <rodolfoosvaldobogado@gmail.com>2012-11-12 19:37:08 -0300
commit0809ba79ae12dd55bb5c2d7608fa24ca041c753a (patch)
treec53bebb0d0e16a27ea6042f093d6565a82da1c84 /Source
parent3936c06ee82a45f964d4fef77eb774e6e521114a (diff)
fix for point rendering in dx9 backend, that will teach me to read the full documentation. if someone founs a games that use points a lot i will try to implement a faster path for point rendering.
now the map in twin snakes is functional in all the backends.
Diffstat (limited to 'Source')
-rw-r--r--Source/Plugins/Plugin_VideoDX9/Src/Render.cpp12
-rw-r--r--Source/Plugins/Plugin_VideoDX9/Src/VertexManager.cpp27
2 files changed, 25 insertions, 14 deletions
diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp
index a59adb4793..b4625f0157 100644
--- a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp
+++ b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp
@@ -64,6 +64,7 @@ static int s_fps = 0;
static u32 s_blendMode;
static u32 s_LastAA;
static bool IS_AMD;
+static float m_fMaxPointSize;
static char *st;
@@ -329,6 +330,9 @@ Renderer::Renderer()
D3D::BeginFrame();
D3D::SetRenderState(D3DRS_SCISSORTESTENABLE, true);
D3D::dev->CreateOffscreenPlainSurface(s_backbuffer_width,s_backbuffer_height, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &ScreenShootMEMSurface, NULL );
+ D3D::SetRenderState(D3DRS_POINTSCALEENABLE,false);
+ m_fMaxPointSize = D3D::GetCaps().MaxPointSize;
+
}
Renderer::~Renderer()
@@ -1301,7 +1305,15 @@ void Renderer::SetLineWidth()
// We can't change line width in D3D unless we use ID3DXLine
float fratio = xfregs.viewport.wd != 0 ? Renderer::EFBToScaledXf(1.f) : 1.0f;
float psize = bpmem.lineptwidth.linesize * fratio / 6.0f;
+ //little hack to compensate scalling problems in dx9 must be taken out when scalling is fixed.
+ psize *= 2.0f;
+ if (psize > m_fMaxPointSize)
+ {
+ psize = m_fMaxPointSize;
+ }
D3D::SetRenderState(D3DRS_POINTSIZE, *((DWORD*)&psize));
+ D3D::SetRenderState(D3DRS_POINTSIZE_MIN, *((DWORD*)&psize));
+ D3D::SetRenderState(D3DRS_POINTSIZE_MAX, *((DWORD*)&psize));
}
void Renderer::SetSamplerState(int stage, int texindex)
diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.cpp b/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.cpp
index 88fcca27cf..925617f3f5 100644
--- a/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.cpp
+++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.cpp
@@ -158,7 +158,7 @@ void VertexManager::PrepareDrawBuffers(u32 stride)
int TdataSize = IndexGenerator::GetTriangleindexLen();
int LDataSize = IndexGenerator::GetLineindexLen();
int PDataSize = IndexGenerator::GetPointindexLen();
- int IndexDataSize = TdataSize + LDataSize + PDataSize;
+ int IndexDataSize = TdataSize + LDataSize;
DWORD LockMode = D3DLOCK_NOOVERWRITE;
m_vertex_buffer_cursor--;
m_vertex_buffer_cursor = m_vertex_buffer_cursor - (m_vertex_buffer_cursor % stride) + stride;
@@ -199,10 +199,6 @@ void VertexManager::PrepareDrawBuffers(u32 stride)
memcpy(pIndices, LIBuffer, LDataSize * sizeof(u16));
pIndices += LDataSize;
}
- if(PDataSize)
- {
- memcpy(pIndices, PIBuffer, PDataSize * sizeof(u16));
- }
m_index_buffers[m_current_index_buffer]->Unlock();
if(m_current_stride != stride || m_vertex_buffer_cursor == 0)
{
@@ -256,17 +252,20 @@ void VertexManager::DrawVertexBuffer(int stride)
}
if (points > 0)
{
- if (FAILED(D3D::dev->DrawIndexedPrimitive(
- D3DPT_POINTLIST,
- basevertex,
- 0,
- numverts,
- StartIndex,
- points)))
+ //DrawIndexedPrimitive does not support point list so we have to draw the points one by one
+ for (int i = 0; i < points; i++)
{
- DumpBadShaders();
+ if (FAILED(D3D::dev->DrawPrimitive(
+ D3DPT_POINTLIST,
+ basevertex + PIBuffer[i],
+ 1)))
+ {
+ DumpBadShaders();
+ }
+ INCSTAT(stats.thisFrame.numDrawCalls);
}
- INCSTAT(stats.thisFrame.numIndexedDrawCalls);
+
+
}
}