OSDN Git Service

Fix memory leaks.
authorNicolas Capens <capn@google.com>
Sat, 9 Jan 2016 04:33:22 +0000 (23:33 -0500)
committerNicolas Capens <capn@google.com>
Sat, 9 Jan 2016 17:55:27 +0000 (17:55 +0000)
Change-Id: I668c4295fd13d028fa53f6aa75ac6c6d4c6de44f
Reviewed-on: https://swiftshader-review.googlesource.com/4531
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
src/OpenGL/libEGL/Surface.cpp
src/OpenGL/libEGL/Surface.h
src/Renderer/QuadRasterizer.hpp
src/Shader/ShaderCore.hpp

index f8d0ac8..7cae134 100644 (file)
@@ -56,7 +56,7 @@ Surface::Surface(const Display *display, const Config *config) : display(display
 \r
 Surface::~Surface()\r
 {\r
-    deleteResources();\r
+    Surface::deleteResources();\r
 }\r
 \r
 bool Surface::initialize()\r
@@ -230,6 +230,11 @@ WindowSurface::WindowSurface(Display *display, const Config *config, EGLNativeWi
     frameBuffer = nullptr;\r
 }\r
 \r
+WindowSurface::~WindowSurface()\r
+{\r
+       WindowSurface::deleteResources();\r
+}\r
+\r
 bool WindowSurface::initialize()\r
 {\r
     ASSERT(!frameBuffer && !backBuffer && !depthStencil);\r
@@ -343,6 +348,11 @@ PBufferSurface::PBufferSurface(Display *display, const Config *config, EGLint wi
        this->largestPBuffer = largestPBuffer;\r
 }\r
 \r
+PBufferSurface::~PBufferSurface()\r
+{\r
+       PBufferSurface::deleteResources();\r
+}\r
+\r
 void PBufferSurface::swap()\r
 {\r
        // No effect\r
@@ -355,4 +365,8 @@ EGLNativeWindowType PBufferSurface::getWindowHandle() const
     return 0;\r
 }\r
 \r
+void PBufferSurface::deleteResources()\r
+{\r
+}\r
+\r
 }\r
index bb91a31..55589d2 100644 (file)
@@ -33,7 +33,7 @@ class Surface : public gl::Object
 public:\r
        virtual bool initialize();\r
     virtual void swap() = 0;\r
-    \r
+\r
     virtual egl::Image *getRenderTarget();\r
     virtual egl::Image *getDepthStencil();\r
 \r
@@ -73,7 +73,7 @@ protected:
        Texture *texture;\r
 \r
        bool reset(int backbufferWidth, int backbufferHeight);\r
-   \r
+\r
        const Config *const config;    // EGL config surface was created with\r
        EGLint height;                 // Height of surface\r
        EGLint width;                  // Width of surface\r
@@ -97,6 +97,7 @@ class WindowSurface : public Surface
 {\r
 public:\r
        WindowSurface(Display *display, const egl::Config *config, EGLNativeWindowType window);\r
+       ~WindowSurface() override;\r
 \r
        bool initialize() override;\r
 \r
@@ -118,11 +119,15 @@ class PBufferSurface : public Surface
 {\r
 public:\r
        PBufferSurface(Display *display, const egl::Config *config, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureTarget, EGLBoolean largestPBuffer);\r
+       ~PBufferSurface() override;\r
 \r
        bool isPBufferSurface() const override { return true; }\r
        void swap() override;\r
 \r
        EGLNativeWindowType getWindowHandle() const override;\r
+\r
+private:\r
+       void deleteResources() override;\r
 };\r
 }\r
 \r
index c1b05c0..a9359eb 100644 (file)
@@ -30,6 +30,7 @@ namespace sw
                struct Registers
                {
                        Registers();
+                       virtual ~Registers() {};
 
                        Pointer<Byte> constants;
 
index 565d682..f307526 100644 (file)
@@ -75,7 +75,7 @@ namespace sw
 \r
                Float4 &operator[](int i);\r
                Vector4f &operator=(const Vector4f &rhs);\r
-               \r
+\r
                Float4 x;\r
                Float4 y;\r
                Float4 z;\r
@@ -200,10 +200,20 @@ namespace sw
 \r
                ~RegisterArray()\r
                {\r
-                       delete[] x;\r
-                       delete[] y;\r
-                       delete[] z;\r
-                       delete[] w;\r
+                       if(dynamic)\r
+                       {\r
+                               delete x;\r
+                               delete y;\r
+                               delete z;\r
+                               delete w;\r
+                       }\r
+                       else\r
+                       {\r
+                               delete[] x;\r
+                               delete[] y;\r
+                               delete[] z;\r
+                               delete[] w;\r
+                       }\r
                }\r
 \r
                Register operator[](int i)\r