| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 
| 3  * | 3  * | 
| 4  *  Use of this source code is governed by a BSD-style license | 4  *  Use of this source code is governed by a BSD-style license | 
| 5  *  that can be found in the LICENSE file in the root of the source | 5  *  that can be found in the LICENSE file in the root of the source | 
| 6  *  tree. An additional intellectual property rights grant can be found | 6  *  tree. An additional intellectual property rights grant can be found | 
| 7  *  in the file PATENTS.  All contributing project authors may | 7  *  in the file PATENTS.  All contributing project authors may | 
| 8  *  be found in the AUTHORS file in the root of the source tree. | 8  *  be found in the AUTHORS file in the root of the source tree. | 
| 9  */ | 9  */ | 
| 10 | 10 | 
| 11 #include "webrtc/test/linux/glx_renderer.h" | 11 #include "webrtc/test/linux/glx_renderer.h" | 
| 12 | 12 | 
| 13 #include <assert.h> | 13 #include <assert.h> | 
| 14 #include <stdlib.h> | 14 #include <stdlib.h> | 
| 15 | 15 | 
| 16 #include <X11/Xatom.h> | 16 #include <X11/Xatom.h> | 
| 17 #include <X11/Xlib.h> | 17 #include <X11/Xlib.h> | 
| 18 | 18 | 
| 19 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | 19 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | 
| 20 | 20 | 
| 21 namespace webrtc { | 21 namespace webrtc { | 
| 22 namespace test { | 22 namespace test { | 
| 23 | 23 | 
| 24 GlxRenderer::GlxRenderer(size_t width, size_t height) | 24 GlxRenderer::GlxRenderer(size_t width, size_t height) | 
| 25     : width_(width), | 25     : width_(width), height_(height), display_(nullptr), context_(nullptr) { | 
| 26       height_(height), |  | 
| 27       display_(NULL), |  | 
| 28       context_(NULL) { |  | 
| 29   assert(width > 0); | 26   assert(width > 0); | 
| 30   assert(height > 0); | 27   assert(height > 0); | 
| 31 } | 28 } | 
| 32 | 29 | 
| 33 GlxRenderer::~GlxRenderer() { Destroy(); } | 30 GlxRenderer::~GlxRenderer() { Destroy(); } | 
| 34 | 31 | 
| 35 bool GlxRenderer::Init(const char* window_title) { | 32 bool GlxRenderer::Init(const char* window_title) { | 
| 36   if ((display_ = XOpenDisplay(NULL)) == NULL) { | 33   if ((display_ = XOpenDisplay(nullptr)) == nullptr) { | 
| 37     Destroy(); | 34     Destroy(); | 
| 38     return false; | 35     return false; | 
| 39   } | 36   } | 
| 40 | 37 | 
| 41   int screen = DefaultScreen(display_); | 38   int screen = DefaultScreen(display_); | 
| 42 | 39 | 
| 43   XVisualInfo* vi; | 40   XVisualInfo* vi; | 
| 44   int attr_list[] = { GLX_DOUBLEBUFFER, GLX_RGBA, GLX_RED_SIZE, 4, | 41   int attr_list[] = { GLX_DOUBLEBUFFER, GLX_RGBA, GLX_RED_SIZE, 4, | 
| 45                       GLX_GREEN_SIZE, 4, GLX_BLUE_SIZE, 4, GLX_DEPTH_SIZE, 16, | 42                       GLX_GREEN_SIZE, 4, GLX_BLUE_SIZE, 4, GLX_DEPTH_SIZE, 16, | 
| 46                       None, }; | 43                       None, }; | 
| 47 | 44 | 
| 48   if ((vi = glXChooseVisual(display_, screen, attr_list)) == NULL) { | 45   if ((vi = glXChooseVisual(display_, screen, attr_list)) == nullptr) { | 
| 49     Destroy(); | 46     Destroy(); | 
| 50     return false; | 47     return false; | 
| 51   } | 48   } | 
| 52 | 49 | 
| 53   context_ = glXCreateContext(display_, vi, 0, true); | 50   context_ = glXCreateContext(display_, vi, 0, true); | 
| 54   if (context_ == NULL) { | 51   if (context_ == nullptr) { | 
| 55     Destroy(); | 52     Destroy(); | 
| 56     return false; | 53     return false; | 
| 57   } | 54   } | 
| 58 | 55 | 
| 59   XSetWindowAttributes window_attributes; | 56   XSetWindowAttributes window_attributes; | 
| 60   window_attributes.colormap = XCreateColormap( | 57   window_attributes.colormap = XCreateColormap( | 
| 61       display_, RootWindow(display_, vi->screen), vi->visual, AllocNone); | 58       display_, RootWindow(display_, vi->screen), vi->visual, AllocNone); | 
| 62   window_attributes.border_pixel = 0; | 59   window_attributes.border_pixel = 0; | 
| 63   window_attributes.event_mask = StructureNotifyMask | ExposureMask; | 60   window_attributes.event_mask = StructureNotifyMask | ExposureMask; | 
| 64   window_ = XCreateWindow(display_, RootWindow(display_, vi->screen), 0, 0, | 61   window_ = XCreateWindow(display_, RootWindow(display_, vi->screen), 0, 0, | 
| 65                           width_, height_, 0, vi->depth, InputOutput, | 62                           width_, height_, 0, vi->depth, InputOutput, | 
| 66                           vi->visual, CWBorderPixel | CWColormap | CWEventMask, | 63                           vi->visual, CWBorderPixel | CWColormap | CWEventMask, | 
| 67                           &window_attributes); | 64                           &window_attributes); | 
| 68   XFree(vi); | 65   XFree(vi); | 
| 69 | 66 | 
| 70   XSetStandardProperties(display_, window_, window_title, window_title, None, | 67   XSetStandardProperties(display_, window_, window_title, window_title, None, | 
| 71                          NULL, 0, NULL); | 68                          nullptr, 0, nullptr); | 
| 72 | 69 | 
| 73   Atom wm_delete = XInternAtom(display_, "WM_DELETE_WINDOW", True); | 70   Atom wm_delete = XInternAtom(display_, "WM_DELETE_WINDOW", True); | 
| 74   if (wm_delete != None) { | 71   if (wm_delete != None) { | 
| 75     XSetWMProtocols(display_, window_, &wm_delete, 1); | 72     XSetWMProtocols(display_, window_, &wm_delete, 1); | 
| 76   } | 73   } | 
| 77 | 74 | 
| 78   XMapRaised(display_, window_); | 75   XMapRaised(display_, window_); | 
| 79 | 76 | 
| 80   if (!glXMakeCurrent(display_, window_, context_)) { | 77   if (!glXMakeCurrent(display_, window_, context_)) { | 
| 81     Destroy(); | 78     Destroy(); | 
| 82     return false; | 79     return false; | 
| 83   } | 80   } | 
| 84   GlRenderer::Init(); | 81   GlRenderer::Init(); | 
| 85   if (!glXMakeCurrent(display_, None, NULL)) { | 82   if (!glXMakeCurrent(display_, None, nullptr)) { | 
| 86     Destroy(); | 83     Destroy(); | 
| 87     return false; | 84     return false; | 
| 88   } | 85   } | 
| 89 | 86 | 
| 90   Resize(width_, height_); | 87   Resize(width_, height_); | 
| 91   return true; | 88   return true; | 
| 92 } | 89 } | 
| 93 | 90 | 
| 94 void GlxRenderer::Destroy() { | 91 void GlxRenderer::Destroy() { | 
| 95   if (context_ != NULL) { | 92   if (context_ != nullptr) { | 
| 96     glXMakeCurrent(display_, window_, context_); | 93     glXMakeCurrent(display_, window_, context_); | 
| 97     GlRenderer::Destroy(); | 94     GlRenderer::Destroy(); | 
| 98     glXMakeCurrent(display_, None, NULL); | 95     glXMakeCurrent(display_, None, nullptr); | 
| 99     glXDestroyContext(display_, context_); | 96     glXDestroyContext(display_, context_); | 
| 100     context_ = NULL; | 97     context_ = nullptr; | 
| 101   } | 98   } | 
| 102 | 99 | 
| 103   if (display_ != NULL) { | 100   if (display_ != nullptr) { | 
| 104     XCloseDisplay(display_); | 101     XCloseDisplay(display_); | 
| 105     display_ = NULL; | 102     display_ = nullptr; | 
| 106   } | 103   } | 
| 107 } | 104 } | 
| 108 | 105 | 
| 109 GlxRenderer* GlxRenderer::Create(const char* window_title, size_t width, | 106 GlxRenderer* GlxRenderer::Create(const char* window_title, size_t width, | 
| 110                                  size_t height) { | 107                                  size_t height) { | 
| 111   GlxRenderer* glx_renderer = new GlxRenderer(width, height); | 108   GlxRenderer* glx_renderer = new GlxRenderer(width, height); | 
| 112   if (!glx_renderer->Init(window_title)) { | 109   if (!glx_renderer->Init(window_title)) { | 
| 113     // TODO(pbos): Add GLX-failed warning here? | 110     // TODO(pbos): Add GLX-failed warning here? | 
| 114     delete glx_renderer; | 111     delete glx_renderer; | 
| 115     return NULL; | 112     return nullptr; | 
| 116   } | 113   } | 
| 117   return glx_renderer; | 114   return glx_renderer; | 
| 118 } | 115 } | 
| 119 | 116 | 
| 120 void GlxRenderer::Resize(size_t width, size_t height) { | 117 void GlxRenderer::Resize(size_t width, size_t height) { | 
| 121   width_ = width; | 118   width_ = width; | 
| 122   height_ = height; | 119   height_ = height; | 
| 123   if (!glXMakeCurrent(display_, window_, context_)) { | 120   if (!glXMakeCurrent(display_, window_, context_)) { | 
| 124     abort(); | 121     abort(); | 
| 125   } | 122   } | 
| 126   GlRenderer::ResizeViewport(width_, height_); | 123   GlRenderer::ResizeViewport(width_, height_); | 
| 127   if (!glXMakeCurrent(display_, None, NULL)) { | 124   if (!glXMakeCurrent(display_, None, nullptr)) { | 
| 128     abort(); | 125     abort(); | 
| 129   } | 126   } | 
| 130 | 127 | 
| 131   XSizeHints* size_hints = XAllocSizeHints(); | 128   XSizeHints* size_hints = XAllocSizeHints(); | 
| 132   if (size_hints == NULL) { | 129   if (size_hints == nullptr) { | 
| 133     abort(); | 130     abort(); | 
| 134   } | 131   } | 
| 135   size_hints->flags = PAspect; | 132   size_hints->flags = PAspect; | 
| 136   size_hints->min_aspect.x = size_hints->max_aspect.x = width_; | 133   size_hints->min_aspect.x = size_hints->max_aspect.x = width_; | 
| 137   size_hints->min_aspect.y = size_hints->max_aspect.y = height_; | 134   size_hints->min_aspect.y = size_hints->max_aspect.y = height_; | 
| 138   XSetWMNormalHints(display_, window_, size_hints); | 135   XSetWMNormalHints(display_, window_, size_hints); | 
| 139   XFree(size_hints); | 136   XFree(size_hints); | 
| 140 | 137 | 
| 141   XWindowChanges wc; | 138   XWindowChanges wc; | 
| 142   wc.width = static_cast<int>(width); | 139   wc.width = static_cast<int>(width); | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
| 163                                    event.xconfigure.height); | 160                                    event.xconfigure.height); | 
| 164         break; | 161         break; | 
| 165       default: | 162       default: | 
| 166         break; | 163         break; | 
| 167     } | 164     } | 
| 168   } | 165   } | 
| 169 | 166 | 
| 170   GlRenderer::OnFrame(frame); | 167   GlRenderer::OnFrame(frame); | 
| 171   glXSwapBuffers(display_, window_); | 168   glXSwapBuffers(display_, window_); | 
| 172 | 169 | 
| 173   if (!glXMakeCurrent(display_, None, NULL)) { | 170   if (!glXMakeCurrent(display_, None, nullptr)) { | 
| 174     abort(); | 171     abort(); | 
| 175   } | 172   } | 
| 176 } | 173 } | 
| 177 }  // test | 174 }  // test | 
| 178 }  // webrtc | 175 }  // webrtc | 
| OLD | NEW | 
|---|