19077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz/********************************************************** 29077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * Copyright 2007-2009 VMware, Inc. All rights reserved. 39077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * 49077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * Permission is hereby granted, free of charge, to any person 59077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * obtaining a copy of this software and associated documentation 69077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * files (the "Software"), to deal in the Software without 79077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * restriction, including without limitation the rights to use, copy, 89077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies 99077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * of the Software, and to permit persons to whom the Software is 109077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * furnished to do so, subject to the following conditions: 119077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * 129077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * The above copyright notice and this permission notice shall be 139077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * included in all copies or substantial portions of the Software. 149077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * 159077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 169077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 179077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 189077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 199077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 209077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 219077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 229077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * SOFTWARE. 239077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * 249077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz **********************************************************/ 259077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 269077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz/* 279077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * svga_overlay.h -- 289077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * 299077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * Definitions for video-overlay support. 309077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz */ 319077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 329077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz#ifndef _SVGA_OVERLAY_H_ 339077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz#define _SVGA_OVERLAY_H_ 349077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 359077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz#include "svga_reg.h" 369077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 379077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz/* 389077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * Video formats we support 399077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz */ 409077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 419077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz#define VMWARE_FOURCC_YV12 0x32315659 // 'Y' 'V' '1' '2' 429077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz#define VMWARE_FOURCC_YUY2 0x32595559 // 'Y' 'U' 'Y' '2' 439077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz#define VMWARE_FOURCC_UYVY 0x59565955 // 'U' 'Y' 'V' 'Y' 449077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 459077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantztypedef enum { 469077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz SVGA_OVERLAY_FORMAT_INVALID = 0, 479077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz SVGA_OVERLAY_FORMAT_YV12 = VMWARE_FOURCC_YV12, 489077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz SVGA_OVERLAY_FORMAT_YUY2 = VMWARE_FOURCC_YUY2, 499077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz SVGA_OVERLAY_FORMAT_UYVY = VMWARE_FOURCC_UYVY, 509077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz} SVGAOverlayFormat; 519077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 529077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz#define SVGA_VIDEO_COLORKEY_MASK 0x00ffffff 539077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 549077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz#define SVGA_ESCAPE_VMWARE_VIDEO 0x00020000 559077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 569077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz#define SVGA_ESCAPE_VMWARE_VIDEO_SET_REGS 0x00020001 579077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz /* FIFO escape layout: 589077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * Type, Stream Id, (Register Id, Value) pairs */ 599077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 609077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz#define SVGA_ESCAPE_VMWARE_VIDEO_FLUSH 0x00020002 619077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz /* FIFO escape layout: 629077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * Type, Stream Id */ 639077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 649077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantztypedef 659077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantzstruct SVGAEscapeVideoSetRegs { 669077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz struct { 679077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 cmdType; 689077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 streamId; 699077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz } header; 709077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 719077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz // May include zero or more items. 729077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz struct { 739077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 registerId; 749077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 value; 759077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz } items[1]; 769077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz} SVGAEscapeVideoSetRegs; 779077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 789077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantztypedef 799077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantzstruct SVGAEscapeVideoFlush { 809077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 cmdType; 819077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 streamId; 829077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz} SVGAEscapeVideoFlush; 839077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 849077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 859077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz/* 869077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * Struct definitions for the video overlay commands built on 879077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * SVGAFifoCmdEscape. 889077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz */ 899077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantztypedef 909077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantzstruct { 919077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 command; 929077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 overlay; 939077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz} SVGAFifoEscapeCmdVideoBase; 949077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 959077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantztypedef 969077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantzstruct { 979077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz SVGAFifoEscapeCmdVideoBase videoCmd; 989077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz} SVGAFifoEscapeCmdVideoFlush; 999077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1009077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantztypedef 1019077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantzstruct { 1029077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz SVGAFifoEscapeCmdVideoBase videoCmd; 1039077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz struct { 1049077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 regId; 1059077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 value; 1069077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz } items[1]; 1079077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz} SVGAFifoEscapeCmdVideoSetRegs; 1089077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1099077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantztypedef 1109077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantzstruct { 1119077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz SVGAFifoEscapeCmdVideoBase videoCmd; 1129077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz struct { 1139077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 regId; 1149077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 value; 1159077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz } items[SVGA_VIDEO_NUM_REGS]; 1169077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz} SVGAFifoEscapeCmdVideoSetAllRegs; 1179077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1189077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1199077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz/* 1209077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz *---------------------------------------------------------------------- 1219077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * 1229077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * VMwareVideoGetAttributes -- 1239077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * 1249077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * Computes the size, pitches and offsets for YUV frames. 1259077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * 1269077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * Results: 1279077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * TRUE on success; otherwise FALSE on failure. 1289077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * 1299077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * Side effects: 1309077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * Pitches and offsets for the given YUV frame are put in 'pitches' 1319077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * and 'offsets' respectively. They are both optional though. 1329077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz * 1339077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz *---------------------------------------------------------------------- 1349077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz */ 1359077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1369077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantzstatic INLINE Bool 1379077ddaa2557e1e76c8a052c8d079ef3d443186bJakob BornecrantzVMwareVideoGetAttributes(const SVGAOverlayFormat format, // IN 1389077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 *width, // IN / OUT 1399077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 *height, // IN / OUT 1409077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 *size, // OUT 1419077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 *pitches, // OUT (optional) 1429077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz uint32 *offsets) // OUT (optional) 1439077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz{ 1449077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz int tmp; 1459077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1469077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz *width = (*width + 1) & ~1; 1479077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1489077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz if (offsets) { 1499077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz offsets[0] = 0; 1509077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz } 1519077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1529077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz switch (format) { 1539077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz case VMWARE_FOURCC_YV12: 1549077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz *height = (*height + 1) & ~1; 1559077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz *size = (*width + 3) & ~3; 1569077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1579077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz if (pitches) { 1589077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz pitches[0] = *size; 1599077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz } 1609077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1619077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz *size *= *height; 1629077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1639077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz if (offsets) { 1649077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz offsets[1] = *size; 1659077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz } 1669077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1679077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz tmp = ((*width >> 1) + 3) & ~3; 1689077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1699077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz if (pitches) { 1709077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz pitches[1] = pitches[2] = tmp; 1719077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz } 1729077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1739077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz tmp *= (*height >> 1); 1749077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz *size += tmp; 1759077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1769077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz if (offsets) { 1779077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz offsets[2] = *size; 1789077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz } 1799077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1809077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz *size += tmp; 1819077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz break; 1829077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1839077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz case VMWARE_FOURCC_YUY2: 1849077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz case VMWARE_FOURCC_UYVY: 1859077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz *size = *width * 2; 1869077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1879077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz if (pitches) { 1889077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz pitches[0] = *size; 1899077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz } 1909077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1919077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz *size *= *height; 1929077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz break; 1939077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1949077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz default: 1959077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz return FALSE; 1969077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz } 1979077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 1989077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz return TRUE; 1999077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz} 2009077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz 2019077ddaa2557e1e76c8a052c8d079ef3d443186bJakob Bornecrantz#endif // _SVGA_OVERLAY_H_ 202