1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Windows (Win32/Win64) device driver for Mesa 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "wmesadef.h" 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "colors.h" 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "GL/wmesa.h" 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <winuser.h> 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h" 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/extensions.h" 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/framebuffer.h" 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/renderbuffer.h" 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h" 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/driverfuncs.h" 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/meta.h" 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo/vbo.h" 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/swrast.h" 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_renderbuffer.h" 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast_setup/swrast_setup.h" 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/tnl.h" 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_context.h" 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_pipeline.h" 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* linked list of our Framebuffers (windows) */ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic WMesaFramebuffer FirstFramebuffer = NULL; 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new WMesaFramebuffer object which will correspond to the 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * given HDC (Window handle). 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic WMesaFramebuffer 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_new_framebuffer(HDC hdc, struct gl_config *visual) 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = (WMesaFramebuffer) malloc(sizeof(struct wmesa_framebuffer)); 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pwfb) { 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_initialize_window_framebuffer(&pwfb->Base, visual); 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->hDC = hdc; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* insert at head of list */ 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->next = FirstFramebuffer; 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FirstFramebuffer = pwfb; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pwfb; 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given an hdc, free the corresponding WMesaFramebuffer 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_free_framebuffer(HDC hdc) 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb, prev; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (pwfb = FirstFramebuffer; pwfb; pwfb = pwfb->next) { 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pwfb->hDC == hdc) 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prev = pwfb; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pwfb) { 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_framebuffer *fb; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pwfb == FirstFramebuffer) 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FirstFramebuffer = pwfb->next; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prev->next = pwfb->next; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb = &pwfb->Base; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_reference_framebuffer(&fb, NULL); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given an hdc, return the corresponding WMesaFramebuffer 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic WMesaFramebuffer 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_lookup_framebuffer(HDC hdc) 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (pwfb = FirstFramebuffer; pwfb; pwfb = pwfb->next) { 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pwfb->hDC == hdc) 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pwfb; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given a struct gl_framebuffer, return the corresponding WMesaFramebuffer. 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic WMesaFramebuffer wmesa_framebuffer(struct gl_framebuffer *fb) 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (WMesaFramebuffer) fb; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given a struct gl_context, return the corresponding WMesaContext. 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic WMesaContext wmesa_context(const struct gl_context *ctx) 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (WMesaContext) ctx; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Every driver should implement a GetString function in order to 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * return a meaningful GL_RENDERER string. 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLubyte *wmesa_get_string(struct gl_context *ctx, GLenum name) 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (name == GL_RENDERER) ? 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (GLubyte *) "Mesa Windows GDI Driver" : NULL; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Determine the pixel format based on the pixel size. 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void wmSetPixelFormat(WMesaFramebuffer pwfb, HDC hDC) 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->cColorBits = GetDeviceCaps(hDC, BITSPIXEL); 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Only 16 and 32 bit targets are supported now */ 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(pwfb->cColorBits == 0 || 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->cColorBits == 16 || 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->cColorBits == 24 || 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->cColorBits == 32); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(pwfb->cColorBits){ 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 8: 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->pixelformat = PF_INDEX8; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->pixelformat = PF_5R6G5B; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 24: 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 32: 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->pixelformat = PF_8R8G8B; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->pixelformat = PF_BADFORMAT; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create DIB for back buffer. 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We write into this memory with the span routines and then blit it 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the window on a buffer swap. 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic BOOL wmCreateBackingStore(WMesaFramebuffer pwfb, long lxSize, long lySize) 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPBITMAPINFO pbmi = &(pwfb->bmi); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HDC hic; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbmi->bmiHeader.biWidth = lxSize; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbmi->bmiHeader.biHeight= -lySize; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbmi->bmiHeader.biPlanes = 1; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbmi->bmiHeader.biBitCount = GetDeviceCaps(pwfb->hDC, BITSPIXEL); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbmi->bmiHeader.biCompression = BI_RGB; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbmi->bmiHeader.biSizeImage = 0; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbmi->bmiHeader.biXPelsPerMeter = 0; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbmi->bmiHeader.biYPelsPerMeter = 0; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbmi->bmiHeader.biClrUsed = 0; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pbmi->bmiHeader.biClrImportant = 0; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->cColorBits = pbmi->bmiHeader.biBitCount; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->ScanWidth = (lxSize * (pwfb->cColorBits / 8) + 3) & ~3; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hic = CreateIC("display", NULL, NULL, NULL); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->dib_hDC = CreateCompatibleDC(hic); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->hbmDIB = CreateDIBSection(hic, 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &pwfb->bmi, 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DIB_RGB_COLORS, 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void **)&(pwfb->pbPixels), 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->hOldBitmap = SelectObject(pwfb->dib_hDC, pwfb->hbmDIB); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DeleteDC(hic); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wmSetPixelFormat(pwfb, pwfb->hDC); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void wmDeleteBackingStore(WMesaFramebuffer pwfb) 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pwfb->hbmDIB) { 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SelectObject(pwfb->dib_hDC, pwfb->hOldBitmap); 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DeleteDC(pwfb->dib_hDC); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DeleteObject(pwfb->hbmDIB); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Find the width and height of the window named by hdc. 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_window_size(HDC hdc, GLuint *width, GLuint *height) 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (WindowFromDC(hdc)) { 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RECT rect; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetClientRect(WindowFromDC(hdc), &rect); 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = rect.right - rect.left; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = rect.bottom - rect.top; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { /* Memory context */ 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* From contributed code - use the size of the desktop 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for the size of a memory context (?) */ 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = GetDeviceCaps(hdc, HORZRES); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = GetDeviceCaps(hdc, VERTRES); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_get_buffer_size(struct gl_framebuffer *buffer, GLuint *width, GLuint *height) 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(buffer); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_window_size(pwfb->hDC, width, height); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void wmesa_flush(struct gl_context *ctx) 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->WinSysDrawBuffer); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Visual.doubleBufferMode == 1) { 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BitBlt(pwfb->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height, 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->dib_hDC, 0, 0, SRCCOPY); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Do nothing for single buffer */ 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** CLEAR Functions *****/ 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Clear the color/depth/stencil buffers. 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void clear(struct gl_context *ctx, GLbitfield mask) 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FLIP(Y) (ctx->DrawBuffer->Height - (Y) - 1) 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint x = ctx->DrawBuffer->_Xmin; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint y = ctx->DrawBuffer->_Ymin; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint height = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint width = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaContext pwc = wmesa_context(ctx); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int done = 0; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Let swrast do all the work if the masks are not set to 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * clear all channels. */ 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Color.ColorMask[0][0] || 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !ctx->Color.ColorMask[0][1] || 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !ctx->Color.ColorMask[0][2] || 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !ctx->Color.ColorMask[0][3]) { 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_Clear(ctx, mask); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & BUFFER_BITS_COLOR) { 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* setup the clearing color */ 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union gl_color_union color = ctx->Color.ClearColor; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte col[3]; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_UBYTE(col[0], color.f[0]); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_UBYTE(col[1], color.f[1]); 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_UBYTE(col[2], color.f[2]); 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwc->clearColorRef = RGB(col[0], col[1], col[2]); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DeleteObject(pwc->clearPen); 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DeleteObject(pwc->clearBrush); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwc->clearPen = CreatePen(PS_SOLID, 1, pwc->clearColorRef); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwc->clearBrush = CreateSolidBrush(pwc->clearColorRef); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Back buffer */ 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & BUFFER_BIT_BACK_LEFT) { 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, rowSize; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UINT bytesPerPixel = pwfb->cColorBits / 8; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPBYTE lpb, clearRow; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPWORD lpw; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BYTE bColor; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WORD wColor; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BYTE r, g, b; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DWORD dwColor; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPDWORD lpdw; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Try for a fast clear - clearing entire buffer with a single 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * byte value. */ 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width == ctx->DrawBuffer->Width && 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height == ctx->DrawBuffer->Height) { /* entire buffer */ 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Now check for an easy clear value */ 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (bytesPerPixel) { 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bColor = BGR8(GetRValue(pwc->clearColorRef), 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetGValue(pwc->clearColorRef), 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetBValue(pwc->clearColorRef)); 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(pwfb->pbPixels, bColor, 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->ScanWidth * height); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org done = 1; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wColor = BGR16(GetRValue(pwc->clearColorRef), 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetGValue(pwc->clearColorRef), 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetBValue(pwc->clearColorRef)); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (((wColor >> 8) & 0xff) == (wColor & 0xff)) { 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(pwfb->pbPixels, wColor & 0xff, 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->ScanWidth * height); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org done = 1; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall through */ 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (GetRValue(pwc->clearColorRef) == 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetGValue(pwc->clearColorRef) && 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetRValue(pwc->clearColorRef) == 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetBValue(pwc->clearColorRef)) { 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(pwfb->pbPixels, 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetRValue(pwc->clearColorRef), 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->ScanWidth * height); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org done = 1; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } /* all */ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!done) { 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Need to clear a row at a time. Begin by setting the first 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * row in the area to be cleared to the clear color. */ 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clearRow = pwfb->pbPixels + 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->ScanWidth * FLIP(y) + 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytesPerPixel * x; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (bytesPerPixel) { 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpb = clearRow; 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bColor = BGR8(GetRValue(pwc->clearColorRef), 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetGValue(pwc->clearColorRef), 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetBValue(pwc->clearColorRef)); 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(lpb, bColor, width); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpw = (LPWORD)clearRow; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wColor = BGR16(GetRValue(pwc->clearColorRef), 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetGValue(pwc->clearColorRef), 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetBValue(pwc->clearColorRef)); 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<width; i++) 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *lpw++ = wColor; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpb = clearRow; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = GetRValue(pwc->clearColorRef); 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org g = GetGValue(pwc->clearColorRef); 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = GetBValue(pwc->clearColorRef); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<width; i++) { 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *lpb++ = b; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *lpb++ = g; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *lpb++ = r; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpdw = (LPDWORD)clearRow; 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dwColor = BGR32(GetRValue(pwc->clearColorRef), 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetGValue(pwc->clearColorRef), 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GetBValue(pwc->clearColorRef)); 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<width; i++) 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *lpdw++ = dwColor; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } /* switch */ 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* copy cleared row to other rows in buffer */ 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpb = clearRow - pwfb->ScanWidth; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rowSize = width * bytesPerPixel; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=1; i<height; i++) { 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(lpb, clearRow, rowSize); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpb -= pwfb->ScanWidth; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } /* not done */ 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask &= ~BUFFER_BIT_BACK_LEFT; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } /* back buffer */ 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* front buffer */ 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & BUFFER_BIT_FRONT_LEFT) { 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HDC DC = pwc->hDC; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HPEN Old_Pen = SelectObject(DC, pwc->clearPen); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HBRUSH Old_Brush = SelectObject(DC, pwc->clearBrush); 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Rectangle(DC, 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLIP(y) + 1, 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x + width + 1, 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLIP(y) - height + 1); 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SelectObject(DC, Old_Pen); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SelectObject(DC, Old_Brush); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask &= ~BUFFER_BIT_FRONT_LEFT; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } /* front buffer */ 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Call swrast if there is anything left to clear (like DEPTH) */ 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask) 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_Clear(ctx, mask); 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef FLIP 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** PIXEL Functions *****/ 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FLIP(Y) (rb->Height - (Y) - 1) 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** Front Buffer reading/writing 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ** These are slow, but work with all non-indexed visual types. 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **/ 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write a horizontal span of RGBA color pixels with a boolean mask. */ 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_span_front(struct gl_context *ctx, 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, GLint x, GLint y, 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *values, 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *mask) 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaContext pwc = wmesa_context(ctx); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_lookup_framebuffer(pwc->hDC); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HBITMAP bmp=0; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HDC mdc=0; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org typedef union 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned b:8, g:8, r:8, a:8; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } BGRA; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BGRA *bgra, c; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (n < 16) { // the value 16 is just guessed 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y=FLIP(y); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask) { 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask[i]) 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetPixel(pwc->hDC, x+i, y, 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RGB(rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP])); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetPixel(pwc->hDC, x+i, y, 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RGB(rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP])); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!pwfb) { 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "wmesa: write_rgba_span_front on unknown hdc"); 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bgra=malloc(n*sizeof(BGRA)); 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!bgra) { 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "wmesa: write_rgba_span_front: out of memory"); 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.a=0; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask) { 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) { 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask[i]) { 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.r=rgba[i][RCOMP]; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.g=rgba[i][GCOMP]; 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.b=rgba[i][BCOMP]; 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.a=rgba[i][ACOMP]; 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bgra[i]=c; 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bgra[i].i=0; 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) { 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.r=rgba[i][RCOMP]; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.g=rgba[i][GCOMP]; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.b=rgba[i][BCOMP]; 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c.a=rgba[i][ACOMP]; 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bgra[i]=c; 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bmp=CreateBitmap(n, 1, 1, 32, bgra); 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mdc=CreateCompatibleDC(pwfb->hDC); 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SelectObject(mdc, bmp); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y=FLIP(y); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BitBlt(pwfb->hDC, x, y, n, 1, mdc, 0, 0, SRCCOPY); 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SelectObject(mdc, 0); 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DeleteObject(bmp); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DeleteDC(mdc); 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(bgra); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write an array of RGBA pixels with a boolean mask. */ 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_pixels_front(struct gl_context *ctx, 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint x[], const GLint y[], 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *values, 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *mask) 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaContext pwc = wmesa_context(ctx); 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask[i]) 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SetPixel(pwc->hDC, x[i], FLIP(y[i]), 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RGB(rgba[i][RCOMP], rgba[i][GCOMP], 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP])); 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read a horizontal span of color pixels. */ 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_span_front(struct gl_context *ctx, 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, GLint x, GLint y, 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *values) 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte (*rgba)[4] = (GLubyte (*)[4])values; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaContext pwc = wmesa_context(ctx); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COLORREF Color; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y = FLIP(y); 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) { 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Color = GetPixel(pwc->hDC, x+i, y); 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP] = GetRValue(Color); 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = GetGValue(Color); 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = GetBValue(Color); 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][ACOMP] = 255; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read an array of color pixels. */ 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_pixels_front(struct gl_context *ctx, 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, const GLint x[], const GLint y[], 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *values) 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte (*rgba)[4] = (GLubyte (*)[4])values; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaContext pwc = wmesa_context(ctx); 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COLORREF Color; 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) { 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint y2 = FLIP(y[i]); 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Color = GetPixel(pwc->hDC, x[i], y2); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP] = GetRValue(Color); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = GetGValue(Color); 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = GetBValue(Color); 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][ACOMP] = 255; 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************/ 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DOUBLE BUFFER 32-bit */ 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define WMSETPIXEL32(pwc, y, x, r, g, b) { \ 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLPDWORD lpdw = ((LPDWORD)((pwc)->pbPixels + (pwc)->ScanWidth * (y)) + (x)); \ 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*lpdw = BGR32((r),(g),(b)); } 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write a horizontal span of RGBA color pixels with a boolean mask. */ 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_span_32(struct gl_context *ctx, 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, GLint x, GLint y, 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *values, 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *mask) 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values; 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPDWORD lpdw; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y=FLIP(y); 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpdw = ((LPDWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x; 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask) { 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask[i]) 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpdw[i] = BGR32(rgba[i][RCOMP], rgba[i][GCOMP], 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *lpdw++ = BGR32(rgba[i][RCOMP], rgba[i][GCOMP], 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write an array of RGBA pixels with a boolean mask. */ 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_pixels_32(struct gl_context *ctx, 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, const GLint x[], const GLint y[], 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *values, 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *mask) 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask[i]) 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMSETPIXEL32(pwfb, FLIP(y[i]), x[i], 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read a horizontal span of color pixels. */ 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_span_32(struct gl_context *ctx, 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, GLint x, GLint y, 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *values) 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte (*rgba)[4] = (GLubyte (*)[4])values; 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DWORD pixel; 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPDWORD lpdw; 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y = FLIP(y); 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpdw = ((LPDWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x; 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) { 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pixel = lpdw[i]; 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP] = (GLubyte)((pixel & 0x00ff0000) >> 16); 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = (GLubyte)((pixel & 0x0000ff00) >> 8); 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = (GLubyte)(pixel & 0x000000ff); 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][ACOMP] = 255; 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read an array of color pixels. */ 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_pixels_32(struct gl_context *ctx, 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, const GLint x[], const GLint y[], 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *values) 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte (*rgba)[4] = (GLubyte (*)[4])values; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DWORD pixel; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPDWORD lpdw; 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) { 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint y2 = FLIP(y[i]); 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpdw = ((LPDWORD)(pwfb->pbPixels + pwfb->ScanWidth * y2)) + x[i]; 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pixel = *lpdw; 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP] = (GLubyte)((pixel & 0x00ff0000) >> 16); 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = (GLubyte)((pixel & 0x0000ff00) >> 8); 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = (GLubyte)(pixel & 0x000000ff); 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][ACOMP] = 255; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************/ 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DOUBLE BUFFER 24-bit */ 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define WMSETPIXEL24(pwc, y, x, r, g, b) { \ 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLPBYTE lpb = ((LPBYTE)((pwc)->pbPixels + (pwc)->ScanWidth * (y)) + (3 * x)); \ 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglpb[0] = (b); \ 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglpb[1] = (g); \ 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglpb[2] = (r); } 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write a horizontal span of RGBA color pixels with a boolean mask. */ 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_span_24(struct gl_context *ctx, 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, GLint x, GLint y, 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *values, 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *mask) 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values; 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPBYTE lpb; 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y=FLIP(y); 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpb = ((LPBYTE)(pwfb->pbPixels + pwfb->ScanWidth * y)) + (3 * x); 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask) { 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask[i]) { 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpb[3*i] = rgba[i][BCOMP]; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpb[3*i+1] = rgba[i][GCOMP]; 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpb[3*i+2] = rgba[i][RCOMP]; 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) { 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *lpb++ = rgba[i][BCOMP]; 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *lpb++ = rgba[i][GCOMP]; 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *lpb++ = rgba[i][RCOMP]; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write an array of RGBA pixels with a boolean mask. */ 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_pixels_24(struct gl_context *ctx, 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, const GLint x[], const GLint y[], 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *values, 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *mask) 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values; 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask[i]) 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMSETPIXEL24(pwfb, FLIP(y[i]), x[i], 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read a horizontal span of color pixels. */ 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_span_24(struct gl_context *ctx, 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, GLint x, GLint y, 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *values) 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte (*rgba)[4] = (GLubyte (*)[4])values; 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPBYTE lpb; 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y = FLIP(y); 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpb = ((LPBYTE)(pwfb->pbPixels + pwfb->ScanWidth * y)) + (3 * x); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) { 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP] = lpb[3*i+2]; 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = lpb[3*i+1]; 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = lpb[3*i]; 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][ACOMP] = 255; 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read an array of color pixels. */ 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_pixels_24(struct gl_context *ctx, 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, const GLint x[], const GLint y[], 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *values) 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte (*rgba)[4] = (GLubyte (*)[4])values; 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPBYTE lpb; 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) { 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint y2 = FLIP(y[i]); 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpb = ((LPBYTE)(pwfb->pbPixels + pwfb->ScanWidth * y2)) + (3 * x[i]); 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP] = lpb[3*i+2]; 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = lpb[3*i+1]; 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = lpb[3*i]; 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][ACOMP] = 255; 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************/ 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DOUBLE BUFFER 16-bit */ 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define WMSETPIXEL16(pwc, y, x, r, g, b) { \ 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLPWORD lpw = ((LPWORD)((pwc)->pbPixels + (pwc)->ScanWidth * (y)) + (x)); \ 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*lpw = BGR16((r),(g),(b)); } 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write a horizontal span of RGBA color pixels with a boolean mask. */ 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_span_16(struct gl_context *ctx, 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, GLint x, GLint y, 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *values, 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *mask) 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values; 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPWORD lpw; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y=FLIP(y); 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpw = ((LPWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x; 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask) { 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask[i]) 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpw[i] = BGR16(rgba[i][RCOMP], rgba[i][GCOMP], 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *lpw++ = BGR16(rgba[i][RCOMP], rgba[i][GCOMP], 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP]); 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Write an array of RGBA pixels with a boolean mask. */ 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void write_rgba_pixels_16(struct gl_context *ctx, 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, const GLint x[], const GLint y[], 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *values, 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *mask) 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte (*rgba)[4] = (const GLubyte (*)[4])values; 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask[i]) 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMSETPIXEL16(pwfb, FLIP(y[i]), x[i], 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read a horizontal span of color pixels. */ 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_span_16(struct gl_context *ctx, 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, GLint x, GLint y, 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *values) 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte (*rgba)[4] = (GLubyte (*)[4])values; 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i, pixel; 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPWORD lpw; 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y = FLIP(y); 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpw = ((LPWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x; 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) { 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pixel = lpw[i]; 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Windows uses 5,5,5 for 16-bit */ 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP] = (pixel & 0x7c00) >> 7; 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = (pixel & 0x03e0) >> 2; 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = (pixel & 0x001f) << 3; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][ACOMP] = 255; 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Read an array of color pixels. */ 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void read_rgba_pixels_16(struct gl_context *ctx, 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n, const GLint x[], const GLint y[], 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *values) 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte (*rgba)[4] = (GLubyte (*)[4])values; 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i, pixel; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPWORD lpw; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer); 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<n; i++) { 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint y2 = FLIP(y[i]); 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lpw = ((LPWORD)(pwfb->pbPixels + pwfb->ScanWidth * y2)) + x[i]; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pixel = *lpw; 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Windows uses 5,5,5 for 16-bit */ 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][RCOMP] = (pixel & 0x7c00) >> 7; 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][GCOMP] = (pixel & 0x03e0) >> 2; 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][BCOMP] = (pixel & 0x001f) << 3; 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i][ACOMP] = 255; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** BUFFER Functions *****/ 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb) 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_delete_renderbuffer(ctx, rb); 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is called by Mesa whenever it determines that the window size 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * has changed. Do whatever's needed to cope with that. 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_renderbuffer_storage(struct gl_context *ctx, 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum internalFormat, 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint width, 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint height) 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Width = width; 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Height = height; 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by ctx->Driver.ResizeBuffers() 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Resize the front/back colorbuffers to match the latest window size. 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_resize_buffers(struct gl_context *ctx, struct gl_framebuffer *buffer, 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint width, GLuint height) 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_framebuffer(buffer); 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pwfb->Base.Width != width || pwfb->Base.Height != height) { 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Realloc back buffer */ 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Visual.doubleBufferMode == 1) { 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wmDeleteBackingStore(pwfb); 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wmCreateBackingStore(pwfb, width, height); 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_resize_framebuffer(ctx, buffer, width, height); 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by glViewport. 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a good time for us to poll the current window size and adjust 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * our renderbuffers to match the current window size. 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Remember, we have no opportunity to respond to conventional 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * resize events since the driver has no event loop. 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Thus, we poll. 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MakeCurrent also ends up making a call here, so that ensures 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we get the viewport set correctly, even if the app does not call 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glViewport and relies on the defaults. 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void wmesa_viewport(struct gl_context *ctx, 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint x, GLint y, 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height) 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint new_width, new_height; 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wmesa_get_buffer_size(ctx->WinSysDrawBuffer, &new_width, &new_height); 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Resize buffers if the window size changed. 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wmesa_resize_buffers(ctx, ctx->WinSysDrawBuffer, new_width, new_height); 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->NewState |= _NEW_BUFFERS; /* to update scissor / window bounds */ 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called when the driver should update it's state, based on the new_state 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * flags. 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void wmesa_update_state(struct gl_context *ctx, GLuint new_state) 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_InvalidateState(ctx, new_state); 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swsetup_InvalidateState(ctx, new_state); 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _vbo_InvalidateState(ctx, new_state); 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_InvalidateState(ctx, new_state); 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO - This code is not complete yet because I 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * don't know what to do for all state updates. 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (new_state & _NEW_BUFFERS) { 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** WMESA Functions *****/ 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgWMesaContext WMesaCreateContext(HDC hDC, 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HPALETTE* Pal, 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean rgb_flag, 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean db_flag, 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean alpha_flag) 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaContext c; 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dd_function_table functions; 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint red_bits, green_bits, blue_bits, alpha_bits; 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx; 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_config *visual; 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) Pal; 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Indexed mode not supported */ 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rgb_flag) 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Allocate wmesa context */ 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = CALLOC_STRUCT(wmesa_context); 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!c) 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* I do not understand this contributed code */ 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Support memory and device contexts */ 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(WindowFromDC(hDC) != NULL) { 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->hDC = GetDC(WindowFromDC(hDC)); /* huh ???? */ 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->hDC = hDC; 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->hDC = hDC; 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Get data for visual */ 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Dealing with this is actually a bit of overkill because Mesa will end 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * up treating all color component size requests less than 8 by using 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a single byte per channel. In addition, the interface to the span 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * routines passes colors as an entire byte per channel anyway, so there 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is nothing to be saved by telling the visual to be 16 bits if the device 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is 16 bits. That is, Mesa is going to compute colors down to 8 bits per 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * channel anyway. 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * But we go through the motions here anyway. 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (GetDeviceCaps(c->hDC, BITSPIXEL)) { 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org red_bits = green_bits = blue_bits = 5; 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha_bits = 0; 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org red_bits = green_bits = blue_bits = 8; 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha_bits = 8; 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create visual based on flags */ 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org visual = _mesa_create_visual(db_flag, /* db_flag */ 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_FALSE, /* stereo */ 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org red_bits, green_bits, blue_bits, /* color RGB */ 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha_flag ? alpha_bits : 0, /* color A */ 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DEFAULT_SOFTWARE_DEPTH_BITS, /* depth_bits */ 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 8, /* stencil_bits */ 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 16,16,16, /* accum RGB */ 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha_flag ? 16 : 0, /* accum A */ 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1); /* num samples */ 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!visual) { 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(c); 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up driver functions */ 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_init_driver_functions(&functions); 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions.GetString = wmesa_get_string; 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions.UpdateState = wmesa_update_state; 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions.GetBufferSize = wmesa_get_buffer_size; 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions.Flush = wmesa_flush; 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions.Clear = clear; 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions.ResizeBuffers = wmesa_resize_buffers; 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions.Viewport = wmesa_viewport; 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* initialize the Mesa context data */ 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx = &c->gl_ctx; 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_initialize_context(ctx, API_OPENGL, visual, 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, &functions, (void *)c); 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* visual no longer needed - it was copied by _mesa_initialize_context() */ 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_destroy_visual(visual); 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_sw_extensions(ctx); 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_1_3_extensions(ctx); 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_1_4_extensions(ctx); 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_1_5_extensions(ctx); 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_2_0_extensions(ctx); 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_2_1_extensions(ctx); 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_meta_init(ctx); 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Initialize the software rasterizer and helper modules. */ 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_swrast_CreateContext(ctx) || 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !_vbo_CreateContext(ctx) || 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !_tnl_CreateContext(ctx) || 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !_swsetup_CreateContext(ctx)) { 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_free_context_data(ctx); 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(c); 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swsetup_Wakeup(ctx); 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNL_CONTEXT(ctx)->Driver.RunPipeline = _tnl_run_pipeline; 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return c; 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid WMesaDestroyContext( WMesaContext pwc ) 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = &pwc->gl_ctx; 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb; 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(cur_ctx); 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cur_ctx == ctx) { 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* unbind current if deleting current context */ 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaMakeCurrent(NULL, NULL); 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clean up frame buffer resources */ 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb = wmesa_lookup_framebuffer(pwc->hDC); 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pwfb) { 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Visual.doubleBufferMode == 1) 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wmDeleteBackingStore(pwfb); 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wmesa_free_framebuffer(pwc->hDC); 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Release for device, not memory contexts */ 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (WindowFromDC(pwc->hDC) != NULL) 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ReleaseDC(WindowFromDC(pwc->hDC), pwc->hDC); 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DeleteObject(pwc->clearPen); 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DeleteObject(pwc->clearBrush); 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_meta_free(ctx); 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swsetup_DestroyContext(ctx); 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_DestroyContext(ctx); 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _vbo_DestroyContext(ctx); 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_DestroyContext(ctx); 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_free_context_data(ctx); 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(pwc); 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new color renderbuffer. 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_renderbuffer * 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwmesa_new_renderbuffer(void) 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb = CALLOC_STRUCT(gl_renderbuffer); 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rb) 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_init_renderbuffer(rb, (GLuint)0); 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->_BaseFormat = GL_RGBA; 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->InternalFormat = GL_RGBA; 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Delete = wmesa_delete_renderbuffer; 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->AllocStorage = wmesa_renderbuffer_storage; 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return rb; 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid WMesaMakeCurrent(WMesaContext c, HDC hdc) 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb; 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* return if already current */ 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaContext pwc = wmesa_context(ctx); 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pwc && c == pwc && pwc->hDC == hdc) 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb = wmesa_lookup_framebuffer(hdc); 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Lazy creation of framebuffers */ 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c && !pwfb && hdc) { 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb; 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_config *visual = &c->gl_ctx.Visual; 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint width, height; 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_window_size(hdc, &width, &height); 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->clearPen = CreatePen(PS_SOLID, 1, 0); 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->clearBrush = CreateSolidBrush(0); 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb = wmesa_new_framebuffer(hdc, visual); 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create back buffer if double buffered */ 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (visual->doubleBufferMode == 1) { 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wmCreateBackingStore(pwfb, width, height); 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* make render buffers */ 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (visual->doubleBufferMode == 1) { 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb = wmesa_new_renderbuffer(); 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_add_renderbuffer(&pwfb->Base, BUFFER_BACK_LEFT, rb); 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb = wmesa_new_renderbuffer(); 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_add_renderbuffer(&pwfb->Base, BUFFER_FRONT_LEFT, rb); 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Let Mesa own the Depth, Stencil, and Accum buffers */ 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_add_soft_renderbuffers(&pwfb->Base, 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_FALSE, /* color */ 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org visual->depthBits > 0, 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org visual->stencilBits > 0, 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org visual->accumRedBits > 0, 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org visual->alphaBits >0, 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_FALSE); 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c && pwfb) 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_make_current(&c->gl_ctx, &pwfb->Base, &pwfb->Base); 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_make_current(NULL, NULL, NULL); 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid WMesaSwapBuffers( HDC hdc ) 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaContext pwc = wmesa_context(ctx); 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WMesaFramebuffer pwfb = wmesa_lookup_framebuffer(hdc); 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!pwfb) { 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "wmesa: swapbuffers on unknown hdc"); 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we're swapping the buffer associated with the current context 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we have to flush any pending rendering commands first. 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pwc->hDC == hdc) { 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_notifySwapBuffers(ctx); 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BitBlt(pwfb->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height, 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pwfb->dib_hDC, 0, 0, SRCCOPY); 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX for now only allow swapping current window */ 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "wmesa: can't swap non-current window"); 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid WMesaShareLists(WMesaContext ctx_to_share, WMesaContext ctx) 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_share_state(&ctx->gl_ctx, &ctx_to_share->gl_ctx); 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1265