| Index: core/cross/render_surface_test.cc
|
| ===================================================================
|
| --- core/cross/render_surface_test.cc (revision 26267)
|
| +++ core/cross/render_surface_test.cc (working copy)
|
| @@ -36,6 +36,7 @@
|
| #include "core/cross/pack.h"
|
| #include "core/cross/renderer.h"
|
| #include "core/cross/bitmap.h"
|
| +#include "core/cross/features.h"
|
| #include "core/cross/texture.h"
|
| #include "core/cross/render_surface.h"
|
| #include "core/cross/render_surface_set.h"
|
| @@ -43,48 +44,102 @@
|
| #include "core/cross/error_status.h"
|
|
|
| // Defined in testing_common.cc, for each platform.
|
| -extern o3d::DisplayWindow* g_display_window;
|
| +extern o3d::DisplayWindow *g_display_window;
|
|
|
| namespace o3d {
|
|
|
| +// A mock render which pushes commands to the renderer so that
|
| +// actual rendering calls that maintain state can be handled by a
|
| +// variable rather than actually rendering.
|
| +class MockRenderer {
|
| + public:
|
| + // Creates a forwarding render class that pushes functionality to be tested
|
| + // to the desired renderer and handles other functionality on its own.
|
| + explicit MockRenderer(Renderer *renderer) : renderer_(renderer) {}
|
| +
|
| + virtual ~MockRenderer() {}
|
| +
|
| + // Rather than actually rendering, this just sets the state in the renderer.
|
| + void StartRendering() {
|
| + renderer_->set_rendering(true);
|
| + }
|
| +
|
| + // This resets the state in the renderer.
|
| + void FinishRendering() {
|
| + renderer_->set_rendering(false);
|
| + }
|
| +
|
| + // Pushes SetRenderSurfaces to the renderer.
|
| + void SetRenderSurfaces(const RenderSurface *surface,
|
| + const RenderDepthStencilSurface *depth_surface,
|
| + bool is_back_buffer) {
|
| + renderer_->SetRenderSurfaces(surface, depth_surface, is_back_buffer);
|
| + }
|
| +
|
| + // Pushes GetRenderSurfaces to the renderer.
|
| + void GetRenderSurfaces(const RenderSurface **surface,
|
| + const RenderDepthStencilSurface **depth_surface,
|
| + bool *is_back_buffer) {
|
| + renderer_->GetRenderSurfaces(surface, depth_surface, is_back_buffer);
|
| + }
|
| + private:
|
| + Renderer *renderer_;
|
| +};
|
| +
|
| +// Class for testing render surfaces and associated functionality.
|
| class RenderSurfaceTest : public testing::Test {
|
| public:
|
| RenderSurfaceTest()
|
| : object_manager_(g_service_locator),
|
| - error_status_(g_service_locator) {
|
| - }
|
| + error_status_(g_service_locator) {}
|
|
|
| - Renderer* renderer() {
|
| - return g_renderer;
|
| - }
|
| -
|
| protected:
|
| virtual void SetUp() {
|
| + service_locator_ = new ServiceLocator;
|
| + features_ = new Features(service_locator_);
|
| pack_ = object_manager_->CreatePack();
|
| - g_renderer->StartRendering();
|
| + renderer_ = new MockRenderer(g_renderer);
|
| + renderer_->StartRendering();
|
| }
|
|
|
| virtual void TearDown() {
|
| - g_renderer->FinishRendering();
|
| + renderer_->FinishRendering();
|
| pack_->Destroy();
|
| error_status_.ClearLastError();
|
| + delete features_;
|
| + delete service_locator_;
|
| + delete renderer_;
|
| }
|
|
|
| - Pack* pack() { return pack_; }
|
| + ServiceLocator* service_locator() const {
|
| + return service_locator_;
|
| + }
|
|
|
| + MockRenderer* renderer() const {
|
| + return renderer_;
|
| + }
|
| +
|
| + Pack* pack() const {
|
| + return pack_;
|
| + }
|
| +
|
| ServiceDependency<ObjectManager> object_manager_;
|
| ErrorStatus error_status_;
|
| - Pack* pack_;
|
| + ServiceLocator *service_locator_;
|
| + Features *features_;
|
| + Pack *pack_;
|
| + MockRenderer *renderer_;
|
| };
|
|
|
| -// Test that non PoT textures can't make render surfaces
|
| +// Tests that non PoT textures can't make render surfaces.
|
| TEST_F(RenderSurfaceTest, NonPowerOfTwoRenderSurfaceEnabled) {
|
| - Texture2D* texture = pack()->CreateTexture2D(20, 32, Texture::ARGB8, 2, true);
|
| + Texture2D *texture = pack()->CreateTexture2D(20, 32, Texture::ARGB8, 2, true);
|
| ASSERT_TRUE(NULL == texture);
|
| }
|
| -// Test that a render surface can be created
|
| +
|
| +// Tests that a render surface can be created from a texture 2d.
|
| TEST_F(RenderSurfaceTest, CreateRenderSurfaceFromTexture2D) {
|
| - Texture2D* texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true);
|
| + Texture2D *texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true);
|
| ASSERT_TRUE(NULL != texture);
|
|
|
| RenderSurface::Ref render_surface = texture->GetRenderSurface(0);
|
| @@ -94,33 +149,36 @@
|
| ASSERT_EQ(render_surface->height(), 32);
|
| }
|
|
|
| +// Tests that a render surface can be created from a cube texture.
|
| TEST_F(RenderSurfaceTest, CreateRenderSurfaceFromTextureCUBE) {
|
| - TextureCUBE* texture = pack()->CreateTextureCUBE(16, Texture::ARGB8, 2, true);
|
| + TextureCUBE *texture = pack()->CreateTextureCUBE(16, Texture::ARGB8, 2, true);
|
| ASSERT_TRUE(NULL != texture);
|
|
|
| RenderSurface::Ref render_surface = texture->GetRenderSurface(
|
| - TextureCUBE::FACE_POSITIVE_X, 0);
|
| + TextureCUBE::FACE_POSITIVE_X, 0);
|
| ASSERT_TRUE(NULL != render_surface);
|
| ASSERT_TRUE(NULL != render_surface->texture());
|
| ASSERT_EQ(render_surface->width(), 16);
|
| ASSERT_EQ(render_surface->height(), 16);
|
| }
|
|
|
| +// Tests the renderer's functionality to swap render surfaces and that
|
| +// the correct render surfaces are set.
|
| TEST_F(RenderSurfaceTest, SwapRenderSurfaces) {
|
| - Texture2D* texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true);
|
| + Texture2D *texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true);
|
| ASSERT_TRUE(NULL != texture);
|
|
|
| RenderSurface::Ref render_surface = texture->GetRenderSurface(0);
|
| ASSERT_TRUE(NULL != render_surface);
|
| ASSERT_TRUE(texture == render_surface->texture());
|
|
|
| - RenderDepthStencilSurface* depth_surface =
|
| - pack()->CreateDepthStencilSurface(16, 32);
|
| + RenderDepthStencilSurface *depth_surface =
|
| + pack()->CreateDepthStencilSurface(16, 32);
|
|
|
| // Now swap surfaces.
|
| renderer()->SetRenderSurfaces(render_surface, depth_surface, false);
|
| - const RenderSurface* test_render_surface = NULL;
|
| - const RenderDepthStencilSurface* test_depth_surface = NULL;
|
| + const RenderSurface *test_render_surface = NULL;
|
| + const RenderDepthStencilSurface *test_depth_surface = NULL;
|
| bool test_is_back_buffer;
|
| renderer()->GetRenderSurfaces(&test_render_surface, &test_depth_surface,
|
| &test_is_back_buffer);
|
| @@ -129,19 +187,57 @@
|
| ASSERT_FALSE(test_is_back_buffer);
|
| }
|
|
|
| +// Tests the renderer's functionality to swap render surfaces and return
|
| +// the old one to the main rendering surface.
|
| +TEST_F(RenderSurfaceTest, SetBackSurfaces) {
|
| + Texture2D *texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true);
|
| + ASSERT_TRUE(NULL != texture);
|
| +
|
| + RenderSurface::Ref render_surface = texture->GetRenderSurface(0);
|
| + ASSERT_TRUE(NULL != render_surface);
|
| + ASSERT_TRUE(texture == render_surface->texture());
|
| +
|
| + RenderDepthStencilSurface *depth_surface =
|
| + pack()->CreateDepthStencilSurface(16, 32);
|
| +
|
| + // Save the original surfaces for comparison.
|
| + const RenderSurface *original_render_surface = NULL;
|
| + const RenderDepthStencilSurface *original_depth_surface = NULL;
|
| + bool original_is_back_buffer;
|
| + renderer()->GetRenderSurfaces(&original_render_surface,
|
| + &original_depth_surface,
|
| + &original_is_back_buffer);
|
| + // Now swap surfaces.
|
| + renderer()->SetRenderSurfaces(render_surface, depth_surface, false);
|
| + // Return the back buffers
|
| + renderer()->SetRenderSurfaces(NULL, NULL, true);
|
| + // Get the original surfaces again for comparison.
|
| + const RenderSurface *restored_render_surface = NULL;
|
| + const RenderDepthStencilSurface *restored_depth_surface = NULL;
|
| + bool restored_is_back_buffer;
|
| + renderer()->GetRenderSurfaces(&original_render_surface,
|
| + &original_depth_surface,
|
| + &restored_is_back_buffer);
|
| + ASSERT_TRUE(original_render_surface == restored_render_surface);
|
| + ASSERT_TRUE(original_depth_surface == restored_depth_surface);
|
| + ASSERT_TRUE(restored_is_back_buffer);
|
| +}
|
| +
|
| +// Tests the render surfaces interaction as part of a render surface set
|
| +// which is how they are commonly used in practice.
|
| TEST_F(RenderSurfaceTest, RenderSurfaceSetTest) {
|
| - Texture2D* texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true);
|
| + Texture2D *texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true);
|
| ASSERT_TRUE(NULL != texture);
|
|
|
| RenderSurface::Ref render_surface = texture->GetRenderSurface(0);
|
| ASSERT_TRUE(NULL != render_surface);
|
| ASSERT_TRUE(texture == render_surface->texture());
|
|
|
| - RenderDepthStencilSurface* depth_surface =
|
| - pack()->CreateDepthStencilSurface(16, 32);
|
| + RenderDepthStencilSurface *depth_surface =
|
| + pack()->CreateDepthStencilSurface(16, 32);
|
| ASSERT_TRUE(depth_surface != NULL);
|
|
|
| - RenderSurfaceSet* render_surface_set = pack()->Create<RenderSurfaceSet>();
|
| + RenderSurfaceSet *render_surface_set = pack()->Create<RenderSurfaceSet>();
|
| ASSERT_TRUE(render_surface_set != NULL);
|
| render_surface_set->set_render_surface(render_surface);
|
| render_surface_set->set_render_depth_stencil_surface(depth_surface);
|
| @@ -149,15 +245,15 @@
|
|
|
| RenderContext render_context(g_renderer);
|
|
|
| - const RenderSurface* old_render_surface = NULL;
|
| - const RenderDepthStencilSurface* old_depth_surface = NULL;
|
| + const RenderSurface *old_render_surface = NULL;
|
| + const RenderDepthStencilSurface *old_depth_surface = NULL;
|
| bool old_is_back_buffer = false;
|
| renderer()->GetRenderSurfaces(&old_render_surface, &old_depth_surface,
|
| &old_is_back_buffer);
|
|
|
| render_surface_set->Render(&render_context);
|
| - const RenderSurface* test_render_surface = NULL;
|
| - const RenderDepthStencilSurface* test_depth_surface = NULL;
|
| + const RenderSurface *test_render_surface = NULL;
|
| + const RenderDepthStencilSurface *test_depth_surface = NULL;
|
| bool test_is_back_buffer = false;
|
| renderer()->GetRenderSurfaces(&test_render_surface, &test_depth_surface,
|
| &test_is_back_buffer);
|
|
|