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