<commit_before>/**************************************************************************
 * 
 * Copyright 2008 Tungsten Graphics, Inc., <NAME>, Texas.
 * All Rights Reserved.
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sub license, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 * 
 **************************************************************************/

#include <windows.h>

#include "main/context.h"
#include "pipe/p_format.h"
#include "pipe/p_screen.h"
#include "state_tracker/st_context.h"
#include "state_tracker/st_public.h"
#include "stw_framebuffer.h"
#include "stw_device.h"
#include "stw_public.h"
#include "stw_winsys.h"


void
framebuffer_resize(
   struct stw_framebuffer *fb,
   GLuint width,
   GLuint height )
{
   if (fb->hbmDIB == NULL || fb->stfb->Base.Width != width || fb->stfb->Base.Height != height) {
      if (fb->hbmDIB)
         DeleteObject( fb->hbmDIB );

      fb->hbmDIB = CreateCompatibleBitmap(
         fb->hDC,
         width,
         height );
   }

   st_resize_framebuffer( fb->stfb, width, height );
}

static struct stw_framebuffer *fb_head = NULL;

static LRESULT CALLBACK
window_proc(
   HWND hWnd,
   UINT uMsg,
   WPARAM wParam,
   LPARAM lParam )
{
   struct stw_framebuffer *fb;

   for (fb = fb_head; fb != NULL; fb = fb->next)
      if (fb->hWnd == hWnd)
         break;
   assert( fb != NULL );

   if (uMsg == WM_SIZE && wParam != SIZE_MINIMIZED)
      framebuffer_resize( fb, LOWORD( lParam ), HIWORD( lParam ) );

   return CallWindowProc( fb->WndProc, hWnd, uMsg, wParam, lParam );
}

static INLINE boolean
stw_is_supported_depth_stencil(enum pipe_format format)
{
   struct pipe_screen *screen = stw_dev->screen;
   return screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 
                                      PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0);
}

/* Create a new framebuffer object which will correspond to the given HDC.
 */
struct stw_framebuffer *
framebuffer_create(
   HDC hdc,
   GLvisual *visual,
   GLuint width,
   GLuint height )
{
   struct stw_framebuffer *fb;
   enum pipe_format colorFormat, depthFormat, stencilFormat;

   fb = CALLOC_STRUCT( stw_framebuffer );
   if (fb == NULL)
      return NULL;

   /* Determine PIPE_FORMATs for buffers.
    */
   colorFormat = PIPE_FORMAT_A8R8G8B8_UNORM;

   if (visual->depthBits == 0)
      depthFormat = PIPE_FORMAT_NONE;
   else if (visual->depthBits <= 16)
      depthFormat = PIPE_FORMAT_Z16_UNORM;
   else if (visual->depthBits <= 24 && visual->stencilBits != 8 &&
            stw_is_supported_depth_stencil(PIPE_FORMAT_X8Z24_UNORM)) {
      depthFormat = PIPE_FORMAT_X8Z24_UNORM;
   }
   else if (visual->depthBits <= 24 && visual->stencilBits != 8 && 
            stw_is_supported_depth_stencil(PIPE_FORMAT_Z24X8_UNORM)) {
      depthFormat = PIPE_FORMAT_Z24X8_UNORM;
   }
   else if (visual->depthBits <= 24 && visual->stencilBits == 8 && 
            stw_is_supported_depth_stencil(PIPE_FORMAT_S8Z24_UNORM)) {
      depthFormat = PIPE_FORMAT_S8Z24_UNORM;
   }
   else if (visual->depthBits <= 24 && visual->stencilBits == 8 && 
            stw_is_supported_depth_stencil(PIPE_FORMAT_Z24S8_UNORM)) {
      depthFormat = PIPE_FORMAT_Z24S8_UNORM;
   }
   else
      depthFormat = PIPE_FORMAT_Z32_UNORM;

   if (visual->stencilBits == 8) {
      if (depthFormat == PIPE_FORMAT_S8Z24_UNORM || depthFormat == PIPE_FORMAT_Z24S8_UNORM)
         stencilFormat = depthFormat;
      else
         stencilFormat = PIPE_FORMAT_S8_UNORM;
   }
   else {
      stencilFormat = PIPE_FORMAT_NONE;
   }

   fb->stfb = st_create_framebuffer(
      visual,
      colorFormat,
      depthFormat,
      stencilFormat,
      width,
      height,
      (void *) fb );

   fb->cColorBits = GetDeviceCaps( hdc, BITSPIXEL );
   fb->hDC = hdc;

   /* Subclass a window associated with the device context.
    */
   fb->hWnd = WindowFromDC( hdc );
   if (fb->hWnd != NULL) {
      fb->WndProc = (WNDPROC) SetWindowLong(
         fb->hWnd,
         GWL_WNDPROC,
         (LONG) window_proc );
   }

   fb->next = fb_head;
   fb_head = fb;
   return fb;<commit_msg>wgl: Check support for all other depth/stencil formats.<commit_after>/**************************************************************************
 * 
 * Copyright 2008 Tungsten Graphics, Inc., <NAME>, Texas.
 * All Rights Reserved.
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sub license, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 * 
 **************************************************************************/

#include <windows.h>

#include "main/context.h"
#include "pipe/p_format.h"
#include "pipe/p_screen.h"
#include "state_tracker/st_context.h"
#include "state_tracker/st_public.h"
#include "stw_framebuffer.h"
#include "stw_device.h"
#include "stw_public.h"
#include "stw_winsys.h"


void
framebuffer_resize(
   struct stw_framebuffer *fb,
   GLuint width,
   GLuint height )
{
   if (fb->hbmDIB == NULL || fb->stfb->Base.Width != width || fb->stfb->Base.Height != height) {
      if (fb->hbmDIB)
         DeleteObject( fb->hbmDIB );

      fb->hbmDIB = CreateCompatibleBitmap(
         fb->hDC,
         width,
         height );
   }

   st_resize_framebuffer( fb->stfb, width, height );
}

static struct stw_framebuffer *fb_head = NULL;

static LRESULT CALLBACK
window_proc(
   HWND hWnd,
   UINT uMsg,
   WPARAM wParam,
   LPARAM lParam )
{
   struct stw_framebuffer *fb;

   for (fb = fb_head; fb != NULL; fb = fb->next)
      if (fb->hWnd == hWnd)
         break;
   assert( fb != NULL );

   if (uMsg == WM_SIZE && wParam != SIZE_MINIMIZED)
      framebuffer_resize( fb, LOWORD( lParam ), HIWORD( lParam ) );

   return CallWindowProc( fb->WndProc, hWnd, uMsg, wParam, lParam );
}

static INLINE boolean
stw_is_supported_depth_stencil(enum pipe_format format)
{
   struct pipe_screen *screen = stw_dev->screen;
   return screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 
                                      PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0);
}

/* Create a new framebuffer object which will correspond to the given HDC.
 */
struct stw_framebuffer *
framebuffer_create(
   HDC hdc,
   GLvisual *visual,
   GLuint width,
   GLuint height )
{
   struct stw_framebuffer *fb;
   enum pipe_format colorFormat, depthFormat, stencilFormat;

   fb = CALLOC_STRUCT( stw_framebuffer );
   if (fb == NULL)
      return NULL;

   /* Determine PIPE_FORMATs for buffers.
    */
   colorFormat = PIPE_FORMAT_A8R8G8B8_UNORM;

   if (visual->depthBits == 0)
      depthFormat = PIPE_FORMAT_NONE;
   else if (visual->depthBits <= 16 &&
            stw_is_supported_depth_stencil(PIPE_FORMAT_Z16_UNORM))
      depthFormat = PIPE_FORMAT_Z16_UNORM;
   else if (visual->depthBits <= 24 && visual->stencilBits != 8 &&
            stw_is_supported_depth_stencil(PIPE_FORMAT_X8Z24_UNORM)) {
      depthFormat = PIPE_FORMAT_X8Z24_UNORM;
   }
   else if (visual->depthBits <= 24 && visual->stencilBits != 8 && 
            stw_is_supported_depth_stencil(PIPE_FORMAT_Z24X8_UNORM)) {
      depthFormat = PIPE_FORMAT_Z24X8_UNORM;
   }
   else if (visual->depthBits <= 24 && visual->stencilBits == 8 && 
            stw_is_supported_depth_stencil(PIPE_FORMAT_S8Z24_UNORM)) {
      depthFormat = PIPE_FORMAT_S8Z24_UNORM;
   }
   else if (visual->depthBits <= 24 && visual->stencilBits == 8 && 
            stw_is_supported_depth_stencil(PIPE_FORMAT_Z24S8_UNORM)) {
      depthFormat = PIPE_FORMAT_Z24S8_UNORM;
   }
   else if(stw_is_supported_depth_stencil(PIPE_FORMAT_Z32_UNORM)) {
      depthFormat = PIPE_FORMAT_Z32_UNORM;
   }
   else if(stw_is_supported_depth_stencil(PIPE_FORMAT_Z32_FLOAT)) {
      depthFormat = PIPE_FORMAT_Z32_FLOAT;
   }
   else {
      assert(0);
      depthFormat = PIPE_FORMAT_NONE;
   }

   if (depthFormat == PIPE_FORMAT_S8Z24_UNORM || 
       depthFormat == PIPE_FORMAT_Z24S8_UNORM) {
      stencilFormat = depthFormat;
   }
   else if (visual->stencilBits == 8 && 
            stw_is_supported_depth_stencil(PIPE_FORMAT_S8_UNORM)) {
      stencilFormat = PIPE_FORMAT_S8_UNORM;
   }
   else {
      stencilFormat = PIPE_FORMAT_NONE;
   }

   fb->stfb = st_create_framebuffer(
      visual,
      colorFormat,
      depthFormat,
      stencilFormat,
      width,
      height,
      (void *) fb );

   fb->cColorBits = GetDeviceCaps( hdc, BITSPIXEL );
   fb->hDC = hdc;

   /* Subclass a window associated with the device context.
    */
   fb->hWnd = WindowFromDC( hdc );
   if (fb->hWnd != NULL) {
      fb->WndProc = (WNDPROC) SetWindowLong(
         fb->hWnd,
         GWL_WNDPROC,
         (LONG) window_proc );
   }

   fb->next = fb_head;
   fb_head = fb;
   return fb;
{'fraction_non_alphanumeric': 0.12098974503716248, 'fraction_numerical': 0.012418854078464579, 'mean_word_length': 3.329938900203666, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 75, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4329200', 'n_tokens_mistral': 3689, 'n_tokens_neox': 3437, 'n_words': 915}