1a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu/* 2a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * Mesa 3-D graphics library 3a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * Version: 7.9 4a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * 5a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * Copyright (C) 2010 LunarG Inc. 6a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * 7a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 8a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * copy of this software and associated documentation files (the "Software"), 9a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * to deal in the Software without restriction, including without limitation 10a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 12a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * Software is furnished to do so, subject to the following conditions: 13a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * 14a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * The above copyright notice and this permission notice shall be included 15a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * in all copies or substantial portions of the Software. 16a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * 17a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * DEALINGS IN THE SOFTWARE. 24a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * 25a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * Authors: 26a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu * Chia-I Wu <olv@lunarg.com> 27a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu */ 28a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 29a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu#include <windows.h> 30a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 31a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu#include "pipe/p_compiler.h" 32a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu#include "util/u_memory.h" 33a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu#include "util/u_format.h" 34a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu#include "util/u_inlines.h" 35a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu#include "gdi/gdi_sw_winsys.h" 36a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 37e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu#include "common/native_helper.h" 38a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu#include "common/native.h" 39a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 40a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustruct gdi_display { 41a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct native_display base; 42a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 43a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu HDC hDC; 4473df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu const struct native_event_handler *event_handler; 45a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 46a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct native_config *configs; 47a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu int num_configs; 48a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu}; 49a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 50a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustruct gdi_surface { 51a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct native_surface base; 52a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 53a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu HWND hWnd; 54a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu enum pipe_format color_format; 55a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 56a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_display *gdpy; 57a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 58a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu unsigned int server_stamp; 59a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu unsigned int client_stamp; 60a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 61e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu struct resource_surface *rsurf; 62a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu}; 63a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 64a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic INLINE struct gdi_display * 65a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_display(const struct native_display *ndpy) 66a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 67a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu return (struct gdi_display *) ndpy; 68a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 69a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 70a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic INLINE struct gdi_surface * 71a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_surface(const struct native_surface *nsurf) 72a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 73a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu return (struct gdi_surface *) nsurf; 74a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 75a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 76a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu/** 77e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu * Update the geometry of the surface. This is a slow functions. 78a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu */ 79e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wustatic void 80a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_surface_update_geometry(struct native_surface *nsurf) 81a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 82a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_surface *gsurf = gdi_surface(nsurf); 83a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu RECT rect; 84e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu uint w, h; 85a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 86a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu GetClientRect(gsurf->hWnd, &rect); 87a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu w = rect.right - rect.left; 88a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu h = rect.bottom - rect.top; 89a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 90e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu if (resource_surface_set_size(gsurf->rsurf, w, h)) 91a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gsurf->server_stamp++; 92a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 93a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 94a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu/** 95e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu * Update the buffers of the surface. 96a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu */ 97a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic boolean 98a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_surface_update_buffers(struct native_surface *nsurf, uint buffer_mask) 99a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 100a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_surface *gsurf = gdi_surface(nsurf); 101a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 102a27690931be9479353dd8ae0d52186f5c72f4380Chia-I Wu if (gsurf->client_stamp != gsurf->server_stamp) { 103a27690931be9479353dd8ae0d52186f5c72f4380Chia-I Wu gdi_surface_update_geometry(&gsurf->base); 104a27690931be9479353dd8ae0d52186f5c72f4380Chia-I Wu gsurf->client_stamp = gsurf->server_stamp; 105a27690931be9479353dd8ae0d52186f5c72f4380Chia-I Wu } 106a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 107a27690931be9479353dd8ae0d52186f5c72f4380Chia-I Wu return resource_surface_add_resources(gsurf->rsurf, buffer_mask); 108a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 109a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 110e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu/** 111e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu * Emulate an invalidate event. 112e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu */ 113a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic void 114e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wugdi_surface_invalidate(struct native_surface *nsurf) 115a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 116a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_surface *gsurf = gdi_surface(nsurf); 117a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_display *gdpy = gsurf->gdpy; 118a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 119e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu gsurf->server_stamp++; 120a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gdpy->event_handler->invalid_surface(&gdpy->base, 121a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu &gsurf->base, gsurf->server_stamp); 122a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 123a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 124a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic boolean 125a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_surface_flush_frontbuffer(struct native_surface *nsurf) 126a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 127a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_surface *gsurf = gdi_surface(nsurf); 128e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu HDC hDC; 129a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu boolean ret; 130a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 131e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu hDC = GetDC(gsurf->hWnd); 132e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu ret = resource_surface_present(gsurf->rsurf, 133e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu NATIVE_ATTACHMENT_FRONT_LEFT, (void *) hDC); 134e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu ReleaseDC(gsurf->hWnd, hDC); 135e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu 136a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu /* force buffers to be updated in next validation call */ 137e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu gdi_surface_invalidate(&gsurf->base); 138a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 139a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu return ret; 140a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 141a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 142a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic boolean 143a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_surface_swap_buffers(struct native_surface *nsurf) 144a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 145a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_surface *gsurf = gdi_surface(nsurf); 146e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu HDC hDC; 147a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu boolean ret; 148a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 149e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu hDC = GetDC(gsurf->hWnd); 150e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu ret = resource_surface_present(gsurf->rsurf, 151e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu NATIVE_ATTACHMENT_BACK_LEFT, (void *) hDC); 152e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu ReleaseDC(gsurf->hWnd, hDC); 153a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 154e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu resource_surface_swap_buffers(gsurf->rsurf, 155e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu NATIVE_ATTACHMENT_FRONT_LEFT, NATIVE_ATTACHMENT_BACK_LEFT, TRUE); 156e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu /* the front/back buffers have been swapped */ 157e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu gdi_surface_invalidate(&gsurf->base); 158a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 159a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu return ret; 160a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 161a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 162a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic boolean 16394bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wugdi_surface_present(struct native_surface *nsurf, 164221a04fa8e264fc3aaba17e11f1f97c166416da2José Fonseca const struct native_present_control *ctrl) 16594bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu{ 16694bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu boolean ret; 16794bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu 16808e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu if (ctrl->preserve || ctrl->swap_interval) 16994bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu return FALSE; 17094bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu 17108e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu switch (ctrl->natt) { 17294bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu case NATIVE_ATTACHMENT_FRONT_LEFT: 17394bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu ret = gdi_surface_flush_frontbuffer(nsurf); 17494bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu break; 17594bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu case NATIVE_ATTACHMENT_BACK_LEFT: 17694bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu ret = gdi_surface_swap_buffers(nsurf); 17794bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu break; 17894bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu default: 17994bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu ret = FALSE; 18094bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu break; 18194bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu } 18294bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu 18394bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu return ret; 18494bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu} 18594bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu 18694bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wustatic boolean 187a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_surface_validate(struct native_surface *nsurf, uint attachment_mask, 188a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu unsigned int *seq_num, struct pipe_resource **textures, 189a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu int *width, int *height) 190a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 191a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_surface *gsurf = gdi_surface(nsurf); 192e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu uint w, h; 193a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 194a27690931be9479353dd8ae0d52186f5c72f4380Chia-I Wu if (!gdi_surface_update_buffers(&gsurf->base, attachment_mask)) 195a27690931be9479353dd8ae0d52186f5c72f4380Chia-I Wu return FALSE; 196a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 197a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu if (seq_num) 198a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu *seq_num = gsurf->client_stamp; 199a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 200e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu if (textures) 201e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu resource_surface_get_resources(gsurf->rsurf, textures, attachment_mask); 202a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 203e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu resource_surface_get_size(gsurf->rsurf, &w, &h); 204a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu if (width) 205e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu *width = w; 206a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu if (height) 207e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu *height = h; 208a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 209a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu return TRUE; 210a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 211a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 212a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic void 213a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_surface_wait(struct native_surface *nsurf) 214a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 215a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu /* no-op */ 216a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 217a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 218a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic void 219a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_surface_destroy(struct native_surface *nsurf) 220a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 221a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_surface *gsurf = gdi_surface(nsurf); 222a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 223e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu resource_surface_destroy(gsurf->rsurf); 224a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu FREE(gsurf); 225a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 226a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 227a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic struct native_surface * 228a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_display_create_window_surface(struct native_display *ndpy, 229a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu EGLNativeWindowType win, 230a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu const struct native_config *nconf) 231a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 232a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_display *gdpy = gdi_display(ndpy); 233a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_surface *gsurf; 234a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 235a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gsurf = CALLOC_STRUCT(gdi_surface); 236a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu if (!gsurf) 237a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu return NULL; 238a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 239a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gsurf->gdpy = gdpy; 240a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gsurf->color_format = nconf->color_format; 241a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gsurf->hWnd = (HWND) win; 242a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 243e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu gsurf->rsurf = resource_surface_create(gdpy->base.screen, 244e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu gsurf->color_format, 245e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu PIPE_BIND_RENDER_TARGET | 246e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu PIPE_BIND_SAMPLER_VIEW | 247e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu PIPE_BIND_DISPLAY_TARGET | 248e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu PIPE_BIND_SCANOUT); 249e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu if (!gsurf->rsurf) { 250e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu FREE(gsurf); 251e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu return NULL; 252e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu } 253e4400a48a69ff6d24f1e98b413b0eead37882d59Chia-I Wu 254a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu /* initialize the geometry */ 255a27690931be9479353dd8ae0d52186f5c72f4380Chia-I Wu gdi_surface_update_geometry(&gsurf->base); 256a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 257a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gsurf->base.destroy = gdi_surface_destroy; 258b19b8580602a6ba37e81dc8b64c4ed30c1518886Brian Paul gsurf->base.present = gdi_surface_present; 259a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gsurf->base.validate = gdi_surface_validate; 260a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gsurf->base.wait = gdi_surface_wait; 261a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 262a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu return &gsurf->base; 263a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 264a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 265a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic int 266a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wufill_color_formats(struct native_display *ndpy, enum pipe_format formats[8]) 267a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 268a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct pipe_screen *screen = ndpy->screen; 269a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu int i, count = 0; 270a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 271a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu enum pipe_format candidates[] = { 272a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu /* 32-bit */ 273a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu PIPE_FORMAT_B8G8R8A8_UNORM, 274a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu PIPE_FORMAT_A8R8G8B8_UNORM, 275a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu /* 24-bit */ 276a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu PIPE_FORMAT_B8G8R8X8_UNORM, 277a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu PIPE_FORMAT_X8R8G8B8_UNORM, 278a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu /* 16-bit */ 279a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu PIPE_FORMAT_B5G6R5_UNORM 280a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu }; 281a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 282a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu assert(Elements(candidates) <= 8); 283a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 284a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu for (i = 0; i < Elements(candidates); i++) { 285a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu if (screen->is_format_supported(screen, candidates[i], 286e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET)) 287a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu formats[count++] = candidates[i]; 288a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu } 289a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 290a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu return count; 291a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 292a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 293a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic const struct native_config ** 294a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_display_get_configs(struct native_display *ndpy, int *num_configs) 295a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 296a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_display *gdpy = gdi_display(ndpy); 297a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu const struct native_config **configs; 298a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu int i; 299a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 300a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu /* first time */ 301a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu if (!gdpy->configs) { 302a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu enum pipe_format formats[8]; 303a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu int i, count; 304a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 305a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu count = fill_color_formats(&gdpy->base, formats); 306a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 307a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gdpy->configs = CALLOC(count, sizeof(*gdpy->configs)); 308a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu if (!gdpy->configs) 309a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu return NULL; 310a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 311a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu for (i = 0; i < count; i++) { 312a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct native_config *nconf = &gdpy->configs[i]; 313a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 314a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu nconf->buffer_mask = 315a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu (1 << NATIVE_ATTACHMENT_FRONT_LEFT) | 316a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu (1 << NATIVE_ATTACHMENT_BACK_LEFT); 317a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu nconf->color_format = formats[i]; 318a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 319a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu nconf->window_bit = TRUE; 320a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu } 321a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 322a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gdpy->num_configs = count; 323a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu } 324a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 325a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu configs = MALLOC(gdpy->num_configs * sizeof(*configs)); 326a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu if (configs) { 327a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu for (i = 0; i < gdpy->num_configs; i++) 328a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu configs[i] = (const struct native_config *) &gdpy->configs[i]; 329a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu if (num_configs) 330a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu *num_configs = gdpy->num_configs; 331a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu } 332a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu return configs; 333a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 334a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 335a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic int 336a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_display_get_param(struct native_display *ndpy, 337a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu enum native_param_type param) 338a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 339a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu int val; 340a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 341a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu switch (param) { 342a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu case NATIVE_PARAM_USE_NATIVE_BUFFER: 343a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu /* private buffers are allocated */ 344a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu val = FALSE; 345a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu break; 34694bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu case NATIVE_PARAM_PRESERVE_BUFFER: 34794bf657b2390a1cb72d748047e5c7014e4bc1752Chia-I Wu case NATIVE_PARAM_MAX_SWAP_INTERVAL: 348a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu default: 349a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu val = 0; 350a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu break; 351a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu } 352a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 353a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu return val; 354a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 355a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 356a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wustatic void 357a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wugdi_display_destroy(struct native_display *ndpy) 358a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 359a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu struct gdi_display *gdpy = gdi_display(ndpy); 360a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 361a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu if (gdpy->configs) 362a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu FREE(gdpy->configs); 363a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 364d1e4117355f1db6ff87c837df6212bf6168e98a0Thomas Hellstrom ndpy_uninit(ndpy); 365a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 366a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu FREE(gdpy); 367a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 368a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 36973df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wustatic boolean 37073df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wugdi_display_init_screen(struct native_display *ndpy) 371a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 37273df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu struct gdi_display *gdpy = gdi_display(ndpy); 373d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu struct sw_winsys *winsys; 374a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 375d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu winsys = gdi_create_sw_winsys(); 37673df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu if (!winsys) 37773df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu return FALSE; 378a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 3798977879ec91b21572abd9bb95dcd0e72ba49f753Chia-I Wu gdpy->base.screen = gdpy->event_handler->new_sw_screen(&gdpy->base, winsys); 380d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu if (!gdpy->base.screen) { 381d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu if (winsys->destroy) 382d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu winsys->destroy(winsys); 38373df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu return FALSE; 384d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu } 385a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 38673df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu return TRUE; 38773df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu} 38873df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu 38973df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wustatic struct native_display * 39073df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wugdi_create_display(HDC hDC, const struct native_event_handler *event_handler) 39173df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu{ 39273df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu struct gdi_display *gdpy; 39373df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu 39473df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu gdpy = CALLOC_STRUCT(gdi_display); 39573df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu if (!gdpy) 39673df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu return NULL; 39773df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu 39873df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu gdpy->hDC = hDC; 39973df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu gdpy->event_handler = event_handler; 40073df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu 40173df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu gdpy->base.init_screen = gdi_display_init_screen; 402a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gdpy->base.destroy = gdi_display_destroy; 403a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gdpy->base.get_param = gdi_display_get_param; 404a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 405a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gdpy->base.get_configs = gdi_display_get_configs; 406a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu gdpy->base.create_window_surface = gdi_display_create_window_surface; 407a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 408a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu return &gdpy->base; 409a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 410a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu 41173df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wustatic const struct native_event_handler *gdi_event_handler; 412a22a332fc7cc54d4d0973dcd21a90159cc51de1aChia-I Wu 413f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wustatic struct native_display * 41473df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wunative_create_display(void *dpy, boolean use_sw) 415a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu{ 41673df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu return gdi_create_display((HDC) dpy, gdi_event_handler); 417a8e195ec24dc244d975cbd3526debc2c22e717beChia-I Wu} 418f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wu 419f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wustatic const struct native_platform gdi_platform = { 420f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wu "GDI", /* name */ 421f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wu native_create_display 422f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wu}; 423f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wu 424f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wuconst struct native_platform * 42573df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wunative_get_gdi_platform(const struct native_event_handler *event_handler) 426f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wu{ 42773df31eedd0f33c8a9907855cb247c8f87964c48Chia-I Wu gdi_event_handler = event_handler; 428f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wu return &gdi_platform; 429f66a4e20c19d55005854bbee312947ec16e287e3Chia-I Wu} 430