diff --git a/src/gpu/shader.cpp b/src/gpu/shader.cpp index 9b7addf1..9651fc2c 100644 --- a/src/gpu/shader.cpp +++ b/src/gpu/shader.cpp @@ -428,6 +428,22 @@ void Shader::Bind() const #endif } +void Shader::Unbind() const +{ +#if defined USE_D3D9 || defined _XBOX + HRESULT hr; + hr = g_d3ddevice->SetVertexShader(NULL); + hr = g_d3ddevice->SetPixelShader(NULL); +#elif !defined __CELLOS_LV2__ + /* FIXME: untested */ + glUseProgram(0); +#else + /* FIXME: untested */ + cgGLDisableProfile(cgGLGetLatestProfile(CG_GL_VERTEX)); + cgGLDisableProfile(cgGLGetLatestProfile(CG_GL_FRAGMENT)); +#endif +} + Shader::~Shader() { #if defined USE_D3D9 || defined _XBOX diff --git a/src/gpu/shader.h b/src/gpu/shader.h index f2b5ffa6..a682487a 100644 --- a/src/gpu/shader.h +++ b/src/gpu/shader.h @@ -69,6 +69,7 @@ public: void SetUniform(ShaderUniform const &uni, mat4 const &m); void Bind() const; + void Unbind() const; protected: Shader(char const *vert, char const *frag); diff --git a/src/gpu/vertexbuffer.cpp b/src/gpu/vertexbuffer.cpp index d1df4c39..3f1841a5 100644 --- a/src/gpu/vertexbuffer.cpp +++ b/src/gpu/vertexbuffer.cpp @@ -145,7 +145,16 @@ void VertexDeclaration::DrawElements(MeshPrimitive type, int skip, int count) void VertexDeclaration::Unbind() { #if defined _XBOX || defined USE_D3D9 - /* FIXME: Nothing to do? */ + int stream = -1; + for (int i = 0; i < m_count; i++) + if (m_streams[i].index != stream) + { + stream = m_streams[i].index; + if (FAILED(g_d3ddevice->SetStreamSource(stream, 0, 0, 0))) + Abort(); + } + if (FAILED(g_d3ddevice->SetVertexDeclaration(NULL))) + Abort(); #else /* FIXME: we need to unbind what we bound */ //glDisableVertexAttribArray(m_attrib); @@ -297,7 +306,11 @@ void VertexDeclaration::Initialize() D3DDECLUSAGE_TANGENT, D3DDECLUSAGE_BINORMAL, D3DDECLUSAGE_TESSFACTOR, +#if defined _XBOX + D3DDECLUSAGE_TEXCOORD, /* FIXME: nonexistent */ +#else D3DDECLUSAGE_POSITIONT, +#endif D3DDECLUSAGE_COLOR, D3DDECLUSAGE_FOG, D3DDECLUSAGE_DEPTH, diff --git a/src/platform/sdl/sdlapp.cpp b/src/platform/sdl/sdlapp.cpp index 31071b00..4624fc80 100644 --- a/src/platform/sdl/sdlapp.cpp +++ b/src/platform/sdl/sdlapp.cpp @@ -102,16 +102,20 @@ void SdlApp::Run() while (!Ticker::Finished()) { #if defined USE_SDL && defined USE_D3D9 - if (FAILED(g_d3ddevice->BeginScene())) + HRESULT hr; + hr = g_d3ddevice->BeginScene(); + if (FAILED(hr)) Abort(); #endif /* Tick the renderer, show the frame and clamp to desired framerate. */ Ticker::TickDraw(); #if defined USE_SDL # if defined USE_D3D9 - if (FAILED(g_d3ddevice->EndScene())) + hr = g_d3ddevice->EndScene(); + if (FAILED(hr)) Abort(); - if (FAILED(g_d3ddevice->Present(NULL, NULL, NULL, NULL))) + hr = g_d3ddevice->Present(NULL, NULL, NULL, NULL); + if (FAILED(hr)) Abort(); # else SDL_GL_SwapBuffers(); diff --git a/src/scene.cpp b/src/scene.cpp index 33f953a7..ba7d12da 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -385,6 +385,8 @@ void Scene::Render() // XXX: rename to Blit() data->tiles = 0; data->ntiles = 0; + stdshader->Unbind(); + #if defined USE_D3D9 || defined _XBOX /* TODO */ #else diff --git a/src/tileset.cpp b/src/tileset.cpp index 110cd0c0..a7c384e0 100644 --- a/src/tileset.cpp +++ b/src/tileset.cpp @@ -142,7 +142,7 @@ void TileSet::TickDraw(float deltams) #if defined USE_D3D9 format = D3DFMT_R8G8B8; #elif defined _XBOX - format = D3DFMT_LIN_R8G8B8; /* FIXME */ + format = D3DFMT_LIN_A8R8G8B8; /* FIXME */ #else format = GL_RGB; #endif @@ -153,6 +153,7 @@ void TileSet::TickDraw(float deltams) #if defined USE_D3D9 format = D3DFMT_A8R8G8B8; #elif defined _XBOX + /* By default the X360 will swizzle the texture. Ask for linear. */ format = D3DFMT_LIN_A8R8G8B8; #else format = GL_RGBA; @@ -177,19 +178,28 @@ void TileSet::TickDraw(float deltams) #if defined USE_D3D9 || defined _XBOX D3DLOCKED_RECT rect; + HRESULT hr; # if defined USE_D3D9 - g_d3ddevice->CreateTexture(w, h, 1, D3DUSAGE_DYNAMIC, format, - D3DPOOL_SYSTEMMEM, &data->m_tex, NULL); - data->m_tex->LockRect(0, &rect, NULL, D3DLOCK_DISCARD | D3DLOCK_NOOVERWRITE); + hr = g_d3ddevice->CreateTexture(w, h, 1, D3DUSAGE_DYNAMIC, format, + D3DPOOL_DEFAULT, &data->m_tex, NULL); # elif defined _XBOX - /* By default the X360 will swizzle the texture. Ask for linear. */ - g_d3ddevice->CreateTexture(w, h, 1, D3DUSAGE_WRITEONLY, format, - D3DPOOL_DEFAULT, &data->m_tex, NULL); - data->m_tex->LockRect(0, &rect, NULL, D3DLOCK_NOOVERWRITE); + hr = g_d3ddevice->CreateTexture(w, h, 1, D3DUSAGE_WRITEONLY, format, + D3DPOOL_DEFAULT, &data->m_tex, NULL); # endif + if (FAILED(hr)) + Abort(); +# if defined USE_D3D9 + hr = data->m_tex->LockRect(0, &rect, NULL, D3DLOCK_DISCARD); +# else + hr = data->m_tex->LockRect(0, &rect, NULL, 0); +# endif + if (FAILED(hr)) + Abort(); for (int j = 0; j < h; j++) memcpy((uint8_t *)rect.pBits + j * rect.Pitch, pixels + w * j * 4, w * 4); - data->m_tex->UnlockRect(0); + hr = data->m_tex->UnlockRect(0); + if (FAILED(hr)) + Abort(); #else glGenTextures(1, &data->m_tex); glEnable(GL_TEXTURE_2D); @@ -229,7 +239,9 @@ void TileSet::Bind() if (!data->img && data->m_tex) { #if defined USE_D3D9 || defined _XBOX - g_d3ddevice->SetTexture(0, data->m_tex); + HRESULT hr = g_d3ddevice->SetTexture(0, data->m_tex); + if (FAILED(hr)) + Abort(); #else glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, data->m_tex); @@ -239,12 +251,17 @@ void TileSet::Bind() void TileSet::Unbind() { + if (!data->img && data->m_tex) + { #if defined USE_D3D9 || defined _XBOX - g_d3ddevice->SetTexture(0, NULL); + HRESULT hr = g_d3ddevice->SetTexture(0, NULL); + if (FAILED(hr)) + Abort(); #else - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, 0); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, 0); #endif + } } void TileSet::BlitTile(uint32_t id, vec3 pos, int o, vec2 scale, diff --git a/test/tutorial/tut02.cpp b/test/tutorial/tut02.cpp index 747259de..91d77936 100644 --- a/test/tutorial/tut02.cpp +++ b/test/tutorial/tut02.cpp @@ -178,7 +178,7 @@ public: Abort(); if (FAILED(g_d3ddevice->SetIndices(m_ibo))) Abort(); - if (FAILED(g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 0, 0, sizeof(m_indices) / sizeof(*m_indices)))) + if (FAILED(g_d3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, sizeof(m_indices) / sizeof(*m_indices)))) Abort(); #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ && !defined __APPLE__ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);