summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2009-10-06 16:30:08 -0700
committerEric Anholt <eric@anholt.net>2009-10-06 17:10:31 -0700
commit8ae0e44e42db645abe6d385f561260d2ae4a1960 (patch)
tree2002c65e2d302a32ec5d0b19a8708c3c7264b7c6
parentb9b159c49854d8d9d2207946bb583537bb0d48d6 (diff)
Move to kernel coding style.
We've talked about doing this since the start of the project, putting it off until "some convenient time". Just after removing a third of the driver seems like a convenient time, when backporting's probably not happening much anyway.
-rw-r--r--src/bios_reader/bios_dumper.c93
-rw-r--r--src/bios_reader/bios_reader.c880
-rw-r--r--src/bios_reader/swf_dumper.c96
-rw-r--r--src/i830.h643
-rw-r--r--src/i830_3d.c403
-rw-r--r--src/i830_accel.c168
-rw-r--r--src/i830_batchbuffer.c160
-rw-r--r--src/i830_batchbuffer.h125
-rw-r--r--src/i830_bios.c553
-rw-r--r--src/i830_bios.h479
-rw-r--r--src/i830_common.h105
-rw-r--r--src/i830_debug.c2811
-rw-r--r--src/i830_debug.h3
-rw-r--r--src/i830_display.h8
-rw-r--r--src/i830_dri.c569
-rw-r--r--src/i830_dri.h54
-rw-r--r--src/i830_driver.c2268
-rw-r--r--src/i830_hwmc.c218
-rw-r--r--src/i830_hwmc.h59
-rw-r--r--src/i830_memory.c917
-rw-r--r--src/i830_reg.h33
-rw-r--r--src/i830_render.c1251
-rw-r--r--src/i830_uxa.c1012
-rw-r--r--src/i830_video.c2683
-rw-r--r--src/i830_video.h70
-rw-r--r--src/i915_3d.c144
-rw-r--r--src/i915_3d.h293
-rw-r--r--src/i915_hwmc.c1401
-rw-r--r--src/i915_hwmc.h28
-rw-r--r--src/i915_reg.h158
-rw-r--r--src/i915_render.c1277
-rw-r--r--src/i915_video.c769
-rw-r--r--src/i965_hwmc.c310
-rw-r--r--src/i965_hwmc.h36
-rw-r--r--src/i965_render.c2943
-rw-r--r--src/i965_video.c1933
-rw-r--r--src/reg_dumper/audio.c548
-rw-r--r--src/reg_dumper/gtt.c15
-rw-r--r--src/reg_dumper/hotplug.c199
-rw-r--r--src/reg_dumper/idle.c328
-rw-r--r--src/reg_dumper/lid.c166
-rw-r--r--src/reg_dumper/main.c132
-rw-r--r--src/reg_dumper/reg_dumper.h18
-rw-r--r--src/reg_dumper/statuspage.c52
-rw-r--r--src/reg_dumper/stepping.c182
-rw-r--r--src/reg_dumper/util.c64
-rw-r--r--src/reg_dumper/xprintf.c42
-rw-r--r--src/xvmc/dri2.c405
-rw-r--r--src/xvmc/dri2.h37
-rw-r--r--src/xvmc/i915_program.h146
-rw-r--r--src/xvmc/i915_structs.h1441
-rw-r--r--src/xvmc/i915_xvmc.c4366
-rw-r--r--src/xvmc/i915_xvmc.h80
-rw-r--r--src/xvmc/i965_xvmc.c1190
-rw-r--r--src/xvmc/i965_xvmc.h1
-rw-r--r--src/xvmc/intel_batchbuffer.c198
-rw-r--r--src/xvmc/intel_batchbuffer.h5
-rw-r--r--src/xvmc/intel_xvmc.c1362
-rw-r--r--src/xvmc/intel_xvmc.h251
-rw-r--r--src/xvmc/intel_xvmc_dump.c211
-rw-r--r--src/xvmc/xvmc_vld.c1737
-rw-r--r--uxa/uxa-accel.c1662
-rw-r--r--uxa/uxa-glyphs.c1328
-rw-r--r--uxa/uxa-priv.h407
-rw-r--r--uxa/uxa-render.c1963
-rw-r--r--uxa/uxa-unaccel.c576
-rw-r--r--uxa/uxa.c614
-rw-r--r--uxa/uxa.h889
68 files changed, 22933 insertions, 22635 deletions
diff --git a/src/bios_reader/bios_dumper.c b/src/bios_reader/bios_dumper.c
index 1353edaa..53293ebd 100644
--- a/src/bios_reader/bios_dumper.c
+++ b/src/bios_reader/bios_dumper.c
@@ -37,68 +37,71 @@
#include <err.h>
#ifndef DEFFILEMODE
-#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) /* 0666*/
+#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) /* 0666 */
#endif
static void usage(void)
{
- fprintf(stderr, "usage: bios_dumper <filename>\n");
- exit(1);
+ fprintf(stderr, "usage: bios_dumper <filename>\n");
+ exit(1);
}
int main(int argc, char **argv)
{
- struct pci_device *dev;
- void *bios;
- int err, fd;
+ struct pci_device *dev;
+ void *bios;
+ int err, fd;
- if (argc != 2)
- usage();
+ if (argc != 2)
+ usage();
- err = pci_system_init();
- if (err != 0) {
- fprintf(stderr, "Couldn't initialize PCI system: %s\n", strerror(err));
- exit(1);
- }
+ err = pci_system_init();
+ if (err != 0) {
+ fprintf(stderr, "Couldn't initialize PCI system: %s\n",
+ strerror(err));
+ exit(1);
+ }
- /* Grab the graphics card */
- dev = pci_device_find_by_slot(0, 0, 2, 0);
- if (dev == NULL)
- errx(1, "Couldn't find graphics card");
+ /* Grab the graphics card */
+ dev = pci_device_find_by_slot(0, 0, 2, 0);
+ if (dev == NULL)
+ errx(1, "Couldn't find graphics card");
- err = pci_device_probe(dev);
- if (err != 0) {
- fprintf(stderr, "Couldn't probe graphics card: %s\n", strerror(err));
- exit(1);
- }
+ err = pci_device_probe(dev);
+ if (err != 0) {
+ fprintf(stderr, "Couldn't probe graphics card: %s\n",
+ strerror(err));
+ exit(1);
+ }
- if (dev->vendor_id != 0x8086)
- errx(1, "Graphics card is non-intel");
+ if (dev->vendor_id != 0x8086)
+ errx(1, "Graphics card is non-intel");
- bios = malloc(dev->rom_size);
- if (bios == NULL)
- errx(1, "Couldn't allocate memory for BIOS data\n");
+ bios = malloc(dev->rom_size);
+ if (bios == NULL)
+ errx(1, "Couldn't allocate memory for BIOS data\n");
- err = pci_device_read_rom(dev, bios);
- if (err != 0) {
- fprintf(stderr, "Couldn't read graphics card ROM: %s\n",
- strerror(err));
- exit(1);
- }
+ err = pci_device_read_rom(dev, bios);
+ if (err != 0) {
+ fprintf(stderr, "Couldn't read graphics card ROM: %s\n",
+ strerror(err));
+ exit(1);
+ }
- fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, DEFFILEMODE);
- if (fd < 0) {
- fprintf(stderr, "Couldn't open output: %s\n", strerror(errno));
- exit(1);
- }
+ fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, DEFFILEMODE);
+ if (fd < 0) {
+ fprintf(stderr, "Couldn't open output: %s\n", strerror(errno));
+ exit(1);
+ }
- if (write(fd, bios, dev->rom_size) < dev->rom_size) {
- fprintf(stderr, "Couldn't write BIOS data: %s\n", strerror(errno));
- exit(1);
- }
+ if (write(fd, bios, dev->rom_size) < dev->rom_size) {
+ fprintf(stderr, "Couldn't write BIOS data: %s\n",
+ strerror(errno));
+ exit(1);
+ }
- close(fd);
- pci_system_cleanup();
+ close(fd);
+ pci_system_cleanup();
- return 0;
+ return 0;
}
diff --git a/src/bios_reader/bios_reader.c b/src/bios_reader/bios_reader.c
index 88467395..ee1e3f56 100644
--- a/src/bios_reader/bios_reader.c
+++ b/src/bios_reader/bios_reader.c
@@ -35,7 +35,6 @@
#include <sys/stat.h>
#include <sys/types.h>
-
#include "../i830_bios.h"
#include <X11/Xfuncproto.h>
@@ -43,10 +42,9 @@
#define _PARSE_EDID_
#include "edid.h"
-
/* Make a fake pI830 so we can easily pull i830_bios.c code in here. */
struct _fake_i830 {
- uint8_t *VBIOS;
+ uint8_t *VBIOS;
};
struct _fake_i830 I830;
struct _fake_i830 *pI830 = &I830;
@@ -62,9 +60,9 @@ struct _fake_i830 *pI830 = &I830;
#define YESNO(val) ((val) ? "yes" : "no")
struct bdb_block {
- uint8_t id;
- uint16_t size;
- void *data;
+ uint8_t id;
+ uint16_t size;
+ void *data;
};
struct bdb_header *bdb;
@@ -74,492 +72,516 @@ static int panel_type;
static struct bdb_block *find_section(int section_id)
{
- struct bdb_block *block;
- unsigned char *base = (unsigned char *)bdb;
- int index = 0;
- uint16_t total, current_size;
- unsigned char current_id;
-
- /* skip to first section */
- index += bdb->header_size;
- total = bdb->bdb_size;
-
- block = malloc(sizeof(*block));
- if (!block) {
- fprintf(stderr, "out of memory\n");
- exit(-1);
- }
-
- /* walk the sections looking for section_id */
- while (index < total) {
- current_id = *(base + index);
- index++;
- current_size = *((uint16_t *)(base + index));
- index += 2;
- if (current_id == section_id) {
- block->id = current_id;
- block->size = current_size;
- block->data = base + index;
- return block;
+ struct bdb_block *block;
+ unsigned char *base = (unsigned char *)bdb;
+ int index = 0;
+ uint16_t total, current_size;
+ unsigned char current_id;
+
+ /* skip to first section */
+ index += bdb->header_size;
+ total = bdb->bdb_size;
+
+ block = malloc(sizeof(*block));
+ if (!block) {
+ fprintf(stderr, "out of memory\n");
+ exit(-1);
+ }
+
+ /* walk the sections looking for section_id */
+ while (index < total) {
+ current_id = *(base + index);
+ index++;
+ current_size = *((uint16_t *) (base + index));
+ index += 2;
+ if (current_id == section_id) {
+ block->id = current_id;
+ block->size = current_size;
+ block->data = base + index;
+ return block;
+ }
+ index += current_size;
}
- index += current_size;
- }
- free(block);
- return NULL;
+ free(block);
+ return NULL;
}
static void dump_general_features(void)
{
- struct bdb_general_features *features;
- struct bdb_block *block;
-
- block = find_section(BDB_GENERAL_FEATURES);
-
- if (!block)
- return;
-
- features = block->data;
-
- printf("General features block:\n");
-
- printf("\tPanel fitting: ");
- switch (features->panel_fitting) {
- case 0:
- printf("disabled\n");
- break;
- case 1:
- printf("text only\n");
- break;
- case 2:
- printf("graphics only\n");
- break;
- case 3:
- printf("text & graphics\n");
- break;
- }
- printf("\tFlexaim: %s\n", YESNO(features->flexaim));
- printf("\tMessage: %s\n", YESNO(features->msg_enable));
- printf("\tClear screen: %d\n", features->clear_screen);
- printf("\tDVO color flip required: %s\n", YESNO(features->color_flip));
- printf("\tExternal VBT: %s\n", YESNO(features->download_ext_vbt));
- printf("\tEnable SSC: %s\n", YESNO(features->enable_ssc));
- if (features->enable_ssc)
- printf("\tSSC frequency: %s\n", features->ssc_freq ?
- "100 MHz (66 MHz on 855)" : "96 MHz (48 MHz on 855)");
- printf("\tLFP on override: %s\n", YESNO(features->enable_lfp_on_override));
- printf("\tDisable SSC on clone: %s\n", YESNO(features->disable_ssc_ddt));
- printf("\tDisable smooth vision: %s\n",
- YESNO(features->disable_smooth_vision));
- printf("\tSingle DVI for CRT/DVI: %s\n", YESNO(features->single_dvi));
- printf("\tLegacy monitor detect: %s\n",
- YESNO(features->legacy_monitor_detect));
- printf("\tIntegrated CRT: %s\n", YESNO(features->int_crt_support));
- printf("\tIntegrated TV: %s\n", YESNO(features->int_tv_support));
-
- tv_present = 1; /* should be based on whether TV DAC exists */
- lvds_present = 1; /* should be based on IS_MOBILE() */
-
- free(block);
+ struct bdb_general_features *features;
+ struct bdb_block *block;
+
+ block = find_section(BDB_GENERAL_FEATURES);
+
+ if (!block)
+ return;
+
+ features = block->data;
+
+ printf("General features block:\n");
+
+ printf("\tPanel fitting: ");
+ switch (features->panel_fitting) {
+ case 0:
+ printf("disabled\n");
+ break;
+ case 1:
+ printf("text only\n");
+ break;
+ case 2:
+ printf("graphics only\n");
+ break;
+ case 3:
+ printf("text & graphics\n");
+ break;
+ }
+ printf("\tFlexaim: %s\n", YESNO(features->flexaim));
+ printf("\tMessage: %s\n", YESNO(features->msg_enable));
+ printf("\tClear screen: %d\n", features->clear_screen);
+ printf("\tDVO color flip required: %s\n", YESNO(features->color_flip));
+ printf("\tExternal VBT: %s\n", YESNO(features->download_ext_vbt));
+ printf("\tEnable SSC: %s\n", YESNO(features->enable_ssc));
+ if (features->enable_ssc)
+ printf("\tSSC frequency: %s\n", features->ssc_freq ?
+ "100 MHz (66 MHz on 855)" : "96 MHz (48 MHz on 855)");
+ printf("\tLFP on override: %s\n",
+ YESNO(features->enable_lfp_on_override));
+ printf("\tDisable SSC on clone: %s\n",
+ YESNO(features->disable_ssc_ddt));
+ printf("\tDisable smooth vision: %s\n",
+ YESNO(features->disable_smooth_vision));
+ printf("\tSingle DVI for CRT/DVI: %s\n", YESNO(features->single_dvi));
+ printf("\tLegacy monitor detect: %s\n",
+ YESNO(features->legacy_monitor_detect));
+ printf("\tIntegrated CRT: %s\n", YESNO(features->int_crt_support));
+ printf("\tIntegrated TV: %s\n", YESNO(features->int_tv_support));
+
+ tv_present = 1; /* should be based on whether TV DAC exists */
+ lvds_present = 1; /* should be based on IS_MOBILE() */
+
+ free(block);
}
static void dump_backlight_info(void)
{
- struct bdb_block *block;
- struct bdb_lvds_backlight *backlight;
- struct blc_struct *blc;
+ struct bdb_block *block;
+ struct bdb_lvds_backlight *backlight;
+ struct blc_struct *blc;
- block = find_section(BDB_LVDS_BACKLIGHT);
+ block = find_section(BDB_LVDS_BACKLIGHT);
- if (!block)
- return;
+ if (!block)
+ return;
- backlight = block->data;
+ backlight = block->data;
- printf("Backlight info block (len %d):\n", block->size);
+ printf("Backlight info block (len %d):\n", block->size);
- if (sizeof(struct blc_struct) != backlight->blcstruct_size) {
- printf("\tBacklight struct sizes don't match (expected %d, got %d), skipping\n",
- sizeof(struct blc_struct), backlight->blcstruct_size);
- return;
- }
+ if (sizeof(struct blc_struct) != backlight->blcstruct_size) {
+ printf
+ ("\tBacklight struct sizes don't match (expected %d, got %d), skipping\n",
+ sizeof(struct blc_struct), backlight->blcstruct_size);
+ return;
+ }
- blc = &backlight->panels[panel_type];
+ blc = &backlight->panels[panel_type];
- printf("\tInverter type: %d\n", blc->inverter_type);
- printf("\t polarity: %d\n", blc->inverter_polarity);
- printf("\t GPIO pins: %d\n", blc->gpio_pins);
- printf("\t GMBUS speed: %d\n", blc->gmbus_speed);
- printf("\t PWM freq: %d\n", blc->pwm_freq);
- printf("\tMinimum brightness: %d\n", blc->min_brightness);
- printf("\tI2C slave addr: 0x%02x\n", blc->i2c_slave_addr);
- printf("\tI2C command: 0x%02x\n", blc->i2c_cmd);
+ printf("\tInverter type: %d\n", blc->inverter_type);
+ printf("\t polarity: %d\n", blc->inverter_polarity);
+ printf("\t GPIO pins: %d\n", blc->gpio_pins);
+ printf("\t GMBUS speed: %d\n", blc->gmbus_speed);
+ printf("\t PWM freq: %d\n", blc->pwm_freq);
+ printf("\tMinimum brightness: %d\n", blc->min_brightness);
+ printf("\tI2C slave addr: 0x%02x\n", blc->i2c_slave_addr);
+ printf("\tI2C command: 0x%02x\n", blc->i2c_cmd);
}
static void dump_general_definitions(void)
{
- struct bdb_block *block;
- struct bdb_general_definitions *defs;
- struct child_device_config *child;
- int i;
- char child_id[11];
- int child_device_num;
-
- block = find_section(BDB_GENERAL_DEFINITIONS);
-
- if (!block)
- return;
-
- defs = block->data;
-
- printf("General definitions block:\n");
-
- printf("\tCRT DDC GMBUS addr: 0x%02x\n", defs->crt_ddc_gmbus_pin);
- printf("\tUse ACPI DPMS CRT power states: %s\n", YESNO(defs->dpms_acpi));
- printf("\tSkip CRT detect at boot: %s\n",
- YESNO(defs->skip_boot_crt_detect));
- printf("\tUse DPMS on AIM devices: %s\n", YESNO(defs->dpms_aim));
- printf("\tBoot display type: 0x%02x%02x\n", defs->boot_display[1],
- defs->boot_display[0]);
- printf("\tTV data block present: %s\n", YESNO(tv_present));
- child_device_num = (block->size - sizeof(*defs)) / sizeof(*child);
- for (i = 0; i < child_device_num; i++) {
- child = &defs->devices[i];
- if (!child->device_type) {
- printf("\tChild device %d not present\n", i);
- continue;
+ struct bdb_block *block;
+ struct bdb_general_definitions *defs;
+ struct child_device_config *child;
+ int i;
+ char child_id[11];
+ int child_device_num;
+
+ block = find_section(BDB_GENERAL_DEFINITIONS);
+
+ if (!block)
+ return;
+
+ defs = block->data;
+
+ printf("General definitions block:\n");
+
+ printf("\tCRT DDC GMBUS addr: 0x%02x\n", defs->crt_ddc_gmbus_pin);
+ printf("\tUse ACPI DPMS CRT power states: %s\n",
+ YESNO(defs->dpms_acpi));
+ printf("\tSkip CRT detect at boot: %s\n",
+ YESNO(defs->skip_boot_crt_detect));
+ printf("\tUse DPMS on AIM devices: %s\n", YESNO(defs->dpms_aim));
+ printf("\tBoot display type: 0x%02x%02x\n", defs->boot_display[1],
+ defs->boot_display[0]);
+ printf("\tTV data block present: %s\n", YESNO(tv_present));
+ child_device_num = (block->size - sizeof(*defs)) / sizeof(*child);
+ for (i = 0; i < child_device_num; i++) {
+ child = &defs->devices[i];
+ if (!child->device_type) {
+ printf("\tChild device %d not present\n", i);
+ continue;
+ }
+ strncpy(child_id, (char *)child->device_id, 10);
+ child_id[10] = 0;
+ printf("\tChild %d device info:\n", i);
+ printf("\t\tSignature: %s\n", child_id);
+ printf("\t\tAIM offset: %d\n", child->addin_offset);
+ printf("\t\tDVO port: 0x%02x\n", child->dvo_port);
}
- strncpy(child_id, (char *)child->device_id, 10);
- child_id[10] = 0;
- printf("\tChild %d device info:\n", i);
- printf("\t\tSignature: %s\n", child_id);
- printf("\t\tAIM offset: %d\n", child->addin_offset);
- printf("\t\tDVO port: 0x%02x\n", child->dvo_port);
- }
-
- free(block);
+
+ free(block);
}
#if 0
static void dump_child_devices(void)
{
- struct bdb_block *block;
- struct bdb_child_devices *child_devs;
- struct child_device_config *child;
- int i;
-
- block = find_section(BDB_CHILD_DEVICE_TABLE);
- if (!block) {
- printf("No child device table found\n");
- return;
- }
-
- child_devs = block->data;
-
- printf("Child devices block:\n");
- for (i = 0; i < DEVICE_CHILD_SIZE; i++) {
- child = &child_devs->children[i];
- /* Skip nonexistent children */
- if (!child->device_type)
- continue;
- printf("\tChild device %d\n", i);
- printf("\t\tType: 0x%04x\n", child->device_type);
- printf("\t\tDVO port: 0x%02x\n", child->dvo_port);
- printf("\t\tI2C pin: 0x%02x\n", child->i2c_pin);
- printf("\t\tSlave addr: 0x%02x\n", child->slave_addr);
- printf("\t\tDDC pin: 0x%02x\n", child->ddc_pin);
- printf("\t\tDVO config: 0x%02x\n", child->dvo_cfg);
- printf("\t\tDVO wiring: 0x%02x\n", child->dvo_wiring);
- }
-
- free(block);
+ struct bdb_block *block;
+ struct bdb_child_devices *child_devs;
+ struct child_device_config *child;
+ int i;
+
+ block = find_section(BDB_CHILD_DEVICE_TABLE);
+ if (!block) {
+ printf("No child device table found\n");
+ return;
+ }
+
+ child_devs = block->data;
+
+ printf("Child devices block:\n");
+ for (i = 0; i < DEVICE_CHILD_SIZE; i++) {
+ child = &child_devs->children[i];
+ /* Skip nonexistent children */
+ if (!child->device_type)
+ continue;
+ printf("\tChild device %d\n", i);
+ printf("\t\tType: 0x%04x\n", child->device_type);
+ printf("\t\tDVO port: 0x%02x\n", child->dvo_port);
+ printf("\t\tI2C pin: 0x%02x\n", child->i2c_pin);
+ printf("\t\tSlave addr: 0x%02x\n", child->slave_addr);
+ printf("\t\tDDC pin: 0x%02x\n", child->ddc_pin);
+ printf("\t\tDVO config: 0x%02x\n", child->dvo_cfg);
+ printf("\t\tDVO wiring: 0x%02x\n", child->dvo_wiring);
+ }
+
+ free(block);
}
#endif
static void dump_lvds_options(void)
{
- struct bdb_block *block;
- struct bdb_lvds_options *options;
-
- block = find_section(BDB_LVDS_OPTIONS);
- if (!block) {
- printf("No LVDS options block\n");
- return;
- }
-
- options = block->data;
-
- printf("LVDS options block:\n");
-
- panel_type = options->panel_type;
- printf("\tPanel type: %d\n", panel_type);
- printf("\tLVDS EDID available: %s\n", YESNO(options->lvds_edid));
- printf("\tPixel dither: %s\n", YESNO(options->pixel_dither));
- printf("\tPFIT auto ratio: %s\n", YESNO(options->pfit_ratio_auto));
- printf("\tPFIT enhanced graphics mode: %s\n",
- YESNO(options->pfit_gfx_mode_enhanced));
- printf("\tPFIT enhanced text mode: %s\n",
- YESNO(options->pfit_text_mode_enhanced));
- printf("\tPFIT mode: %d\n", options->pfit_mode);
-
- free(block);
+ struct bdb_block *block;
+ struct bdb_lvds_options *options;
+
+ block = find_section(BDB_LVDS_OPTIONS);
+ if (!block) {
+ printf("No LVDS options block\n");
+ return;
+ }
+
+ options = block->data;
+
+ printf("LVDS options block:\n");
+
+ panel_type = options->panel_type;
+ printf("\tPanel type: %d\n", panel_type);
+ printf("\tLVDS EDID available: %s\n", YESNO(options->lvds_edid));
+ printf("\tPixel dither: %s\n", YESNO(options->pixel_dither));
+ printf("\tPFIT auto ratio: %s\n", YESNO(options->pfit_ratio_auto));
+ printf("\tPFIT enhanced graphics mode: %s\n",
+ YESNO(options->pfit_gfx_mode_enhanced));
+ printf("\tPFIT enhanced text mode: %s\n",
+ YESNO(options->pfit_text_mode_enhanced));
+ printf("\tPFIT mode: %d\n", options->pfit_mode);
+
+ free(block);
}
static void dump_lvds_ptr_data(void)
{
- struct bdb_block *block;
- struct bdb_lvds_lfp_data *lvds_data;
- struct bdb_lvds_lfp_data_ptrs *ptrs;
- struct lvds_fp_timing *fp_timing;
- struct bdb_lvds_lfp_data_entry *entry;
- int lfp_data_size;
-
- block = find_section(BDB_LVDS_LFP_DATA_PTRS);
- if (!block) {
- printf("No LFP data pointers block\n");
- return;
- }
- ptrs = block->data;
-
- block = find_section(BDB_LVDS_LFP_DATA);
- if (!block) {
- printf("No LVDS data block\n");
- return;
- }
- lvds_data = block->data;
-
- lfp_data_size = ptrs->ptr[1].fp_timing_offset - ptrs->ptr[0].fp_timing_offset;
- entry = (struct bdb_lvds_lfp_data_entry *)((uint8_t *)lvds_data->data +
+ struct bdb_block *block;
+ struct bdb_lvds_lfp_data *lvds_data;
+ struct bdb_lvds_lfp_data_ptrs *ptrs;
+ struct lvds_fp_timing *fp_timing;
+ struct bdb_lvds_lfp_data_entry *entry;
+ int lfp_data_size;
+
+ block = find_section(BDB_LVDS_LFP_DATA_PTRS);
+ if (!block) {
+ printf("No LFP data pointers block\n");
+ return;
+ }
+ ptrs = block->data;
+
+ block = find_section(BDB_LVDS_LFP_DATA);
+ if (!block) {
+ printf("No LVDS data block\n");
+ return;
+ }
+ lvds_data = block->data;
+
+ lfp_data_size =
+ ptrs->ptr[1].fp_timing_offset - ptrs->ptr[0].fp_timing_offset;
+ entry =
+ (struct bdb_lvds_lfp_data_entry *)((uint8_t *) lvds_data->data +
(lfp_data_size * panel_type));
- fp_timing = &entry->fp_timing;
+ fp_timing = &entry->fp_timing;
- printf("LVDS timing pointer data:\n");
- printf(" Number of entries: %d\n", ptrs->lvds_entries);
+ printf("LVDS timing pointer data:\n");
+ printf(" Number of entries: %d\n", ptrs->lvds_entries);
- printf("\tpanel type %02i: %dx%d\n", panel_type, fp_timing->x_res,
- fp_timing->y_res);
+ printf("\tpanel type %02i: %dx%d\n", panel_type, fp_timing->x_res,
+ fp_timing->y_res);
- free(block);
+ free(block);
}
static void dump_lvds_data(void)
{
- struct bdb_block *block;
- struct bdb_lvds_lfp_data *lvds_data;
- struct bdb_lvds_lfp_data_ptrs *ptrs;
- int num_entries;
- int i;
- int hdisplay, hsyncstart, hsyncend, htotal;
- int vdisplay, vsyncstart, vsyncend, vtotal;
- float clock;
- int lfp_data_size, dvo_offset;
-
- block = find_section(BDB_LVDS_LFP_DATA_PTRS);
- if (!block) {
- printf("No LVDS ptr block\n");
- return;
- }
- ptrs = block->data;
- lfp_data_size = ptrs->ptr[1].fp_timing_offset - ptrs->ptr[0].fp_timing_offset;
- dvo_offset = ptrs->ptr[0].dvo_timing_offset - ptrs->ptr[0].fp_timing_offset;
- free(block);
-
- block = find_section(BDB_LVDS_LFP_DATA);
- if (!block) {
- printf("No LVDS data block\n");
- return;
- }
-
- lvds_data = block->data;
- num_entries = block->size / lfp_data_size;
-
- printf("LVDS panel data block (preferred block marked with '*'):\n");
- printf(" Number of entries: %d\n", num_entries);
-
- for (i = 0; i < num_entries; i++) {
- uint8_t *lfp_data_ptr = (uint8_t *)lvds_data->data + lfp_data_size * i;
- uint8_t *timing_data = lfp_data_ptr + dvo_offset;
- struct bdb_lvds_lfp_data_entry *lfp_data =
- (struct bdb_lvds_lfp_data_entry *)lfp_data_ptr;
- char marker;
-
- if (i == panel_type)
- marker = '*';
- else
- marker = ' ';
-
- hdisplay = _H_ACTIVE(timing_data);
- hsyncstart = hdisplay + _H_SYNC_OFF(timing_data);
- hsyncend = hsyncstart + _H_SYNC_WIDTH(timing_data);
- htotal = hdisplay + _H_BLANK(timing_data);
-
- vdisplay = _V_ACTIVE(timing_data);
- vsyncstart = vdisplay + _V_SYNC_OFF(timing_data);
- vsyncend = vsyncstart + _V_SYNC_WIDTH(timing_data);
- vtotal = vdisplay + _V_BLANK(timing_data);
- clock = _PIXEL_CLOCK(timing_data) / 1000;
-
- printf("%c\tpanel type %02i: %dx%d clock %d\n", marker,
- i, lfp_data->fp_timing.x_res, lfp_data->fp_timing.y_res,
- _PIXEL_CLOCK(timing_data));
- printf("\t\tinfo:\n");
- printf("\t\t LVDS: 0x%08lx\n",
- (unsigned long)lfp_data->fp_timing.lvds_reg_val);
- printf("\t\t PP_ON_DELAYS: 0x%08lx\n",
- (unsigned long)lfp_data->fp_timing.pp_on_reg_val);
- printf("\t\t PP_OFF_DELAYS: 0x%08lx\n",
- (unsigned long)lfp_data->fp_timing.pp_off_reg_val);
- printf("\t\t PP_DIVISOR: 0x%08lx\n",
- (unsigned long)lfp_data->fp_timing.pp_cycle_reg_val);
- printf("\t\t PFIT: 0x%08lx\n",
- (unsigned long)lfp_data->fp_timing.pfit_reg_val);
- printf("\t\ttimings: %d %d %d %d %d %d %d %d %.2f (%s)\n",
- hdisplay, hsyncstart, hsyncend, htotal,
- vdisplay, vsyncstart, vsyncend, vtotal, clock,
- (hsyncend > htotal || vsyncend > vtotal) ?
- "BAD!" : "good");
- }
- free(block);
+ struct bdb_block *block;
+ struct bdb_lvds_lfp_data *lvds_data;
+ struct bdb_lvds_lfp_data_ptrs *ptrs;
+ int num_entries;
+ int i;
+ int hdisplay, hsyncstart, hsyncend, htotal;
+ int vdisplay, vsyncstart, vsyncend, vtotal;
+ float clock;
+ int lfp_data_size, dvo_offset;
+
+ block = find_section(BDB_LVDS_LFP_DATA_PTRS);
+ if (!block) {
+ printf("No LVDS ptr block\n");
+ return;
+ }
+ ptrs = block->data;
+ lfp_data_size =
+ ptrs->ptr[1].fp_timing_offset - ptrs->ptr[0].fp_timing_offset;
+ dvo_offset =
+ ptrs->ptr[0].dvo_timing_offset - ptrs->ptr[0].fp_timing_offset;
+ free(block);
+
+ block = find_section(BDB_LVDS_LFP_DATA);
+ if (!block) {
+ printf("No LVDS data block\n");
+ return;
+ }
+
+ lvds_data = block->data;
+ num_entries = block->size / lfp_data_size;
+
+ printf("LVDS panel data block (preferred block marked with '*'):\n");
+ printf(" Number of entries: %d\n", num_entries);
+
+ for (i = 0; i < num_entries; i++) {
+ uint8_t *lfp_data_ptr =
+ (uint8_t *) lvds_data->data + lfp_data_size * i;
+ uint8_t *timing_data = lfp_data_ptr + dvo_offset;
+ struct bdb_lvds_lfp_data_entry *lfp_data =
+ (struct bdb_lvds_lfp_data_entry *)lfp_data_ptr;
+ char marker;
+
+ if (i == panel_type)
+ marker = '*';
+ else
+ marker = ' ';
+
+ hdisplay = _H_ACTIVE(timing_data);
+ hsyncstart = hdisplay + _H_SYNC_OFF(timing_data);
+ hsyncend = hsyncstart + _H_SYNC_WIDTH(timing_data);
+ htotal = hdisplay + _H_BLANK(timing_data);
+
+ vdisplay = _V_ACTIVE(timing_data);
+ vsyncstart = vdisplay + _V_SYNC_OFF(timing_data);
+ vsyncend = vsyncstart + _V_SYNC_WIDTH(timing_data);
+ vtotal = vdisplay + _V_BLANK(timing_data);
+ clock = _PIXEL_CLOCK(timing_data) / 1000;
+
+ printf("%c\tpanel type %02i: %dx%d clock %d\n", marker,
+ i, lfp_data->fp_timing.x_res, lfp_data->fp_timing.y_res,
+ _PIXEL_CLOCK(timing_data));
+ printf("\t\tinfo:\n");
+ printf("\t\t LVDS: 0x%08lx\n",
+ (unsigned long)lfp_data->fp_timing.lvds_reg_val);
+ printf("\t\t PP_ON_DELAYS: 0x%08lx\n",
+ (unsigned long)lfp_data->fp_timing.pp_on_reg_val);
+ printf("\t\t PP_OFF_DELAYS: 0x%08lx\n",
+ (unsigned long)lfp_data->fp_timing.pp_off_reg_val);
+ printf("\t\t PP_DIVISOR: 0x%08lx\n",
+ (unsigned long)lfp_data->fp_timing.pp_cycle_reg_val);
+ printf("\t\t PFIT: 0x%08lx\n",
+ (unsigned long)lfp_data->fp_timing.pfit_reg_val);
+ printf("\t\ttimings: %d %d %d %d %d %d %d %d %.2f (%s)\n",
+ hdisplay, hsyncstart, hsyncend, htotal,
+ vdisplay, vsyncstart, vsyncend, vtotal, clock,
+ (hsyncend > htotal || vsyncend > vtotal) ?
+ "BAD!" : "good");
+ }
+ free(block);
}
static void dump_driver_feature(void)
{
- struct bdb_block *block;
- struct bdb_driver_feature *feature;
-
- block = find_section(BDB_DRIVER_FEATURES);
- if (!block) {
- printf("No Driver feature data block\n");
- return;
- }
- feature = block->data;
-
- printf("Driver feature Data Block:\n");
- printf("\tBoot Device Algorithm: %s\n", feature->boot_dev_algorithm ?
- "driver default": "os default");
- printf("\tBlock display switching when DVD active: %s\n",
- YESNO(feature->block_display_switch));
- printf("\tAllow display switching when in Full Screen DOS: %s\n",
- YESNO(feature->allow_display_switch));
- printf("\tHot Plug DVO: %s\n", YESNO(feature->hotplug_dvo));
- printf("\tDual View Zoom: %s\n", YESNO(feature->dual_view_zoom));
- printf("\tDriver INT 15h hook: %s\n", YESNO(feature->int15h_hook));
- printf("\tEnable Sprite in Clone Mode: %s\n", YESNO(feature->sprite_in_clone));
- printf("\tUse 00000110h ID for Primary LFP: %s\n", YESNO(feature->primary_lfp_id));
- printf("\tBoot Mode X: %u\n", feature->boot_mode_x);
- printf("\tBoot Mode Y: %u\n", feature->boot_mode_y);
- printf("\tBoot Mode Bpp: %u\n", feature->boot_mode_bpp);
- printf("\tBoot Mode Refresh: %u\n", feature->boot_mode_refresh);
- printf("\tEnable LFP as primary: %s\n", YESNO(feature->enable_lfp_primary));
- printf("\tSelective Mode Pruning: %s\n", YESNO(feature->selective_mode_pruning));
- printf("\tDual-Frequency Graphics Technology: %s\n", YESNO(feature->dual_frequency));
- printf("\tDefault Render Clock Frequency: %s\n", feature->render_clock_freq ? "low" : "high");
- printf("\tNT 4.0 Dual Display Clone Support: %s\n", YESNO(feature->nt_clone_support));
- printf("\tDefault Power Scheme user interface: %s\n", feature->power_scheme_ui ? "3rd party":"CUI");
- printf("\tSprite Display Assignment when Overlay is Active in Clone Mode: %s\n",
- feature->sprite_display_assign ? "primary" : "secondary");
- printf("\tDisplay Maintain Aspect Scaling via CUI: %s\n", YESNO(feature->cui_aspect_scaling));
- printf("\tPreserve Aspect Ratio: %s\n", YESNO(feature->preserve_aspect_ratio));
- printf("\tEnable SDVO device power down: %s\n", YESNO(feature->sdvo_device_power_down));
- printf("\tCRT hotplug: %s\n", YESNO(feature->crt_hotplug));
- printf("\tLVDS config: ");
- switch (feature->lvds_config) {
+ struct bdb_block *block;
+ struct bdb_driver_feature *feature;
+
+ block = find_section(BDB_DRIVER_FEATURES);
+ if (!block) {
+ printf("No Driver feature data block\n");
+ return;
+ }
+ feature = block->data;
+
+ printf("Driver feature Data Block:\n");
+ printf("\tBoot Device Algorithm: %s\n", feature->boot_dev_algorithm ?
+ "driver default" : "os default");
+ printf("\tBlock display switching when DVD active: %s\n",
+ YESNO(feature->block_display_switch));
+ printf("\tAllow display switching when in Full Screen DOS: %s\n",
+ YESNO(feature->allow_display_switch));
+ printf("\tHot Plug DVO: %s\n", YESNO(feature->hotplug_dvo));
+ printf("\tDual View Zoom: %s\n", YESNO(feature->dual_view_zoom));
+ printf("\tDriver INT 15h hook: %s\n", YESNO(feature->int15h_hook));
+ printf("\tEnable Sprite in Clone Mode: %s\n",
+ YESNO(feature->sprite_in_clone));
+ printf("\tUse 00000110h ID for Primary LFP: %s\n",
+ YESNO(feature->primary_lfp_id));
+ printf("\tBoot Mode X: %u\n", feature->boot_mode_x);
+ printf("\tBoot Mode Y: %u\n", feature->boot_mode_y);
+ printf("\tBoot Mode Bpp: %u\n", feature->boot_mode_bpp);
+ printf("\tBoot Mode Refresh: %u\n", feature->boot_mode_refresh);
+ printf("\tEnable LFP as primary: %s\n",
+ YESNO(feature->enable_lfp_primary));
+ printf("\tSelective Mode Pruning: %s\n",
+ YESNO(feature->selective_mode_pruning));
+ printf("\tDual-Frequency Graphics Technology: %s\n",
+ YESNO(feature->dual_frequency));
+ printf("\tDefault Render Clock Frequency: %s\n",
+ feature->render_clock_freq ? "low" : "high");
+ printf("\tNT 4.0 Dual Display Clone Support: %s\n",
+ YESNO(feature->nt_clone_support));
+ printf("\tDefault Power Scheme user interface: %s\n",
+ feature->power_scheme_ui ? "3rd party" : "CUI");
+ printf
+ ("\tSprite Display Assignment when Overlay is Active in Clone Mode: %s\n",
+ feature->sprite_display_assign ? "primary" : "secondary");
+ printf("\tDisplay Maintain Aspect Scaling via CUI: %s\n",
+ YESNO(feature->cui_aspect_scaling));
+ printf("\tPreserve Aspect Ratio: %s\n",
+ YESNO(feature->preserve_aspect_ratio));
+ printf("\tEnable SDVO device power down: %s\n",
+ YESNO(feature->sdvo_device_power_down));
+ printf("\tCRT hotplug: %s\n", YESNO(feature->crt_hotplug));
+ printf("\tLVDS config: ");
+ switch (feature->lvds_config) {
case BDB_DRIVER_NO_LVDS:
- printf("No LVDS\n");
- break;
+ printf("No LVDS\n");
+ break;
case BDB_DRIVER_INT_LVDS:
- printf("Integrated LVDS\n");
- break;
+ printf("Integrated LVDS\n");
+ break;
case BDB_DRIVER_SDVO_LVDS:
- printf("SDVO LVDS\n");
- break;
+ printf("SDVO LVDS\n");
+ break;
case BDB_DRIVER_EDP:
- printf("Embedded DisplayPort\n");
- break;
- }
- printf("\tDefine Display statically: %s\n", YESNO(feature->static_display));
- printf("\tLegacy CRT max X: %d\n", feature->legacy_crt_max_x);
- printf("\tLegacy CRT max Y: %d\n", feature->legacy_crt_max_y);
- printf("\tLegacy CRT max refresh: %d\n", feature->legacy_crt_max_refresh);
- free(block);
+ printf("Embedded DisplayPort\n");
+ break;
+ }
+ printf("\tDefine Display statically: %s\n",
+ YESNO(feature->static_display));
+ printf("\tLegacy CRT max X: %d\n", feature->legacy_crt_max_x);
+ printf("\tLegacy CRT max Y: %d\n", feature->legacy_crt_max_y);
+ printf("\tLegacy CRT max refresh: %d\n",
+ feature->legacy_crt_max_refresh);
+ free(block);
}
int main(int argc, char **argv)
{
- int fd;
- struct vbt_header *vbt = NULL;
- int vbt_off, bdb_off, i;
- char *filename = "bios";
- struct stat finfo;
- struct bdb_block *block;
- char signature[17];
-
- if (argc != 2) {
- printf("usage: %s <rom file>\n", argv[0]);
- return 1;
- }
-
- filename = argv[1];
-
- fd = open(filename, O_RDONLY);
- if (fd == -1) {
- printf("Couldn't open \"%s\": %s\n", filename, strerror(errno));
- return 1;
- }
-
- if (stat(filename, &finfo)) {
- printf("failed to stat \"%s\": %s\n", filename, strerror(errno));
- return 1;
- }
-
- pI830->VBIOS = mmap(NULL, finfo.st_size, PROT_READ, MAP_SHARED, fd, 0);
- if (pI830->VBIOS == MAP_FAILED) {
- printf("failed to map \"%s\": %s\n", filename, strerror(errno));
- return 1;
- }
-
- /* Scour memory looking for the VBT signature */
- for (i = 0; i + 4 < finfo.st_size; i++) {
- if (!memcmp(pI830->VBIOS + i, "$VBT", 4)) {
- vbt_off = i;
- vbt = (struct vbt_header *)(pI830->VBIOS + i);
- break;
+ int fd;
+ struct vbt_header *vbt = NULL;
+ int vbt_off, bdb_off, i;
+ char *filename = "bios";
+ struct stat finfo;
+ struct bdb_block *block;
+ char signature[17];
+
+ if (argc != 2) {
+ printf("usage: %s <rom file>\n", argv[0]);
+ return 1;
}
- }
- if (!vbt) {
- printf("VBT signature missing\n");
- return 1;
- }
+ filename = argv[1];
- printf("VBT vers: %d.%d\n", vbt->version / 100, vbt->version % 100);
+ fd = open(filename, O_RDONLY);
+ if (fd == -1) {
+ printf("Couldn't open \"%s\": %s\n", filename, strerror(errno));
+ return 1;
+ }
- bdb_off = vbt_off + vbt->bdb_offset;
- bdb = (struct bdb_header *)(pI830->VBIOS + bdb_off);
- strncpy(signature, (char *)bdb->signature, 16);
- signature[16] = 0;
- printf("BDB sig: %s\n", signature);
- printf("BDB vers: %d.%d\n", bdb->version / 100, bdb->version % 100);
+ if (stat(filename, &finfo)) {
+ printf("failed to stat \"%s\": %s\n", filename,
+ strerror(errno));
+ return 1;
+ }
- printf("Available sections: ");
- for (i = 0; i < 256; i++) {
- block = find_section(i);
- if (!block)
- continue;
- printf("%d ", i);
- free(block);
- }
- printf("\n");
+ pI830->VBIOS = mmap(NULL, finfo.st_size, PROT_READ, MAP_SHARED, fd, 0);
+ if (pI830->VBIOS == MAP_FAILED) {
+ printf("failed to map \"%s\": %s\n", filename, strerror(errno));
+ return 1;
+ }
+
+ /* Scour memory looking for the VBT signature */
+ for (i = 0; i + 4 < finfo.st_size; i++) {
+ if (!memcmp(pI830->VBIOS + i, "$VBT", 4)) {
+ vbt_off = i;
+ vbt = (struct vbt_header *)(pI830->VBIOS + i);
+ break;
+ }
+ }
+
+ if (!vbt) {
+ printf("VBT signature missing\n");
+ return 1;
+ }
+
+ printf("VBT vers: %d.%d\n", vbt->version / 100, vbt->version % 100);
+
+ bdb_off = vbt_off + vbt->bdb_offset;
+ bdb = (struct bdb_header *)(pI830->VBIOS + bdb_off);
+ strncpy(signature, (char *)bdb->signature, 16);
+ signature[16] = 0;
+ printf("BDB sig: %s\n", signature);
+ printf("BDB vers: %d.%d\n", bdb->version / 100, bdb->version % 100);
+
+ printf("Available sections: ");
+ for (i = 0; i < 256; i++) {
+ block = find_section(i);
+ if (!block)
+ continue;
+ printf("%d ", i);
+ free(block);
+ }
+ printf("\n");
- dump_general_features();
- dump_general_definitions();
+ dump_general_features();
+ dump_general_definitions();
// dump_child_devices();
- dump_lvds_options();
- dump_lvds_data();
- dump_lvds_ptr_data();
- dump_backlight_info();
+ dump_lvds_options();
+ dump_lvds_data();
+ dump_lvds_ptr_data();
+ dump_backlight_info();
- dump_driver_feature();
+ dump_driver_feature();
- return 0;
+ return 0;
}
diff --git a/src/bios_reader/swf_dumper.c b/src/bios_reader/swf_dumper.c
index a6cf0468..e904495b 100644
--- a/src/bios_reader/swf_dumper.c
+++ b/src/bios_reader/swf_dumper.c
@@ -41,70 +41,72 @@
#include "../i830_bios.h"
#ifndef DEFFILEMODE
-#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) /* 0666*/
+#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) /* 0666 */
#endif
static uint32_t read32(void *base, int reg)
{
- uint32_t *addr = (uint32_t *)((unsigned char *)(base) + reg);
+ uint32_t *addr = (uint32_t *) ((unsigned char *)(base) + reg);
- return *addr;
+ return *addr;
}
#if 0
static void write32(void *base, int reg, uint32_t val)
{
- uint32_t *addr = (uint32_t *)((unsigned char *)(base) + reg);
- *addr = val;
+ uint32_t *addr = (uint32_t *) ((unsigned char *)(base) + reg);
+ *addr = val;
}
#endif
static void usage(void)
{
- fprintf(stderr, "usage: swf_dumper\n");
- exit(1);
+ fprintf(stderr, "usage: swf_dumper\n");
+ exit(1);
}
int main(int argc, char **argv)
{
- struct pci_device *dev;
- int err;
- void *addr;
-
- if (argc != 1)
- usage();
-
- err = pci_system_init();
- if (err != 0) {
- fprintf(stderr, "Couldn't initialize PCI system: %s\n", strerror(err));
- exit(1);
- }
-
- /* Grab the graphics card */
- dev = pci_device_find_by_slot(0, 0, 2, 0);
- if (dev == NULL)
- errx(1, "Couldn't find graphics card");
-
- err = pci_device_probe(dev);
- if (err != 0) {
- fprintf(stderr, "Couldn't probe graphics card: %s\n", strerror(err));
- exit(1);
- }
-
- if (dev->vendor_id != 0x8086)
- errx(1, "Graphics card is non-intel");
-
- err = pci_device_map_range(dev, dev->regions[0].base_addr,
- dev->regions[0].size,
- PCI_DEV_MAP_FLAG_WRITABLE, &addr);
- if (err) {
- fprintf(stderr, "Couldn't map MMIO space: %s\n", strerror(err));
- exit(1);
- }
-
- printf("SWF14: 0x%08x\n", read32(addr, SWF14));
-
- pci_system_cleanup();
-
- return 0;
+ struct pci_device *dev;
+ int err;
+ void *addr;
+
+ if (argc != 1)
+ usage();
+
+ err = pci_system_init();
+ if (err != 0) {
+ fprintf(stderr, "Couldn't initialize PCI system: %s\n",
+ strerror(err));
+ exit(1);
+ }
+
+ /* Grab the graphics card */
+ dev = pci_device_find_by_slot(0, 0, 2, 0);
+ if (dev == NULL)
+ errx(1, "Couldn't find graphics card");
+
+ err = pci_device_probe(dev);
+ if (err != 0) {
+ fprintf(stderr, "Couldn't probe graphics card: %s\n",
+ strerror(err));
+ exit(1);
+ }
+
+ if (dev->vendor_id != 0x8086)
+ errx(1, "Graphics card is non-intel");
+
+ err = pci_device_map_range(dev, dev->regions[0].base_addr,
+ dev->regions[0].size,
+ PCI_DEV_MAP_FLAG_WRITABLE, &addr);
+ if (err) {
+ fprintf(stderr, "Couldn't map MMIO space: %s\n", strerror(err));
+ exit(1);
+ }
+
+ printf("SWF14: 0x%08x\n", read32(addr, SWF14));
+
+ pci_system_cleanup();
+
+ return 0;
}
diff --git a/src/i830.h b/src/i830.h
index fbc5a276..474333bb 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -73,12 +73,12 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "uxa.h"
Bool i830_uxa_init(ScreenPtr pScreen);
void i830_uxa_create_screen_resources(ScreenPtr pScreen);
-void i830_uxa_block_handler (ScreenPtr pScreen);
-Bool i830_get_aperture_space(ScrnInfoPtr pScrn, drm_intel_bo **bo_table,
+void i830_uxa_block_handler(ScreenPtr pScreen);
+Bool i830_get_aperture_space(ScrnInfoPtr pScrn, drm_intel_bo ** bo_table,
int num_bos);
-dri_bo *i830_get_pixmap_bo (PixmapPtr pixmap);
-void i830_set_pixmap_bo(PixmapPtr pixmap, dri_bo *bo);
+dri_bo *i830_get_pixmap_bo(PixmapPtr pixmap);
+void i830_set_pixmap_bo(PixmapPtr pixmap, dri_bo * bo);
typedef struct _I830OutputRec I830OutputRec, *I830OutputPtr;
@@ -95,18 +95,18 @@ typedef struct _I830OutputRec I830OutputRec, *I830OutputPtr;
typedef struct _I830Rec *I830Ptr;
-typedef void (*I830WriteIndexedByteFunc)(I830Ptr pI830, IOADDRESS addr,
- uint8_t index, uint8_t value);
-typedef uint8_t(*I830ReadIndexedByteFunc)(I830Ptr pI830, IOADDRESS addr,
- uint8_t index);
-typedef void (*I830WriteByteFunc)(I830Ptr pI830, IOADDRESS addr,
- uint8_t value);
-typedef uint8_t(*I830ReadByteFunc)(I830Ptr pI830, IOADDRESS addr);
+typedef void (*I830WriteIndexedByteFunc) (I830Ptr pI830, IOADDRESS addr,
+ uint8_t index, uint8_t value);
+typedef uint8_t(*I830ReadIndexedByteFunc) (I830Ptr pI830, IOADDRESS addr,
+ uint8_t index);
+typedef void (*I830WriteByteFunc) (I830Ptr pI830, IOADDRESS addr,
+ uint8_t value);
+typedef uint8_t(*I830ReadByteFunc) (I830Ptr pI830, IOADDRESS addr);
enum tile_format {
- TILE_NONE,
- TILE_XMAJOR,
- TILE_YMAJOR
+ TILE_NONE,
+ TILE_XMAJOR,
+ TILE_YMAJOR
};
#define PITCH_NONE 0
@@ -114,280 +114,282 @@ enum tile_format {
/** Record of a linear allocation in the aperture. */
typedef struct _i830_memory i830_memory;
struct _i830_memory {
- /** Offset of the allocation in card VM */
- unsigned long offset;
- /** End of the allocation in card VM */
- unsigned long end;
- /**
- * Requested size of the allocation: doesn't count padding.
- *
- * Any bound memory will cover offset to (offset + size).
- */
- unsigned long size;
-
- enum tile_format tiling;
- /** Pitch value in bytes for tiled surfaces */
- unsigned int pitch;
-
- /** Description of the allocation, for logging */
- char *name;
-
- /** @{
- * Memory allocator linked list pointers
- */
- i830_memory *next;
- i830_memory *prev;
- /** @} */
-
- dri_bo *bo;
- uint32_t alignment;
- uint32_t gem_name;
+ /** Offset of the allocation in card VM */
+ unsigned long offset;
+ /** End of the allocation in card VM */
+ unsigned long end;
+ /**
+ * Requested size of the allocation: doesn't count padding.
+ *
+ * Any bound memory will cover offset to (offset + size).
+ */
+ unsigned long size;
+
+ enum tile_format tiling;
+ /** Pitch value in bytes for tiled surfaces */
+ unsigned int pitch;
+
+ /** Description of the allocation, for logging */
+ char *name;
+
+ /** @{
+ * Memory allocator linked list pointers
+ */
+ i830_memory *next;
+ i830_memory *prev;
+ /** @} */
+
+ dri_bo *bo;
+ uint32_t alignment;
+ uint32_t gem_name;
};
typedef struct _I830CrtcPrivateRec {
- int pipe;
- int plane;
+ int pipe;
+ int plane;
- Bool enabled;
-
- int dpms_mode;
-
- int x, y;
+ Bool enabled;
- /* Lookup table values to be set when the CRTC is enabled */
- uint8_t lut_r[256], lut_g[256], lut_b[256];
+ int dpms_mode;
+
+ int x, y;
+
+ /* Lookup table values to be set when the CRTC is enabled */
+ uint8_t lut_r[256], lut_g[256], lut_b[256];
} I830CrtcPrivateRec, *I830CrtcPrivatePtr;
#define I830CrtcPrivate(c) ((I830CrtcPrivatePtr) (c)->driver_private)
/** enumeration of 3d consumers so some can maintain invariant state. */
enum last_3d {
- LAST_3D_OTHER,
- LAST_3D_VIDEO,
- LAST_3D_RENDER,
- LAST_3D_ROTATION
+ LAST_3D_OTHER,
+ LAST_3D_VIDEO,
+ LAST_3D_RENDER,
+ LAST_3D_ROTATION
};
enum dri_type {
- DRI_DISABLED,
- DRI_NONE,
- DRI_DRI2
+ DRI_DISABLED,
+ DRI_NONE,
+ DRI_DRI2
};
typedef struct _I830Rec {
- unsigned char *MMIOBase;
- int cpp;
-
- unsigned int bufferOffset; /* for I830SelectBuffer */
-
- /* These are set in PreInit and never changed. */
- long FbMapSize;
- long GTTMapSize;
-
- /**
- * Linked list of video memory allocations. The head and tail are
- * dummy entries that bound the allocation area.
- */
- i830_memory *memory_list;
- /** Linked list of buffer object memory allocations */
- i830_memory *bo_list;
-
- i830_memory *front_buffer;
- /* One big buffer for all cursors for kernels that support this */
- i830_memory *cursor_mem_argb[2];
-
- dri_bufmgr *bufmgr;
-
- uint8_t *batch_ptr;
- /** Byte offset in batch_ptr for the next dword to be emitted. */
- unsigned int batch_used;
- /** Position in batch_ptr at the start of the current BEGIN_BATCH */
- unsigned int batch_emit_start;
- /** Number of bytes to be emitted in the current BEGIN_BATCH. */
- uint32_t batch_emitting;
- dri_bo *batch_bo;
- dri_bo *last_batch_bo;
- /** Whether we're in a section of code that can't tolerate flushing */
- Bool in_batch_atomic;
- /** Ending batch_used that was verified by i830_start_batch_atomic() */
- int batch_atomic_limit;
-
- /* For Xvideo */
- Bool use_drmmode_overlay;
+ unsigned char *MMIOBase;
+ int cpp;
+
+ unsigned int bufferOffset; /* for I830SelectBuffer */
+
+ /* These are set in PreInit and never changed. */
+ long FbMapSize;
+ long GTTMapSize;
+
+ /**
+ * Linked list of video memory allocations. The head and tail are
+ * dummy entries that bound the allocation area.
+ */
+ i830_memory *memory_list;
+ /** Linked list of buffer object memory allocations */
+ i830_memory *bo_list;
+
+ i830_memory *front_buffer;
+ /* One big buffer for all cursors for kernels that support this */
+ i830_memory *cursor_mem_argb[2];
+
+ dri_bufmgr *bufmgr;
+
+ uint8_t *batch_ptr;
+ /** Byte offset in batch_ptr for the next dword to be emitted. */
+ unsigned int batch_used;
+ /** Position in batch_ptr at the start of the current BEGIN_BATCH */
+ unsigned int batch_emit_start;
+ /** Number of bytes to be emitted in the current BEGIN_BATCH. */
+ uint32_t batch_emitting;
+ dri_bo *batch_bo;
+ dri_bo *last_batch_bo;
+ /** Whether we're in a section of code that can't tolerate flushing */
+ Bool in_batch_atomic;
+ /** Ending batch_used that was verified by i830_start_batch_atomic() */
+ int batch_atomic_limit;
+
+ /* For Xvideo */
+ Bool use_drmmode_overlay;
#ifdef INTEL_XVMC
- /* For XvMC */
- Bool XvMCEnabled;
+ /* For XvMC */
+ Bool XvMCEnabled;
#endif
- CreateScreenResourcesProcPtr CreateScreenResources;
-
- Bool need_mi_flush;
-
- Bool tiling;
- Bool swapbuffers_wait;
-
- int Chipset;
- unsigned long LinearAddr;
- EntityInfoPtr pEnt;
- struct pci_device *PciInfo;
- uint8_t variant;
-
- unsigned int BR[20];
-
- CloseScreenProcPtr CloseScreen;
-
- void (*batch_flush_notify)(ScrnInfoPtr pScrn);
-
- uxa_driver_t *uxa_driver;
- Bool need_flush;
- PixmapPtr pSrcPixmap;
- int accel_pixmap_pitch_alignment;
- int accel_pixmap_offset_alignment;
- int accel_max_x;
- int accel_max_y;
- int max_gtt_map_size;
-
- Bool XvDisabled; /* Xv disabled in PreInit. */
- Bool XvEnabled; /* Xv enabled for this generation. */
- Bool XvPreferOverlay;
-
- int colorKey;
- XF86VideoAdaptorPtr adaptor;
- ScreenBlockHandlerProcPtr BlockHandler;
- Bool overlayOn;
-
- struct {
- drm_intel_bo *gen4_vs_bo;
- drm_intel_bo *gen4_sf_bo;
- drm_intel_bo *gen4_wm_packed_bo;
- drm_intel_bo *gen4_wm_planar_bo;
- drm_intel_bo *gen4_cc_bo;
- drm_intel_bo *gen4_cc_vp_bo;
- drm_intel_bo *gen4_sampler_bo;
- drm_intel_bo *gen4_sip_kernel_bo;
- } video;
-
- /* Render accel state */
- float scale_units[2][2];
- /** Transform pointers for src/mask, or NULL if identity */
- PictTransform *transform[2];
- float dst_coord_adjust;
- float src_coord_adjust;
- float mask_coord_adjust;
-
- /* i830 render accel state */
- PixmapPtr render_src, render_mask, render_dst;
- PicturePtr render_src_picture, render_mask_picture, render_dst_picture;
- uint32_t render_dst_format;
- Bool needs_render_state_emit;
- uint32_t cblend, ablend, s8_blendctl;
-
- /* i915 render accel state */
- uint32_t mapstate[6];
- uint32_t samplerstate[6];
-
- struct {
- int op;
- uint32_t dst_format;
- Bool needs_emit;
- } i915_render_state;
-
- /* 965 render acceleration state */
- struct gen4_render_state *gen4_render_state;
-
- enum dri_type directRenderingType; /* DRI enabled this generation. */
-
- Bool directRenderingOpen;
- int drmSubFD;
- char deviceName[64];
-
- /* Broken-out options. */
- OptionInfoPtr Options;
-
- /* Driver phase/state information */
- Bool suspended;
-
- uint32_t saveDSPARB;
- uint32_t saveDSPACNTR;
- uint32_t saveDSPBCNTR;
- uint32_t savePIPEACONF;
- uint32_t savePIPEBCONF;
- uint32_t savePIPEASRC;
- uint32_t savePIPEBSRC;
- uint32_t saveFPA0;
- uint32_t saveFPA1;
- uint32_t saveDPLL_A;
- uint32_t saveDPLL_A_MD;
- uint32_t saveHTOTAL_A;
- uint32_t saveHBLANK_A;
- uint32_t saveHSYNC_A;
- uint32_t saveVTOTAL_A;
- uint32_t saveVBLANK_A;
- uint32_t saveVSYNC_A;
- uint32_t saveBCLRPAT_A;
- uint32_t saveDSPASTRIDE;
- uint32_t saveDSPASIZE;
- uint32_t saveDSPAPOS;
- uint32_t saveDSPABASE;
- uint32_t saveDSPASURF;
- uint32_t saveDSPATILEOFF;
- uint32_t saveFPB0;
- uint32_t saveFPB1;
- uint32_t saveDPLL_B;
- uint32_t saveDPLL_B_MD;
- uint32_t saveHTOTAL_B;
- uint32_t saveHBLANK_B;
- uint32_t saveHSYNC_B;
- uint32_t saveVTOTAL_B;
- uint32_t saveVBLANK_B;
- uint32_t saveVSYNC_B;
- uint32_t saveBCLRPAT_B;
- uint32_t saveDSPBSTRIDE;
- uint32_t saveDSPBSIZE;
- uint32_t saveDSPBPOS;
- uint32_t saveDSPBBASE;
- uint32_t saveDSPBSURF;
- uint32_t saveDSPBTILEOFF;
- uint32_t saveVCLK_DIVISOR_VGA0;
- uint32_t saveVCLK_DIVISOR_VGA1;
- uint32_t saveVCLK_POST_DIV;
- uint32_t saveVGACNTRL;
- uint32_t saveCURSOR_A_CONTROL;
- uint32_t saveCURSOR_A_BASE;
- uint32_t saveCURSOR_A_POSITION;
- uint32_t saveCURSOR_B_CONTROL;
- uint32_t saveCURSOR_B_BASE;
- uint32_t saveCURSOR_B_POSITION;
- uint32_t saveADPA;
- uint32_t saveLVDS;
- uint32_t saveDVOA;
- uint32_t saveDVOB;
- uint32_t saveDVOC;
- uint32_t savePP_ON;
- uint32_t savePP_OFF;
- uint32_t savePP_CONTROL;
- uint32_t savePP_DIVISOR;
- uint32_t savePFIT_CONTROL;
- uint32_t savePaletteA[256];
- uint32_t savePaletteB[256];
- uint32_t saveSWF[17];
- uint32_t saveBLC_PWM_CTL;
- uint32_t saveBLC_PWM_CTL2;
- uint32_t saveFBC_CFB_BASE;
- uint32_t saveFBC_LL_BASE;
- uint32_t saveFBC_CONTROL2;
- uint32_t saveFBC_CONTROL;
- uint32_t saveFBC_FENCE_OFF;
- uint32_t saveRENCLK_GATE_D1;
- uint32_t saveRENCLK_GATE_D2;
- uint32_t saveDSPCLK_GATE_D;
- uint32_t saveRAMCLK_GATE_D;
- uint32_t savePWRCTXA;
-
- enum last_3d last_3d;
-
- /** User option to print acceleration fallback info to the server log. */
- Bool fallback_debug;
+ CreateScreenResourcesProcPtr CreateScreenResources;
+
+ Bool need_mi_flush;
+
+ Bool tiling;
+ Bool swapbuffers_wait;
+
+ int Chipset;
+ unsigned long LinearAddr;
+ EntityInfoPtr pEnt;
+ struct pci_device *PciInfo;
+ uint8_t variant;
+
+ unsigned int BR[20];
+
+ CloseScreenProcPtr CloseScreen;
+
+ void (*batch_flush_notify) (ScrnInfoPtr pScrn);
+
+ uxa_driver_t *uxa_driver;
+ Bool need_flush;
+ PixmapPtr pSrcPixmap;
+ int accel_pixmap_pitch_alignment;
+ int accel_pixmap_offset_alignment;
+ int accel_max_x;
+ int accel_max_y;
+ int max_gtt_map_size;
+
+ Bool XvDisabled; /* Xv disabled in PreInit. */
+ Bool XvEnabled; /* Xv enabled for this generation. */
+ Bool XvPreferOverlay;
+
+ int colorKey;
+ XF86VideoAdaptorPtr adaptor;
+ ScreenBlockHandlerProcPtr BlockHandler;
+ Bool overlayOn;
+
+ struct {
+ drm_intel_bo *gen4_vs_bo;
+ drm_intel_bo *gen4_sf_bo;
+ drm_intel_bo *gen4_wm_packed_bo;
+ drm_intel_bo *gen4_wm_planar_bo;
+ drm_intel_bo *gen4_cc_bo;
+ drm_intel_bo *gen4_cc_vp_bo;
+ drm_intel_bo *gen4_sampler_bo;
+ drm_intel_bo *gen4_sip_kernel_bo;
+ } video;
+
+ /* Render accel state */
+ float scale_units[2][2];
+ /** Transform pointers for src/mask, or NULL if identity */
+ PictTransform *transform[2];
+ float dst_coord_adjust;
+ float src_coord_adjust;
+ float mask_coord_adjust;
+
+ /* i830 render accel state */
+ PixmapPtr render_src, render_mask, render_dst;
+ PicturePtr render_src_picture, render_mask_picture, render_dst_picture;
+ uint32_t render_dst_format;
+ Bool needs_render_state_emit;
+ uint32_t cblend, ablend, s8_blendctl;
+
+ /* i915 render accel state */
+ uint32_t mapstate[6];
+ uint32_t samplerstate[6];
+
+ struct {
+ int op;
+ uint32_t dst_format;
+ Bool needs_emit;
+ } i915_render_state;
+
+ /* 965 render acceleration state */
+ struct gen4_render_state *gen4_render_state;
+
+ enum dri_type directRenderingType; /* DRI enabled this generation. */
+
+ Bool directRenderingOpen;
+ int drmSubFD;
+ char deviceName[64];
+
+ /* Broken-out options. */
+ OptionInfoPtr Options;
+
+ /* Driver phase/state information */
+ Bool suspended;
+
+ uint32_t saveDSPARB;
+ uint32_t saveDSPACNTR;
+ uint32_t saveDSPBCNTR;
+ uint32_t savePIPEACONF;
+ uint32_t savePIPEBCONF;
+ uint32_t savePIPEASRC;
+ uint32_t savePIPEBSRC;
+ uint32_t saveFPA0;
+ uint32_t saveFPA1;
+ uint32_t saveDPLL_A;
+ uint32_t saveDPLL_A_MD;
+ uint32_t saveHTOTAL_A;
+ uint32_t saveHBLANK_A;
+ uint32_t saveHSYNC_A;
+ uint32_t saveVTOTAL_A;
+ uint32_t saveVBLANK_A;
+ uint32_t saveVSYNC_A;
+ uint32_t saveBCLRPAT_A;
+ uint32_t saveDSPASTRIDE;
+ uint32_t saveDSPASIZE;
+ uint32_t saveDSPAPOS;
+ uint32_t saveDSPABASE;
+ uint32_t saveDSPASURF;
+ uint32_t saveDSPATILEOFF;
+ uint32_t saveFPB0;
+ uint32_t saveFPB1;
+ uint32_t saveDPLL_B;
+ uint32_t saveDPLL_B_MD;
+ uint32_t saveHTOTAL_B;
+ uint32_t saveHBLANK_B;
+ uint32_t saveHSYNC_B;
+ uint32_t saveVTOTAL_B;
+ uint32_t saveVBLANK_B;
+ uint32_t saveVSYNC_B;
+ uint32_t saveBCLRPAT_B;
+ uint32_t saveDSPBSTRIDE;
+ uint32_t saveDSPBSIZE;
+ uint32_t saveDSPBPOS;
+ uint32_t saveDSPBBASE;
+ uint32_t saveDSPBSURF;
+ uint32_t saveDSPBTILEOFF;
+ uint32_t saveVCLK_DIVISOR_VGA0;
+ uint32_t saveVCLK_DIVISOR_VGA1;
+ uint32_t saveVCLK_POST_DIV;
+ uint32_t saveVGACNTRL;
+ uint32_t saveCURSOR_A_CONTROL;
+ uint32_t saveCURSOR_A_BASE;
+ uint32_t saveCURSOR_A_POSITION;
+ uint32_t saveCURSOR_B_CONTROL;
+ uint32_t saveCURSOR_B_BASE;
+ uint32_t saveCURSOR_B_POSITION;
+ uint32_t saveADPA;
+ uint32_t saveLVDS;
+ uint32_t saveDVOA;
+ uint32_t saveDVOB;
+ uint32_t saveDVOC;
+ uint32_t savePP_ON;
+ uint32_t savePP_OFF;
+ uint32_t savePP_CONTROL;
+ uint32_t savePP_DIVISOR;
+ uint32_t savePFIT_CONTROL;
+ uint32_t savePaletteA[256];
+ uint32_t savePaletteB[256];
+ uint32_t saveSWF[17];
+ uint32_t saveBLC_PWM_CTL;
+ uint32_t saveBLC_PWM_CTL2;
+ uint32_t saveFBC_CFB_BASE;
+ uint32_t saveFBC_LL_BASE;
+ uint32_t saveFBC_CONTROL2;
+ uint32_t saveFBC_CONTROL;
+ uint32_t saveFBC_FENCE_OFF;
+ uint32_t saveRENCLK_GATE_D1;
+ uint32_t saveRENCLK_GATE_D2;
+ uint32_t saveDSPCLK_GATE_D;
+ uint32_t saveRAMCLK_GATE_D;
+ uint32_t savePWRCTXA;
+
+ enum last_3d last_3d;
+
+ /**
+ * User option to print acceleration fallback info to the server log.
+ */
+ Bool fallback_debug;
} I830Rec;
#define I830PTR(p) ((I830Ptr)((p)->driverPrivate))
@@ -410,9 +412,8 @@ extern void I915EmitInvarientState(ScrnInfoPtr pScrn);
extern void I830EmitFlush(ScrnInfoPtr pScrn);
extern void I830InitVideo(ScreenPtr pScreen);
-extern xf86CrtcPtr i830_covering_crtc (ScrnInfoPtr pScrn, BoxPtr box,
- xf86CrtcPtr desired,
- BoxPtr crtc_box_ret);
+extern xf86CrtcPtr i830_covering_crtc(ScrnInfoPtr pScrn, BoxPtr box,
+ xf86CrtcPtr desired, BoxPtr crtc_box_ret);
extern xf86CrtcPtr i830_pipe_to_crtc(ScrnInfoPtr pScrn, int pipe);
@@ -420,11 +421,11 @@ Bool I830DRI2ScreenInit(ScreenPtr pScreen);
void I830DRI2CloseScreen(ScreenPtr pScreen);
extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, int fd, int cpp);
-extern int drmmode_get_pipe_from_crtc_id(drm_intel_bufmgr *bufmgr, xf86CrtcPtr crtc);
+extern int drmmode_get_pipe_from_crtc_id(drm_intel_bufmgr * bufmgr,
+ xf86CrtcPtr crtc);
extern int drmmode_output_dpms_status(xf86OutputPtr output);
extern int drmmode_crtc_id(xf86CrtcPtr crtc);
-void
-drmmode_crtc_set_cursor_bo(xf86CrtcPtr crtc, dri_bo *cursor);
+void drmmode_crtc_set_cursor_bo(xf86CrtcPtr crtc, dri_bo * cursor);
extern Bool i830_crtc_on(xf86CrtcPtr crtc);
extern int i830_crtc_to_pipe(xf86CrtcPtr crtc);
@@ -432,38 +433,37 @@ extern Bool I830AccelInit(ScreenPtr pScreen);
Bool i830_allocator_init(ScrnInfoPtr pScrn, unsigned long size);
void i830_allocator_fini(ScrnInfoPtr pScrn);
-i830_memory * i830_allocate_memory(ScrnInfoPtr pScrn, const char *name,
- unsigned long size, unsigned long pitch,
- unsigned long alignment, int flags,
- enum tile_format tile_format);
+i830_memory *i830_allocate_memory(ScrnInfoPtr pScrn, const char *name,
+ unsigned long size, unsigned long pitch,
+ unsigned long alignment, int flags,
+ enum tile_format tile_format);
void i830_describe_allocations(ScrnInfoPtr pScrn, int verbosity,
const char *prefix);
void i830_reset_allocations(ScrnInfoPtr pScrn);
void i830_free_3d_memory(ScrnInfoPtr pScrn);
-void i830_free_memory(ScrnInfoPtr pScrn, i830_memory *mem);
+void i830_free_memory(ScrnInfoPtr pScrn, i830_memory * mem);
Bool i830_allocate_2d_memory(ScrnInfoPtr pScrn);
Bool i830_allocate_3d_memory(ScrnInfoPtr pScrn);
void i830_init_bufmgr(ScrnInfoPtr pScrn);
#ifdef INTEL_XVMC
Bool i830_allocate_xvmc_buffer(ScrnInfoPtr pScrn, const char *name,
- i830_memory **buffer, unsigned long size, int flags);
-void i830_free_xvmc_buffer(ScrnInfoPtr pScrn, i830_memory *buffer);
+ i830_memory ** buffer, unsigned long size,
+ int flags);
+void i830_free_xvmc_buffer(ScrnInfoPtr pScrn, i830_memory * buffer);
#endif
-Bool
-i830_tiled_width(I830Ptr i830, int *width, int cpp);
+Bool i830_tiled_width(I830Ptr i830, int *width, int cpp);
-int
-i830_pad_drawable_width(int width, int cpp);
+int i830_pad_drawable_width(int width, int cpp);
/* i830_memory.c */
Bool i830_bind_all_memory(ScrnInfoPtr pScrn);
unsigned long i830_get_fence_size(I830Ptr pI830, unsigned long size);
-unsigned long i830_get_fence_pitch(I830Ptr pI830, unsigned long pitch, int format);
+unsigned long i830_get_fence_pitch(I830Ptr pI830, unsigned long pitch,
+ int format);
void i830_set_max_gtt_map_size(ScrnInfoPtr pScrn);
-i830_memory *
-i830_allocate_framebuffer(ScrnInfoPtr pScrn);
+i830_memory *i830_allocate_framebuffer(ScrnInfoPtr pScrn);
/* i830_render.c */
Bool i830_check_composite(int op, PicturePtr pSrc, PicturePtr pMask,
@@ -471,8 +471,7 @@ Bool i830_check_composite(int op, PicturePtr pSrc, PicturePtr pMask,
Bool i830_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMask,
PicturePtr pDst, PixmapPtr pSrcPixmap,
PixmapPtr pMaskPixmap, PixmapPtr pDstPixmap);
-Bool
-i830_transform_is_affine (PictTransformPtr t);
+Bool i830_transform_is_affine(PictTransformPtr t);
void i830_composite(PixmapPtr pDst, int srcX, int srcY,
int maskX, int maskY, int dstX, int dstY, int w, int h);
@@ -499,8 +498,7 @@ Bool i965_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMask,
void i965_composite(PixmapPtr pDst, int srcX, int srcY,
int maskX, int maskY, int dstX, int dstY, int w, int h);
-void
-i965_batch_flush_notify(ScrnInfoPtr pScrn);
+void i965_batch_flush_notify(ScrnInfoPtr pScrn);
Bool
i830_get_transformed_coordinates(int x, int y, PictTransformPtr transform,
@@ -541,29 +539,30 @@ Bool i830_pixmap_tiled(PixmapPtr p);
* If only we'd done this before settling on the library API.
*/
static inline uint32_t
-intel_emit_reloc(drm_intel_bo *bo, uint32_t offset,
- drm_intel_bo *target_bo, uint32_t target_offset,
+intel_emit_reloc(drm_intel_bo * bo, uint32_t offset,
+ drm_intel_bo * target_bo, uint32_t target_offset,
uint32_t read_domains, uint32_t write_domain)
{
- drm_intel_bo_emit_reloc(bo, offset, target_bo, target_offset,
- read_domains, write_domain);
+ drm_intel_bo_emit_reloc(bo, offset, target_bo, target_offset,
+ read_domains, write_domain);
- return target_bo->offset + target_offset;
+ return target_bo->offset + target_offset;
}
-static inline drm_intel_bo *
-intel_bo_alloc_for_data(ScrnInfoPtr scrn, void *data, unsigned int size,
- char *name)
+static inline drm_intel_bo *intel_bo_alloc_for_data(ScrnInfoPtr scrn,
+ void *data,
+ unsigned int size,
+ char *name)
{
- I830Ptr pI830 = I830PTR(scrn);
- drm_intel_bo *bo;
+ I830Ptr pI830 = I830PTR(scrn);
+ drm_intel_bo *bo;
- bo = drm_intel_bo_alloc(pI830->bufmgr, name, size, 4096);
- if (!bo)
- return NULL;
- drm_intel_bo_subdata(bo, 0, size, data);
+ bo = drm_intel_bo_alloc(pI830->bufmgr, name, size, 4096);
+ if (!bo)
+ return NULL;
+ drm_intel_bo_subdata(bo, 0, size, data);
- return bo;
+ return bo;
}
extern const int I830PatternROP[16];
@@ -582,37 +581,33 @@ extern const int I830CopyROP[16];
* Compare to CREATE_PIXMAP_USAGE_* in the server.
*/
enum {
- INTEL_CREATE_PIXMAP_TILING_X = 0x10000000,
- INTEL_CREATE_PIXMAP_TILING_Y,
+ INTEL_CREATE_PIXMAP_TILING_X = 0x10000000,
+ INTEL_CREATE_PIXMAP_TILING_Y,
};
#if (ALWAYS_FLUSH | ALWAYS_SYNC)
-void
-i830_debug_sync(ScrnInfoPtr scrn);
+void i830_debug_sync(ScrnInfoPtr scrn);
#else
-static inline void
-i830_debug_sync(ScrnInfoPtr scrn)
+static inline void i830_debug_sync(ScrnInfoPtr scrn)
{
}
#endif
-static inline PixmapPtr
-get_drawable_pixmap(DrawablePtr drawable)
+static inline PixmapPtr get_drawable_pixmap(DrawablePtr drawable)
{
- ScreenPtr screen = drawable->pScreen;
+ ScreenPtr screen = drawable->pScreen;
- if (drawable->type == DRAWABLE_PIXMAP)
- return (PixmapPtr)drawable;
- else
- return screen->GetWindowPixmap((WindowPtr)drawable);
+ if (drawable->type == DRAWABLE_PIXMAP)
+ return (PixmapPtr) drawable;
+ else
+ return screen->GetWindowPixmap((WindowPtr) drawable);
}
-static inline Bool
-pixmap_is_scanout(PixmapPtr pixmap)
+static inline Bool pixmap_is_scanout(PixmapPtr pixmap)
{
- ScreenPtr screen = pixmap->drawable.pScreen;
+ ScreenPtr screen = pixmap->drawable.pScreen;
- return pixmap == screen->GetScreenPixmap(screen);
+ return pixmap == screen->GetScreenPixmap(screen);
}
#endif /* _I830_H_ */
diff --git a/src/i830_3d.c b/src/i830_3d.c
index ee17f25d..871b45b2 100644
--- a/src/i830_3d.c
+++ b/src/i830_3d.c
@@ -34,219 +34,194 @@
#include "i830_reg.h"
-void I830EmitInvarientState( ScrnInfoPtr pScrn )
+void I830EmitInvarientState(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
-
- BEGIN_BATCH(58);
-
- OUT_BATCH(_3DSTATE_MAP_CUBE | MAP_UNIT(0));
- OUT_BATCH(_3DSTATE_MAP_CUBE | MAP_UNIT(1));
- OUT_BATCH(_3DSTATE_MAP_CUBE | MAP_UNIT(2));
- OUT_BATCH(_3DSTATE_MAP_CUBE | MAP_UNIT(3));
-
- OUT_BATCH(_3DSTATE_DFLT_DIFFUSE_CMD);
- OUT_BATCH(0);
-
- OUT_BATCH(_3DSTATE_DFLT_SPEC_CMD);
- OUT_BATCH(0);
-
- OUT_BATCH(_3DSTATE_DFLT_Z_CMD);
- OUT_BATCH(0);
-
- OUT_BATCH(_3DSTATE_FOG_MODE_CMD);
- OUT_BATCH(FOGFUNC_ENABLE |
- FOG_LINEAR_CONST |
- FOGSRC_INDEX_Z |
- ENABLE_FOG_DENSITY);
- OUT_BATCH(0);
- OUT_BATCH(0);
-
- OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD |
- MAP_UNIT(0) |
- DISABLE_TEX_STREAM_BUMP |
- ENABLE_TEX_STREAM_COORD_SET |
- TEX_STREAM_COORD_SET(0) |
- ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(0));
- OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD |
- MAP_UNIT(1) |
- DISABLE_TEX_STREAM_BUMP |
- ENABLE_TEX_STREAM_COORD_SET |
- TEX_STREAM_COORD_SET(1) |
- ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(1));
- OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD |
- MAP_UNIT(2) |
- DISABLE_TEX_STREAM_BUMP |
- ENABLE_TEX_STREAM_COORD_SET |
- TEX_STREAM_COORD_SET(2) |
- ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(2));
- OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD |
- MAP_UNIT(3) |
- DISABLE_TEX_STREAM_BUMP |
- ENABLE_TEX_STREAM_COORD_SET |
- TEX_STREAM_COORD_SET(3) |
- ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(3));
-
- OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM);
- OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(0));
- OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM);
- OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(1));
- OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM);
- OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(2));
- OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM);
- OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(3));
-
- OUT_BATCH(_3DSTATE_RASTER_RULES_CMD |
- ENABLE_POINT_RASTER_RULE |
- OGL_POINT_RASTER_RULE |
- ENABLE_LINE_STRIP_PROVOKE_VRTX |
- ENABLE_TRI_FAN_PROVOKE_VRTX |
- ENABLE_TRI_STRIP_PROVOKE_VRTX |
- LINE_STRIP_PROVOKE_VRTX(1) |
- TRI_FAN_PROVOKE_VRTX(2) |
- TRI_STRIP_PROVOKE_VRTX(2));
-
- OUT_BATCH(_3DSTATE_SCISSOR_ENABLE_CMD |
- DISABLE_SCISSOR_RECT);
-
- OUT_BATCH(_3DSTATE_SCISSOR_RECT_0_CMD);
- OUT_BATCH(0);
- OUT_BATCH(0);
-
- OUT_BATCH(_3DSTATE_VERTEX_TRANSFORM);
- OUT_BATCH(DISABLE_VIEWPORT_TRANSFORM | DISABLE_PERSPECTIVE_DIVIDE);
-
- OUT_BATCH(_3DSTATE_W_STATE_CMD);
- OUT_BATCH(MAGIC_W_STATE_DWORD1);
- OUT_BATCH(0x3f800000 /* 1.0 in IEEE float */ );
-
- OUT_BATCH(_3DSTATE_COLOR_FACTOR_CMD);
- OUT_BATCH(0x80808080); /* .5 required in alpha for GL_DOT3_RGBA_EXT */
-
- OUT_BATCH(_3DSTATE_MAP_COORD_SETBIND_CMD);
- OUT_BATCH(TEXBIND_SET3(TEXCOORDSRC_VTXSET_3) |
- TEXBIND_SET2(TEXCOORDSRC_VTXSET_2) |
- TEXBIND_SET1(TEXCOORDSRC_VTXSET_1) |
- TEXBIND_SET0(TEXCOORDSRC_VTXSET_0));
-
- /* copy from mesa */
- OUT_BATCH(_3DSTATE_INDPT_ALPHA_BLEND_CMD |
- DISABLE_INDPT_ALPHA_BLEND |
- ENABLE_ALPHA_BLENDFUNC |
- ABLENDFUNC_ADD);
-
- OUT_BATCH(_3DSTATE_FOG_COLOR_CMD |
- FOG_COLOR_RED(0) |
- FOG_COLOR_GREEN(0) |
- FOG_COLOR_BLUE(0));
-
- OUT_BATCH(_3DSTATE_CONST_BLEND_COLOR_CMD);
- OUT_BATCH(0);
-
- OUT_BATCH(_3DSTATE_MODES_1_CMD |
- ENABLE_COLR_BLND_FUNC |
- BLENDFUNC_ADD |
- ENABLE_SRC_BLND_FACTOR |
- SRC_BLND_FACT(BLENDFACTOR_ONE) |
- ENABLE_DST_BLND_FACTOR |
- DST_BLND_FACT(BLENDFACTOR_ZERO));
- OUT_BATCH(_3DSTATE_MODES_2_CMD |
- ENABLE_GLOBAL_DEPTH_BIAS |
- GLOBAL_DEPTH_BIAS(0) |
- ENABLE_ALPHA_TEST_FUNC|
- ALPHA_TEST_FUNC(0) | /* always */
- ALPHA_REF_VALUE(0));
- OUT_BATCH(_3DSTATE_MODES_3_CMD |
- ENABLE_DEPTH_TEST_FUNC |
- DEPTH_TEST_FUNC(0x2) | /* COMPAREFUNC_LESS */
- ENABLE_ALPHA_SHADE_MODE |
- ALPHA_SHADE_MODE(SHADE_MODE_LINEAR) |
- ENABLE_FOG_SHADE_MODE |
- FOG_SHADE_MODE(SHADE_MODE_LINEAR) |
- ENABLE_SPEC_SHADE_MODE |
- SPEC_SHADE_MODE(SHADE_MODE_LINEAR) |
- ENABLE_COLOR_SHADE_MODE |
- COLOR_SHADE_MODE(SHADE_MODE_LINEAR) |
- ENABLE_CULL_MODE | CULLMODE_NONE);
-
- OUT_BATCH(_3DSTATE_MODES_4_CMD |
- ENABLE_LOGIC_OP_FUNC |
- LOGIC_OP_FUNC(LOGICOP_COPY) |
- ENABLE_STENCIL_TEST_MASK |
- STENCIL_TEST_MASK(0xff) |
- ENABLE_STENCIL_WRITE_MASK |
- STENCIL_WRITE_MASK(0xff));
-
- OUT_BATCH(_3DSTATE_STENCIL_TEST_CMD |
- ENABLE_STENCIL_PARMS |
- STENCIL_FAIL_OP(0) | /* STENCILOP_KEEP */
- STENCIL_PASS_DEPTH_FAIL_OP(0) | /* STENCILOP_KEEP */
- STENCIL_PASS_DEPTH_PASS_OP(0) | /* STENCILOP_KEEP */
- ENABLE_STENCIL_TEST_FUNC |
- STENCIL_TEST_FUNC(0) | /* COMPAREFUNC_ALWAYS */
- ENABLE_STENCIL_REF_VALUE |
- STENCIL_REF_VALUE(0));
-
- OUT_BATCH(_3DSTATE_MODES_5_CMD |
- FLUSH_TEXTURE_CACHE |
- ENABLE_SPRITE_POINT_TEX |
- SPRITE_POINT_TEX_OFF |
- ENABLE_FIXED_LINE_WIDTH |
- FIXED_LINE_WIDTH(0x2) | /* 1.0 */
- ENABLE_FIXED_POINT_WIDTH |
- FIXED_POINT_WIDTH(1));
-
- OUT_BATCH(_3DSTATE_ENABLES_1_CMD |
- DISABLE_LOGIC_OP |
- DISABLE_STENCIL_TEST |
- DISABLE_DEPTH_BIAS |
- DISABLE_SPEC_ADD |
- DISABLE_FOG |
- DISABLE_ALPHA_TEST |
- ENABLE_COLOR_BLEND |
- DISABLE_DEPTH_TEST);
- OUT_BATCH(_3DSTATE_ENABLES_2_CMD |
- DISABLE_STENCIL_WRITE |
- ENABLE_TEX_CACHE |
- DISABLE_DITHER |
- ENABLE_COLOR_MASK |
- ENABLE_COLOR_WRITE |
- DISABLE_DEPTH_WRITE);
-
- OUT_BATCH(_3DSTATE_STIPPLE);
-
- /* Set default blend state */
- OUT_BATCH(_3DSTATE_MAP_BLEND_OP_CMD(0) |
- TEXPIPE_COLOR |
- ENABLE_TEXOUTPUT_WRT_SEL |
- TEXOP_OUTPUT_CURRENT |
- DISABLE_TEX_CNTRL_STAGE |
- TEXOP_SCALE_1X |
- TEXOP_MODIFY_PARMS |
- TEXOP_LAST_STAGE | TEXBLENDOP_ARG1);
- OUT_BATCH(_3DSTATE_MAP_BLEND_OP_CMD(0) |
- TEXPIPE_ALPHA |
- ENABLE_TEXOUTPUT_WRT_SEL |
- TEXOP_OUTPUT_CURRENT |
- TEXOP_SCALE_1X |
- TEXOP_MODIFY_PARMS | TEXBLENDOP_ARG1);
- OUT_BATCH(_3DSTATE_MAP_BLEND_ARG_CMD(0) |
- TEXPIPE_COLOR |
- TEXBLEND_ARG1 |
- TEXBLENDARG_MODIFY_PARMS |
- TEXBLENDARG_DIFFUSE);
- OUT_BATCH(_3DSTATE_MAP_BLEND_ARG_CMD(0) |
- TEXPIPE_ALPHA |
- TEXBLEND_ARG1 |
- TEXBLENDARG_MODIFY_PARMS |
- TEXBLENDARG_DIFFUSE);
-
- OUT_BATCH(_3DSTATE_AA_CMD |
- AA_LINE_ECAAR_WIDTH_ENABLE |
- AA_LINE_ECAAR_WIDTH_1_0 |
- AA_LINE_REGION_WIDTH_ENABLE |
- AA_LINE_REGION_WIDTH_1_0 |
- AA_LINE_DISABLE);
-
- ADVANCE_BATCH();
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ BEGIN_BATCH(58);
+
+ OUT_BATCH(_3DSTATE_MAP_CUBE | MAP_UNIT(0));
+ OUT_BATCH(_3DSTATE_MAP_CUBE | MAP_UNIT(1));
+ OUT_BATCH(_3DSTATE_MAP_CUBE | MAP_UNIT(2));
+ OUT_BATCH(_3DSTATE_MAP_CUBE | MAP_UNIT(3));
+
+ OUT_BATCH(_3DSTATE_DFLT_DIFFUSE_CMD);
+ OUT_BATCH(0);
+
+ OUT_BATCH(_3DSTATE_DFLT_SPEC_CMD);
+ OUT_BATCH(0);
+
+ OUT_BATCH(_3DSTATE_DFLT_Z_CMD);
+ OUT_BATCH(0);
+
+ OUT_BATCH(_3DSTATE_FOG_MODE_CMD);
+ OUT_BATCH(FOGFUNC_ENABLE |
+ FOG_LINEAR_CONST | FOGSRC_INDEX_Z | ENABLE_FOG_DENSITY);
+ OUT_BATCH(0);
+ OUT_BATCH(0);
+
+ OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD |
+ MAP_UNIT(0) |
+ DISABLE_TEX_STREAM_BUMP |
+ ENABLE_TEX_STREAM_COORD_SET |
+ TEX_STREAM_COORD_SET(0) |
+ ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(0));
+ OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD |
+ MAP_UNIT(1) |
+ DISABLE_TEX_STREAM_BUMP |
+ ENABLE_TEX_STREAM_COORD_SET |
+ TEX_STREAM_COORD_SET(1) |
+ ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(1));
+ OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD |
+ MAP_UNIT(2) |
+ DISABLE_TEX_STREAM_BUMP |
+ ENABLE_TEX_STREAM_COORD_SET |
+ TEX_STREAM_COORD_SET(2) |
+ ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(2));
+ OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD |
+ MAP_UNIT(3) |
+ DISABLE_TEX_STREAM_BUMP |
+ ENABLE_TEX_STREAM_COORD_SET |
+ TEX_STREAM_COORD_SET(3) |
+ ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(3));
+
+ OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM);
+ OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(0));
+ OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM);
+ OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(1));
+ OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM);
+ OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(2));
+ OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM);
+ OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(3));
+
+ OUT_BATCH(_3DSTATE_RASTER_RULES_CMD |
+ ENABLE_POINT_RASTER_RULE |
+ OGL_POINT_RASTER_RULE |
+ ENABLE_LINE_STRIP_PROVOKE_VRTX |
+ ENABLE_TRI_FAN_PROVOKE_VRTX |
+ ENABLE_TRI_STRIP_PROVOKE_VRTX |
+ LINE_STRIP_PROVOKE_VRTX(1) |
+ TRI_FAN_PROVOKE_VRTX(2) | TRI_STRIP_PROVOKE_VRTX(2));
+
+ OUT_BATCH(_3DSTATE_SCISSOR_ENABLE_CMD | DISABLE_SCISSOR_RECT);
+
+ OUT_BATCH(_3DSTATE_SCISSOR_RECT_0_CMD);
+ OUT_BATCH(0);
+ OUT_BATCH(0);
+
+ OUT_BATCH(_3DSTATE_VERTEX_TRANSFORM);
+ OUT_BATCH(DISABLE_VIEWPORT_TRANSFORM | DISABLE_PERSPECTIVE_DIVIDE);
+
+ OUT_BATCH(_3DSTATE_W_STATE_CMD);
+ OUT_BATCH(MAGIC_W_STATE_DWORD1);
+ OUT_BATCH(0x3f800000 /* 1.0 in IEEE float */ );
+
+ OUT_BATCH(_3DSTATE_COLOR_FACTOR_CMD);
+ OUT_BATCH(0x80808080); /* .5 required in alpha for GL_DOT3_RGBA_EXT */
+
+ OUT_BATCH(_3DSTATE_MAP_COORD_SETBIND_CMD);
+ OUT_BATCH(TEXBIND_SET3(TEXCOORDSRC_VTXSET_3) |
+ TEXBIND_SET2(TEXCOORDSRC_VTXSET_2) |
+ TEXBIND_SET1(TEXCOORDSRC_VTXSET_1) |
+ TEXBIND_SET0(TEXCOORDSRC_VTXSET_0));
+
+ /* copy from mesa */
+ OUT_BATCH(_3DSTATE_INDPT_ALPHA_BLEND_CMD |
+ DISABLE_INDPT_ALPHA_BLEND |
+ ENABLE_ALPHA_BLENDFUNC | ABLENDFUNC_ADD);
+
+ OUT_BATCH(_3DSTATE_FOG_COLOR_CMD |
+ FOG_COLOR_RED(0) | FOG_COLOR_GREEN(0) | FOG_COLOR_BLUE(0));
+
+ OUT_BATCH(_3DSTATE_CONST_BLEND_COLOR_CMD);
+ OUT_BATCH(0);
+
+ OUT_BATCH(_3DSTATE_MODES_1_CMD |
+ ENABLE_COLR_BLND_FUNC |
+ BLENDFUNC_ADD |
+ ENABLE_SRC_BLND_FACTOR |
+ SRC_BLND_FACT(BLENDFACTOR_ONE) |
+ ENABLE_DST_BLND_FACTOR | DST_BLND_FACT(BLENDFACTOR_ZERO));
+ OUT_BATCH(_3DSTATE_MODES_2_CMD | ENABLE_GLOBAL_DEPTH_BIAS | GLOBAL_DEPTH_BIAS(0) | ENABLE_ALPHA_TEST_FUNC | ALPHA_TEST_FUNC(0) | /* always */
+ ALPHA_REF_VALUE(0));
+ OUT_BATCH(_3DSTATE_MODES_3_CMD |
+ ENABLE_DEPTH_TEST_FUNC |
+ DEPTH_TEST_FUNC(0x2) | /* COMPAREFUNC_LESS */
+ ENABLE_ALPHA_SHADE_MODE |
+ ALPHA_SHADE_MODE(SHADE_MODE_LINEAR) |
+ ENABLE_FOG_SHADE_MODE |
+ FOG_SHADE_MODE(SHADE_MODE_LINEAR) |
+ ENABLE_SPEC_SHADE_MODE |
+ SPEC_SHADE_MODE(SHADE_MODE_LINEAR) |
+ ENABLE_COLOR_SHADE_MODE |
+ COLOR_SHADE_MODE(SHADE_MODE_LINEAR) |
+ ENABLE_CULL_MODE | CULLMODE_NONE);
+
+ OUT_BATCH(_3DSTATE_MODES_4_CMD |
+ ENABLE_LOGIC_OP_FUNC |
+ LOGIC_OP_FUNC(LOGICOP_COPY) |
+ ENABLE_STENCIL_TEST_MASK |
+ STENCIL_TEST_MASK(0xff) |
+ ENABLE_STENCIL_WRITE_MASK | STENCIL_WRITE_MASK(0xff));
+
+ OUT_BATCH(_3DSTATE_STENCIL_TEST_CMD |
+ ENABLE_STENCIL_PARMS |
+ STENCIL_FAIL_OP(0) | /* STENCILOP_KEEP */
+ STENCIL_PASS_DEPTH_FAIL_OP(0) | /* STENCILOP_KEEP */
+ STENCIL_PASS_DEPTH_PASS_OP(0) | /* STENCILOP_KEEP */
+ ENABLE_STENCIL_TEST_FUNC |
+ STENCIL_TEST_FUNC(0) | /* COMPAREFUNC_ALWAYS */
+ ENABLE_STENCIL_REF_VALUE |
+ STENCIL_REF_VALUE(0));
+
+ OUT_BATCH(_3DSTATE_MODES_5_CMD |
+ FLUSH_TEXTURE_CACHE |
+ ENABLE_SPRITE_POINT_TEX | SPRITE_POINT_TEX_OFF |
+ ENABLE_FIXED_LINE_WIDTH | FIXED_LINE_WIDTH(0x2) | /* 1.0 */
+ ENABLE_FIXED_POINT_WIDTH | FIXED_POINT_WIDTH(1));
+
+ OUT_BATCH(_3DSTATE_ENABLES_1_CMD |
+ DISABLE_LOGIC_OP |
+ DISABLE_STENCIL_TEST |
+ DISABLE_DEPTH_BIAS |
+ DISABLE_SPEC_ADD |
+ DISABLE_FOG |
+ DISABLE_ALPHA_TEST | ENABLE_COLOR_BLEND | DISABLE_DEPTH_TEST);
+ OUT_BATCH(_3DSTATE_ENABLES_2_CMD |
+ DISABLE_STENCIL_WRITE |
+ ENABLE_TEX_CACHE |
+ DISABLE_DITHER |
+ ENABLE_COLOR_MASK | ENABLE_COLOR_WRITE | DISABLE_DEPTH_WRITE);
+
+ OUT_BATCH(_3DSTATE_STIPPLE);
+
+ /* Set default blend state */
+ OUT_BATCH(_3DSTATE_MAP_BLEND_OP_CMD(0) |
+ TEXPIPE_COLOR |
+ ENABLE_TEXOUTPUT_WRT_SEL |
+ TEXOP_OUTPUT_CURRENT |
+ DISABLE_TEX_CNTRL_STAGE |
+ TEXOP_SCALE_1X |
+ TEXOP_MODIFY_PARMS | TEXOP_LAST_STAGE | TEXBLENDOP_ARG1);
+ OUT_BATCH(_3DSTATE_MAP_BLEND_OP_CMD(0) |
+ TEXPIPE_ALPHA |
+ ENABLE_TEXOUTPUT_WRT_SEL |
+ TEXOP_OUTPUT_CURRENT |
+ TEXOP_SCALE_1X | TEXOP_MODIFY_PARMS | TEXBLENDOP_ARG1);
+ OUT_BATCH(_3DSTATE_MAP_BLEND_ARG_CMD(0) |
+ TEXPIPE_COLOR |
+ TEXBLEND_ARG1 |
+ TEXBLENDARG_MODIFY_PARMS | TEXBLENDARG_DIFFUSE);
+ OUT_BATCH(_3DSTATE_MAP_BLEND_ARG_CMD(0) |
+ TEXPIPE_ALPHA |
+ TEXBLEND_ARG1 |
+ TEXBLENDARG_MODIFY_PARMS | TEXBLENDARG_DIFFUSE);
+
+ OUT_BATCH(_3DSTATE_AA_CMD |
+ AA_LINE_ECAAR_WIDTH_ENABLE |
+ AA_LINE_ECAAR_WIDTH_1_0 |
+ AA_LINE_REGION_WIDTH_ENABLE |
+ AA_LINE_REGION_WIDTH_1_0 | AA_LINE_DISABLE);
+
+ ADVANCE_BATCH();
}
diff --git a/src/i830_accel.c b/src/i830_accel.c
index a298db62..bc71611b 100644
--- a/src/i830_accel.c
+++ b/src/i830_accel.c
@@ -49,54 +49,49 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "i830_ring.h"
#include "i915_drm.h"
-unsigned long
-intel_get_pixmap_pitch(PixmapPtr pPix)
+unsigned long intel_get_pixmap_pitch(PixmapPtr pPix)
{
- return (unsigned long)pPix->devKind;
+ return (unsigned long)pPix->devKind;
}
-void
-I830Sync(ScrnInfoPtr pScrn)
+void I830Sync(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- if (I810_DEBUG & (DEBUG_VERBOSE_ACCEL | DEBUG_VERBOSE_SYNC))
- ErrorF("I830Sync\n");
+ if (I810_DEBUG & (DEBUG_VERBOSE_ACCEL | DEBUG_VERBOSE_SYNC))
+ ErrorF("I830Sync\n");
- if (!pScrn->vtSema || !pI830->batch_bo)
- return;
+ if (!pScrn->vtSema || !pI830->batch_bo)
+ return;
- I830EmitFlush(pScrn);
+ I830EmitFlush(pScrn);
- intel_batch_flush(pScrn, TRUE);
- intel_batch_wait_last(pScrn);
+ intel_batch_flush(pScrn, TRUE);
+ intel_batch_wait_last(pScrn);
}
-void
-I830EmitFlush(ScrnInfoPtr pScrn)
+void I830EmitFlush(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int flags = MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE;
+ I830Ptr pI830 = I830PTR(pScrn);
+ int flags = MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE;
- if (IS_I965G(pI830))
- flags = 0;
+ if (IS_I965G(pI830))
+ flags = 0;
- {
- BEGIN_BATCH(1);
- OUT_BATCH(MI_FLUSH | flags);
- ADVANCE_BATCH();
- }
+ {
+ BEGIN_BATCH(1);
+ OUT_BATCH(MI_FLUSH | flags);
+ ADVANCE_BATCH();
+ }
}
-
#if (ALWAYS_SYNC || ALWAYS_FLUSH)
-void
-i830_debug_sync(ScrnInfoPtr scrn)
+void i830_debug_sync(ScrnInfoPtr scrn)
{
- if (ALWAYS_SYNC)
- I830Sync(scrn);
- else
- intel_batch_flush(scrn, FALSE);
+ if (ALWAYS_SYNC)
+ I830Sync(scrn);
+ else
+ intel_batch_flush(scrn, FALSE);
}
#endif
@@ -104,61 +99,60 @@ i830_debug_sync(ScrnInfoPtr scrn)
* from the FbInit() function in the SVGA driver, or before ScreenInit
* in a monolithic server.
*/
-Bool
-I830AccelInit(ScreenPtr pScreen)
+Bool I830AccelInit(ScreenPtr pScreen)
{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
-
- /* Limits are described in the BLT engine chapter under Graphics Data Size
- * Limitations, and the descriptions of SURFACE_STATE, 3DSTATE_BUFFER_INFO,
- * 3DSTATE_DRAWING_RECTANGLE, 3DSTATE_MAP_INFO, and 3DSTATE_MAP_INFO.
- *
- * i845 through i965 limits 2D rendering to 65536 lines and pitch of 32768.
- *
- * i965 limits 3D surface to (2*element size)-aligned offset if un-tiled.
- * i965 limits 3D surface to 4kB-aligned offset if tiled.
- * i965 limits 3D surfaces to w,h of ?,8192.
- * i965 limits 3D surface to pitch of 1B - 128kB.
- * i965 limits 3D surface pitch alignment to 1 or 2 times the element size.
- * i965 limits 3D surface pitch alignment to 512B if tiled.
- * i965 limits 3D destination drawing rect to w,h of 8192,8192.
- *
- * i915 limits 3D textures to 4B-aligned offset if un-tiled.
- * i915 limits 3D textures to ~4kB-aligned offset if tiled.
- * i915 limits 3D textures to width,height of 2048,2048.
- * i915 limits 3D textures to pitch of 16B - 8kB, in dwords.
- * i915 limits 3D destination to ~4kB-aligned offset if tiled.
- * i915 limits 3D destination to pitch of 16B - 8kB, in dwords, if un-tiled.
- * i915 limits 3D destination to pitch 64B-aligned if used with depth.
- * i915 limits 3D destination to pitch of 512B - 8kB, in tiles, if tiled.
- * i915 limits 3D destination to POT aligned pitch if tiled.
- * i915 limits 3D destination drawing rect to w,h of 2048,2048.
- *
- * i845 limits 3D textures to 4B-aligned offset if un-tiled.
- * i845 limits 3D textures to ~4kB-aligned offset if tiled.
- * i845 limits 3D textures to width,height of 2048,2048.
- * i845 limits 3D textures to pitch of 4B - 8kB, in dwords.
- * i845 limits 3D destination to 4B-aligned offset if un-tiled.
- * i845 limits 3D destination to ~4kB-aligned offset if tiled.
- * i845 limits 3D destination to pitch of 8B - 8kB, in dwords.
- * i845 limits 3D destination drawing rect to w,h of 2048,2048.
- *
- * For the tiled issues, the only tiled buffer we draw to should be
- * the front, which will have an appropriate pitch/offset already set up,
- * so UXA doesn't need to worry.
- */
- if (IS_I965G(pI830)) {
- pI830->accel_pixmap_offset_alignment = 4 * 2;
- pI830->accel_pixmap_pitch_alignment = 64;
- pI830->accel_max_x = 8192;
- pI830->accel_max_y = 8192;
- } else {
- pI830->accel_pixmap_offset_alignment = 4;
- pI830->accel_pixmap_pitch_alignment = 64;
- pI830->accel_max_x = 2048;
- pI830->accel_max_y = 2048;
- }
-
- return i830_uxa_init(pScreen);
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ /* Limits are described in the BLT engine chapter under Graphics Data Size
+ * Limitations, and the descriptions of SURFACE_STATE, 3DSTATE_BUFFER_INFO,
+ * 3DSTATE_DRAWING_RECTANGLE, 3DSTATE_MAP_INFO, and 3DSTATE_MAP_INFO.
+ *
+ * i845 through i965 limits 2D rendering to 65536 lines and pitch of 32768.
+ *
+ * i965 limits 3D surface to (2*element size)-aligned offset if un-tiled.
+ * i965 limits 3D surface to 4kB-aligned offset if tiled.
+ * i965 limits 3D surfaces to w,h of ?,8192.
+ * i965 limits 3D surface to pitch of 1B - 128kB.
+ * i965 limits 3D surface pitch alignment to 1 or 2 times the element size.
+ * i965 limits 3D surface pitch alignment to 512B if tiled.
+ * i965 limits 3D destination drawing rect to w,h of 8192,8192.
+ *
+ * i915 limits 3D textures to 4B-aligned offset if un-tiled.
+ * i915 limits 3D textures to ~4kB-aligned offset if tiled.
+ * i915 limits 3D textures to width,height of 2048,2048.
+ * i915 limits 3D textures to pitch of 16B - 8kB, in dwords.
+ * i915 limits 3D destination to ~4kB-aligned offset if tiled.
+ * i915 limits 3D destination to pitch of 16B - 8kB, in dwords, if un-tiled.
+ * i915 limits 3D destination to pitch 64B-aligned if used with depth.
+ * i915 limits 3D destination to pitch of 512B - 8kB, in tiles, if tiled.
+ * i915 limits 3D destination to POT aligned pitch if tiled.
+ * i915 limits 3D destination drawing rect to w,h of 2048,2048.
+ *
+ * i845 limits 3D textures to 4B-aligned offset if un-tiled.
+ * i845 limits 3D textures to ~4kB-aligned offset if tiled.
+ * i845 limits 3D textures to width,height of 2048,2048.
+ * i845 limits 3D textures to pitch of 4B - 8kB, in dwords.
+ * i845 limits 3D destination to 4B-aligned offset if un-tiled.
+ * i845 limits 3D destination to ~4kB-aligned offset if tiled.
+ * i845 limits 3D destination to pitch of 8B - 8kB, in dwords.
+ * i845 limits 3D destination drawing rect to w,h of 2048,2048.
+ *
+ * For the tiled issues, the only tiled buffer we draw to should be
+ * the front, which will have an appropriate pitch/offset already set up,
+ * so UXA doesn't need to worry.
+ */
+ if (IS_I965G(pI830)) {
+ pI830->accel_pixmap_offset_alignment = 4 * 2;
+ pI830->accel_pixmap_pitch_alignment = 64;
+ pI830->accel_max_x = 8192;
+ pI830->accel_max_y = 8192;
+ } else {
+ pI830->accel_pixmap_offset_alignment = 4;
+ pI830->accel_pixmap_pitch_alignment = 64;
+ pI830->accel_max_x = 2048;
+ pI830->accel_max_y = 2048;
+ }
+
+ return i830_uxa_init(pScreen);
}
diff --git a/src/i830_batchbuffer.c b/src/i830_batchbuffer.c
index 88244349..48a2e1e9 100644
--- a/src/i830_batchbuffer.c
+++ b/src/i830_batchbuffer.c
@@ -39,113 +39,113 @@
#include "i830_ring.h"
#include "i915_drm.h"
-static void
-intel_next_batch(ScrnInfoPtr pScrn)
+static void intel_next_batch(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
-
- /* The 865 has issues with larger-than-page-sized batch buffers. */
- if (IS_I865G(pI830))
- pI830->batch_bo = dri_bo_alloc(pI830->bufmgr, "batch", 4096, 4096);
- else
- pI830->batch_bo = dri_bo_alloc(pI830->bufmgr, "batch", 4096 * 4, 4096);
-
- if (dri_bo_map(pI830->batch_bo, 1) != 0)
- FatalError("Failed to map batchbuffer: %s\n", strerror(errno));
-
- pI830->batch_used = 0;
- pI830->batch_ptr = pI830->batch_bo->virtual;
-
- /* If we are using DRI2, we don't know when another client has executed,
- * so we have to reinitialize our 3D state per batch.
- */
- if (pI830->directRenderingType == DRI_DRI2)
- pI830->last_3d = LAST_3D_OTHER;
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ /* The 865 has issues with larger-than-page-sized batch buffers. */
+ if (IS_I865G(pI830))
+ pI830->batch_bo =
+ dri_bo_alloc(pI830->bufmgr, "batch", 4096, 4096);
+ else
+ pI830->batch_bo =
+ dri_bo_alloc(pI830->bufmgr, "batch", 4096 * 4, 4096);
+
+ if (dri_bo_map(pI830->batch_bo, 1) != 0)
+ FatalError("Failed to map batchbuffer: %s\n", strerror(errno));
+
+ pI830->batch_used = 0;
+ pI830->batch_ptr = pI830->batch_bo->virtual;
+
+ /* If we are using DRI2, we don't know when another client has executed,
+ * so we have to reinitialize our 3D state per batch.
+ */
+ if (pI830->directRenderingType == DRI_DRI2)
+ pI830->last_3d = LAST_3D_OTHER;
}
-void
-intel_batch_init(ScrnInfoPtr pScrn)
+void intel_batch_init(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- pI830->batch_emit_start = 0;
- pI830->batch_emitting = 0;
+ pI830->batch_emit_start = 0;
+ pI830->batch_emitting = 0;
- intel_next_batch(pScrn);
+ intel_next_batch(pScrn);
}
-void
-intel_batch_teardown(ScrnInfoPtr pScrn)
+void intel_batch_teardown(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- if (pI830->batch_ptr != NULL) {
- dri_bo_unmap(pI830->batch_bo);
- pI830->batch_ptr = NULL;
+ if (pI830->batch_ptr != NULL) {
+ dri_bo_unmap(pI830->batch_bo);
+ pI830->batch_ptr = NULL;
- dri_bo_unreference(pI830->batch_bo);
- pI830->batch_bo = NULL;
+ dri_bo_unreference(pI830->batch_bo);
+ pI830->batch_bo = NULL;
- dri_bo_unreference(pI830->last_batch_bo);
- pI830->last_batch_bo = NULL;
- }
+ dri_bo_unreference(pI830->last_batch_bo);
+ pI830->last_batch_bo = NULL;
+ }
}
-void
-intel_batch_flush(ScrnInfoPtr pScrn, Bool flushed)
+void intel_batch_flush(ScrnInfoPtr pScrn, Bool flushed)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int ret;
+ I830Ptr pI830 = I830PTR(pScrn);
+ int ret;
- if (pI830->batch_used == 0)
- return;
+ if (pI830->batch_used == 0)
+ return;
- /* Emit a padding dword if we aren't going to be quad-word aligned. */
- if ((pI830->batch_used & 4) == 0) {
- *(uint32_t *)(pI830->batch_ptr + pI830->batch_used) = MI_NOOP;
- pI830->batch_used += 4;
- }
+ /* Emit a padding dword if we aren't going to be quad-word aligned. */
+ if ((pI830->batch_used & 4) == 0) {
+ *(uint32_t *) (pI830->batch_ptr + pI830->batch_used) = MI_NOOP;
+ pI830->batch_used += 4;
+ }
- /* Mark the end of the batchbuffer. */
- *(uint32_t *)(pI830->batch_ptr + pI830->batch_used) = MI_BATCH_BUFFER_END;
- pI830->batch_used += 4;
+ /* Mark the end of the batchbuffer. */
+ *(uint32_t *) (pI830->batch_ptr + pI830->batch_used) =
+ MI_BATCH_BUFFER_END;
+ pI830->batch_used += 4;
- dri_bo_unmap(pI830->batch_bo);
- pI830->batch_ptr = NULL;
+ dri_bo_unmap(pI830->batch_bo);
+ pI830->batch_ptr = NULL;
- ret = dri_bo_exec(pI830->batch_bo, pI830->batch_used, NULL, 0, 0xffffffff);
- if (ret != 0)
- FatalError("Failed to submit batchbuffer: %s\n", strerror(-ret));
+ ret =
+ dri_bo_exec(pI830->batch_bo, pI830->batch_used, NULL, 0,
+ 0xffffffff);
+ if (ret != 0)
+ FatalError("Failed to submit batchbuffer: %s\n",
+ strerror(-ret));
- /* Save a ref to the last batch emitted, which we use for syncing
- * in debug code.
- */
- dri_bo_unreference(pI830->last_batch_bo);
- pI830->last_batch_bo = pI830->batch_bo;
- pI830->batch_bo = NULL;
+ /* Save a ref to the last batch emitted, which we use for syncing
+ * in debug code.
+ */
+ dri_bo_unreference(pI830->last_batch_bo);
+ pI830->last_batch_bo = pI830->batch_bo;
+ pI830->batch_bo = NULL;
- intel_next_batch(pScrn);
+ intel_next_batch(pScrn);
- /* Mark that we need to flush whatever potential rendering we've done in the
- * blockhandler. We could set this less often, but it's probably not worth
- * the work.
- */
- pI830->need_mi_flush = TRUE;
+ /* Mark that we need to flush whatever potential rendering we've done in the
+ * blockhandler. We could set this less often, but it's probably not worth
+ * the work.
+ */
+ pI830->need_mi_flush = TRUE;
- if (pI830->batch_flush_notify)
- pI830->batch_flush_notify (pScrn);
+ if (pI830->batch_flush_notify)
+ pI830->batch_flush_notify(pScrn);
}
/** Waits on the last emitted batchbuffer to be completed. */
-void
-intel_batch_wait_last(ScrnInfoPtr scrn)
+void intel_batch_wait_last(ScrnInfoPtr scrn)
{
- I830Ptr pI830 = I830PTR(scrn);
+ I830Ptr pI830 = I830PTR(scrn);
- /* Map it CPU write, which guarantees it's done. This is a completely
- * non performance path, so we don't need anything better.
- */
- drm_intel_bo_map(pI830->last_batch_bo, TRUE);
- drm_intel_bo_unmap(pI830->last_batch_bo);
+ /* Map it CPU write, which guarantees it's done. This is a completely
+ * non performance path, so we don't need anything better.
+ */
+ drm_intel_bo_map(pI830->last_batch_bo, TRUE);
+ drm_intel_bo_unmap(pI830->last_batch_bo);
}
-
diff --git a/src/i830_batchbuffer.h b/src/i830_batchbuffer.h
index 02834381..a00a4364 100644
--- a/src/i830_batchbuffer.h
+++ b/src/i830_batchbuffer.h
@@ -37,63 +37,59 @@ void intel_batch_teardown(ScrnInfoPtr pScrn);
void intel_batch_flush(ScrnInfoPtr pScrn, Bool flushed);
void intel_batch_wait_last(ScrnInfoPtr pScrn);
-static inline int
-intel_batch_space(I830Ptr pI830)
+static inline int intel_batch_space(I830Ptr pI830)
{
- return (pI830->batch_bo->size - BATCH_RESERVED) - (pI830->batch_used);
+ return (pI830->batch_bo->size - BATCH_RESERVED) - (pI830->batch_used);
}
static inline void
intel_batch_require_space(ScrnInfoPtr pScrn, I830Ptr pI830, GLuint sz)
{
- assert(sz < pI830->batch_bo->size - 8);
- if (intel_batch_space(pI830) < sz)
- intel_batch_flush(pScrn, FALSE);
+ assert(sz < pI830->batch_bo->size - 8);
+ if (intel_batch_space(pI830) < sz)
+ intel_batch_flush(pScrn, FALSE);
}
-static inline void
-intel_batch_start_atomic(ScrnInfoPtr pScrn, unsigned int sz)
+static inline void intel_batch_start_atomic(ScrnInfoPtr pScrn, unsigned int sz)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- assert(!pI830->in_batch_atomic);
- intel_batch_require_space(pScrn, pI830, sz * 4);
+ assert(!pI830->in_batch_atomic);
+ intel_batch_require_space(pScrn, pI830, sz * 4);
- pI830->in_batch_atomic = TRUE;
- pI830->batch_atomic_limit = pI830->batch_used + sz * 4;
+ pI830->in_batch_atomic = TRUE;
+ pI830->batch_atomic_limit = pI830->batch_used + sz * 4;
}
-static inline void
-intel_batch_end_atomic(ScrnInfoPtr pScrn)
+static inline void intel_batch_end_atomic(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- assert(pI830->in_batch_atomic);
- assert(pI830->batch_used <= pI830->batch_atomic_limit);
- pI830->in_batch_atomic = FALSE;
+ assert(pI830->in_batch_atomic);
+ assert(pI830->batch_used <= pI830->batch_atomic_limit);
+ pI830->in_batch_atomic = FALSE;
}
-static inline void
-intel_batch_emit_dword(I830Ptr pI830, uint32_t dword)
+static inline void intel_batch_emit_dword(I830Ptr pI830, uint32_t dword)
{
- assert(pI830->batch_ptr != NULL);
- assert(intel_batch_space(pI830) >= 4);
- *(uint32_t *)(pI830->batch_ptr + pI830->batch_used) = dword;
- pI830->batch_used += 4;
+ assert(pI830->batch_ptr != NULL);
+ assert(intel_batch_space(pI830) >= 4);
+ *(uint32_t *) (pI830->batch_ptr + pI830->batch_used) = dword;
+ pI830->batch_used += 4;
}
static inline void
-intel_batch_emit_reloc (I830Ptr pI830,
- dri_bo *bo,
- uint32_t read_domains,
- uint32_t write_domains,
- uint32_t delta)
+intel_batch_emit_reloc(I830Ptr pI830,
+ dri_bo * bo,
+ uint32_t read_domains,
+ uint32_t write_domains, uint32_t delta)
{
- assert(intel_batch_space(pI830) >= 4);
- *(uint32_t *)(pI830->batch_ptr + pI830->batch_used) = bo->offset + delta;
- dri_bo_emit_reloc(pI830->batch_bo, read_domains, write_domains, delta,
- pI830->batch_used, bo);
- pI830->batch_used += 4;
+ assert(intel_batch_space(pI830) >= 4);
+ *(uint32_t *) (pI830->batch_ptr + pI830->batch_used) =
+ bo->offset + delta;
+ dri_bo_emit_reloc(pI830->batch_bo, read_domains, write_domains, delta,
+ pI830->batch_used, bo);
+ pI830->batch_used += 4;
}
static inline void
@@ -101,10 +97,10 @@ intel_batch_emit_reloc_pixmap(I830Ptr pI830, PixmapPtr pPixmap,
uint32_t read_domains, uint32_t write_domain,
uint32_t delta)
{
- dri_bo *bo = i830_get_pixmap_bo(pPixmap);
- assert(pI830->batch_ptr != NULL);
- assert(intel_batch_space(pI830) >= 4);
- intel_batch_emit_reloc(pI830, bo, read_domains, write_domain, delta);
+ dri_bo *bo = i830_get_pixmap_bo(pPixmap);
+ assert(pI830->batch_ptr != NULL);
+ assert(intel_batch_space(pI830) >= 4);
+ intel_batch_emit_reloc(pI830, bo, read_domains, write_domain, delta);
}
#define OUT_BATCH(dword) intel_batch_emit_dword(pI830, dword)
@@ -128,33 +124,36 @@ union intfloat {
#define BEGIN_BATCH(n) \
do { \
- if (pI830->batch_emitting != 0) \
- FatalError("%s: BEGIN_BATCH called without closing " \
- "ADVANCE_BATCH\n", __FUNCTION__); \
- intel_batch_require_space(pScrn, pI830, (n) * 4); \
- pI830->batch_emitting = (n) * 4; \
- pI830->batch_emit_start = pI830->batch_used; \
+ if (pI830->batch_emitting != 0) \
+ FatalError("%s: BEGIN_BATCH called without closing " \
+ "ADVANCE_BATCH\n", __FUNCTION__); \
+ intel_batch_require_space(pScrn, pI830, (n) * 4); \
+ pI830->batch_emitting = (n) * 4; \
+ pI830->batch_emit_start = pI830->batch_used; \
} while (0)
#define ADVANCE_BATCH() do { \
- if (pI830->batch_emitting == 0) \
- FatalError("%s: ADVANCE_BATCH called with no matching " \
- "BEGIN_BATCH\n", __FUNCTION__); \
- if (pI830->batch_used > pI830->batch_emit_start + pI830->batch_emitting) \
- FatalError("%s: ADVANCE_BATCH: exceeded allocation %d/%d\n ", \
- __FUNCTION__, \
- pI830->batch_used - pI830->batch_emit_start, \
- pI830->batch_emitting); \
- if (pI830->batch_used < pI830->batch_emit_start + pI830->batch_emitting) \
- FatalError("%s: ADVANCE_BATCH: under-used allocation %d/%d\n ", \
- __FUNCTION__, \
- pI830->batch_used - pI830->batch_emit_start, \
- pI830->batch_emitting); \
- if ((pI830->batch_emitting > 8) && (I810_DEBUG & DEBUG_ALWAYS_SYNC)) { \
- /* Note: not actually syncing, just flushing each batch. */ \
- intel_batch_flush(pScrn, FALSE); \
- } \
- pI830->batch_emitting = 0; \
+ if (pI830->batch_emitting == 0) \
+ FatalError("%s: ADVANCE_BATCH called with no matching " \
+ "BEGIN_BATCH\n", __FUNCTION__); \
+ if (pI830->batch_used > \
+ pI830->batch_emit_start + pI830->batch_emitting) \
+ FatalError("%s: ADVANCE_BATCH: exceeded allocation %d/%d\n ", \
+ __FUNCTION__, \
+ pI830->batch_used - pI830->batch_emit_start, \
+ pI830->batch_emitting); \
+ if (pI830->batch_used < pI830->batch_emit_start + \
+ pI830->batch_emitting) \
+ FatalError("%s: ADVANCE_BATCH: under-used allocation %d/%d\n ", \
+ __FUNCTION__, \
+ pI830->batch_used - pI830->batch_emit_start, \
+ pI830->batch_emitting); \
+ if ((pI830->batch_emitting > 8) && \
+ (I810_DEBUG & DEBUG_ALWAYS_SYNC)) { \
+ /* Note: not actually syncing, just flushing each batch. */ \
+ intel_batch_flush(pScrn, FALSE); \
+ } \
+ pI830->batch_emitting = 0; \
} while (0)
#endif /* _INTEL_BATCHBUFFER_H */
diff --git a/src/i830_bios.c b/src/i830_bios.c
index f4a20053..b8439407 100644
--- a/src/i830_bios.c
+++ b/src/i830_bios.c
@@ -26,7 +26,7 @@
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
-#undef VERSION /* XXX edid.h has a VERSION too */
+#undef VERSION /* XXX edid.h has a VERSION too */
#endif
#include <stdio.h>
@@ -49,59 +49,54 @@
#define SLAVE_ADDR1 0x70
#define SLAVE_ADDR2 0x72
-static void *
-find_section(struct bdb_header *bdb, int section_id)
+static void *find_section(struct bdb_header *bdb, int section_id)
{
- unsigned char *base = (unsigned char *)bdb;
- int index = 0;
- uint16_t total, current_size;
- unsigned char current_id;
-
- /* skip to first section */
- index += bdb->header_size;
- total = bdb->bdb_size;
-
- /* walk the sections looking for section_id */
- while (index < total) {
- current_id = *(base + index);
- index++;
- current_size = *((uint16_t *)(base + index));
- index += 2;
- if (current_id == section_id)
- return base + index;
- index += current_size;
- }
-
- return NULL;
+ unsigned char *base = (unsigned char *)bdb;
+ int index = 0;
+ uint16_t total, current_size;
+ unsigned char current_id;
+
+ /* skip to first section */
+ index += bdb->header_size;
+ total = bdb->bdb_size;
+
+ /* walk the sections looking for section_id */
+ while (index < total) {
+ current_id = *(base + index);
+ index++;
+ current_size = *((uint16_t *) (base + index));
+ index += 2;
+ if (current_id == section_id)
+ return base + index;
+ index += current_size;
+ }
+
+ return NULL;
}
static void
fill_detail_timing_data(DisplayModePtr fixed_mode, unsigned char *timing_ptr)
{
- fixed_mode->HDisplay = _H_ACTIVE(timing_ptr);
- fixed_mode->VDisplay = _V_ACTIVE(timing_ptr);
- fixed_mode->HSyncStart = fixed_mode->HDisplay +
- _H_SYNC_OFF(timing_ptr);
- fixed_mode->HSyncEnd = fixed_mode->HSyncStart +
- _H_SYNC_WIDTH(timing_ptr);
- fixed_mode->HTotal = fixed_mode->HDisplay +
- _H_BLANK(timing_ptr);
- fixed_mode->VSyncStart = fixed_mode->VDisplay +
- _V_SYNC_OFF(timing_ptr);
- fixed_mode->VSyncEnd = fixed_mode->VSyncStart +
- _V_SYNC_WIDTH(timing_ptr);
- fixed_mode->VTotal = fixed_mode->VDisplay +
- _V_BLANK(timing_ptr);
- fixed_mode->Clock = _PIXEL_CLOCK(timing_ptr) / 1000;
- fixed_mode->type = M_T_PREFERRED;
-
- /* Some VBTs have bogus h/vtotal values */
- if (fixed_mode->HSyncEnd > fixed_mode->HTotal)
- fixed_mode->HTotal = fixed_mode->HSyncEnd + 1;
- if (fixed_mode->VSyncEnd > fixed_mode->VTotal)
- fixed_mode->VTotal = fixed_mode->VSyncEnd + 1;
-
- xf86SetModeDefaultName(fixed_mode);
+ fixed_mode->HDisplay = _H_ACTIVE(timing_ptr);
+ fixed_mode->VDisplay = _V_ACTIVE(timing_ptr);
+ fixed_mode->HSyncStart = fixed_mode->HDisplay + _H_SYNC_OFF(timing_ptr);
+ fixed_mode->HSyncEnd = fixed_mode->HSyncStart +
+ _H_SYNC_WIDTH(timing_ptr);
+ fixed_mode->HTotal = fixed_mode->HDisplay + _H_BLANK(timing_ptr);
+ fixed_mode->VSyncStart = fixed_mode->VDisplay + _V_SYNC_OFF(timing_ptr);
+ fixed_mode->VSyncEnd = fixed_mode->VSyncStart +
+ _V_SYNC_WIDTH(timing_ptr);
+ fixed_mode->VTotal = fixed_mode->VDisplay + _V_BLANK(timing_ptr);
+ fixed_mode->Clock = _PIXEL_CLOCK(timing_ptr) / 1000;
+ fixed_mode->type = M_T_PREFERRED;
+
+ /* Some VBTs have bogus h/vtotal values */
+ if (fixed_mode->HSyncEnd > fixed_mode->HTotal)
+ fixed_mode->HTotal = fixed_mode->HSyncEnd + 1;
+ if (fixed_mode->VSyncEnd > fixed_mode->VTotal)
+ fixed_mode->VTotal = fixed_mode->VSyncEnd + 1;
+
+ xf86SetModeDefaultName(fixed_mode);
}
@@ -113,220 +108,219 @@ fill_detail_timing_data(DisplayModePtr fixed_mode, unsigned char *timing_ptr)
* offsets, such that this parsing fails. Thus, almost any other method for
* detecting the panel mode is preferable.
*/
-static void
-parse_integrated_panel_data(I830Ptr pI830, struct bdb_header *bdb)
+static void parse_integrated_panel_data(I830Ptr pI830, struct bdb_header *bdb)
{
- struct bdb_lvds_options *lvds_options;
- struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs;
- struct bdb_lvds_lfp_data *lvds_data;
- struct bdb_lvds_lfp_data_entry *entry;
- DisplayModePtr fixed_mode;
- unsigned char *timing_ptr;
- int lfp_data_size;
- int dvo_offset;
-
- /* Defaults if we can't find VBT info */
- pI830->lvds_dither = 0;
-
- lvds_options = find_section(bdb, BDB_LVDS_OPTIONS);
- if (!lvds_options)
- return;
-
- pI830->lvds_dither = lvds_options->pixel_dither;
- if (lvds_options->panel_type == 0xff)
- return;
-
- lvds_data = find_section(bdb, BDB_LVDS_LFP_DATA);
- if (!lvds_data) {
- return;
- }
-
- lvds_lfp_data_ptrs = find_section(bdb, BDB_LVDS_LFP_DATA_PTRS);
- if (!lvds_lfp_data_ptrs)
- return;
-
- lfp_data_size = lvds_lfp_data_ptrs->ptr[1].dvo_timing_offset -
- lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset;
- dvo_offset = lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset -
- lvds_lfp_data_ptrs->ptr[0].fp_timing_offset;
- entry = (struct bdb_lvds_lfp_data_entry *)((uint8_t *)lvds_data->data +
- (lfp_data_size * lvds_options->panel_type));
- timing_ptr = (unsigned char *)entry + dvo_offset;
- if (pI830->skip_panel_detect)
- return;
-
- fixed_mode = xnfalloc(sizeof(DisplayModeRec));
- memset(fixed_mode, 0, sizeof(*fixed_mode));
+ struct bdb_lvds_options *lvds_options;
+ struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs;
+ struct bdb_lvds_lfp_data *lvds_data;
+ struct bdb_lvds_lfp_data_entry *entry;
+ DisplayModePtr fixed_mode;
+ unsigned char *timing_ptr;
+ int lfp_data_size;
+ int dvo_offset;
+
+ /* Defaults if we can't find VBT info */
+ pI830->lvds_dither = 0;
+
+ lvds_options = find_section(bdb, BDB_LVDS_OPTIONS);
+ if (!lvds_options)
+ return;
+
+ pI830->lvds_dither = lvds_options->pixel_dither;
+ if (lvds_options->panel_type == 0xff)
+ return;
+
+ lvds_data = find_section(bdb, BDB_LVDS_LFP_DATA);
+ if (!lvds_data) {
+ return;
+ }
- /* Since lvds_bdb_2_fp_edid_dtd is just an EDID detailed timing
- * block, pull the contents out using EDID macros.
- */
- fill_detail_timing_data(fixed_mode, timing_ptr);
- pI830->lvds_fixed_mode = fixed_mode;
+ lvds_lfp_data_ptrs = find_section(bdb, BDB_LVDS_LFP_DATA_PTRS);
+ if (!lvds_lfp_data_ptrs)
+ return;
+
+ lfp_data_size = lvds_lfp_data_ptrs->ptr[1].dvo_timing_offset -
+ lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset;
+ dvo_offset = lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset -
+ lvds_lfp_data_ptrs->ptr[0].fp_timing_offset;
+ entry = (struct bdb_lvds_lfp_data_entry *)((uint8_t *) lvds_data->data +
+ (lfp_data_size *
+ lvds_options->panel_type));
+ timing_ptr = (unsigned char *)entry + dvo_offset;
+ if (pI830->skip_panel_detect)
+ return;
+
+ fixed_mode = xnfalloc(sizeof(DisplayModeRec));
+ memset(fixed_mode, 0, sizeof(*fixed_mode));
+
+ /* Since lvds_bdb_2_fp_edid_dtd is just an EDID detailed timing
+ * block, pull the contents out using EDID macros.
+ */
+ fill_detail_timing_data(fixed_mode, timing_ptr);
+ pI830->lvds_fixed_mode = fixed_mode;
}
-static void
-parse_sdvo_panel_data(I830Ptr pI830, struct bdb_header *bdb)
+static void parse_sdvo_panel_data(I830Ptr pI830, struct bdb_header *bdb)
{
- DisplayModePtr fixed_mode;
- struct bdb_sdvo_lvds_options *sdvo_lvds_options;
- unsigned char *timing_ptr;
+ DisplayModePtr fixed_mode;
+ struct bdb_sdvo_lvds_options *sdvo_lvds_options;
+ unsigned char *timing_ptr;
- pI830->sdvo_lvds_fixed_mode = NULL;
+ pI830->sdvo_lvds_fixed_mode = NULL;
- sdvo_lvds_options = find_section(bdb, BDB_SDVO_LVDS_OPTIONS);
- if (sdvo_lvds_options == NULL)
- return;
+ sdvo_lvds_options = find_section(bdb, BDB_SDVO_LVDS_OPTIONS);
+ if (sdvo_lvds_options == NULL)
+ return;
- timing_ptr = find_section(bdb, BDB_SDVO_PANEL_DTDS);
- if (timing_ptr == NULL)
- return;
+ timing_ptr = find_section(bdb, BDB_SDVO_PANEL_DTDS);
+ if (timing_ptr == NULL)
+ return;
- fixed_mode = xnfalloc(sizeof(DisplayModeRec));
- if (fixed_mode == NULL)
- return;
+ fixed_mode = xnfalloc(sizeof(DisplayModeRec));
+ if (fixed_mode == NULL)
+ return;
- memset(fixed_mode, 0, sizeof(*fixed_mode));
- fill_detail_timing_data(fixed_mode, timing_ptr +
- (sdvo_lvds_options->panel_type * DET_TIMING_INFO_LEN));
- pI830->sdvo_lvds_fixed_mode = fixed_mode;
+ memset(fixed_mode, 0, sizeof(*fixed_mode));
+ fill_detail_timing_data(fixed_mode, timing_ptr +
+ (sdvo_lvds_options->panel_type *
+ DET_TIMING_INFO_LEN));
+ pI830->sdvo_lvds_fixed_mode = fixed_mode;
}
-static void
-parse_panel_data(I830Ptr pI830, struct bdb_header *bdb)
+static void parse_panel_data(I830Ptr pI830, struct bdb_header *bdb)
{
- parse_integrated_panel_data(pI830, bdb);
- parse_sdvo_panel_data(pI830, bdb);
+ parse_integrated_panel_data(pI830, bdb);
+ parse_sdvo_panel_data(pI830, bdb);
}
-static void
-parse_general_features(I830Ptr pI830, struct bdb_header *bdb)
+static void parse_general_features(I830Ptr pI830, struct bdb_header *bdb)
{
- struct bdb_general_features *general;
-
- /* Set sensible defaults in case we can't find the general block */
- pI830->tv_present = 1;
-
- general = find_section(bdb, BDB_GENERAL_FEATURES);
- if (!general)
- return;
-
- pI830->tv_present = general->int_tv_support;
- pI830->lvds_use_ssc = general->enable_ssc;
- if (pI830->lvds_use_ssc) {
- if (IS_I85X(pI830))
- pI830->lvds_ssc_freq = general->ssc_freq ? 66 : 48;
- else
- pI830->lvds_ssc_freq = general->ssc_freq ? 100 : 96;
- }
+ struct bdb_general_features *general;
+
+ /* Set sensible defaults in case we can't find the general block */
+ pI830->tv_present = 1;
+
+ general = find_section(bdb, BDB_GENERAL_FEATURES);
+ if (!general)
+ return;
+
+ pI830->tv_present = general->int_tv_support;
+ pI830->lvds_use_ssc = general->enable_ssc;
+ if (pI830->lvds_use_ssc) {
+ if (IS_I85X(pI830))
+ pI830->lvds_ssc_freq = general->ssc_freq ? 66 : 48;
+ else
+ pI830->lvds_ssc_freq = general->ssc_freq ? 100 : 96;
+ }
}
-static void
-parse_driver_feature(I830Ptr pI830, struct bdb_header *bdb)
+static void parse_driver_feature(I830Ptr pI830, struct bdb_header *bdb)
{
- struct bdb_driver_feature *feature;
+ struct bdb_driver_feature *feature;
- /* For mobile chip, set default as true */
- if (IS_MOBILE(pI830) && !IS_I830(pI830))
- pI830->integrated_lvds = TRUE;
+ /* For mobile chip, set default as true */
+ if (IS_MOBILE(pI830) && !IS_I830(pI830))
+ pI830->integrated_lvds = TRUE;
- /* skip pre-9xx chips which is broken to parse this block. */
- if (!IS_I9XX(pI830))
- return;
+ /* skip pre-9xx chips which is broken to parse this block. */
+ if (!IS_I9XX(pI830))
+ return;
- /* XXX Disable this parsing, as it looks doesn't work for all
- VBIOS. Reenable it if we could find out the reliable VBT parsing
- for LVDS config later. */
- if (1)
- return;
+ /* XXX Disable this parsing, as it looks doesn't work for all
+ VBIOS. Reenable it if we could find out the reliable VBT parsing
+ for LVDS config later. */
+ if (1)
+ return;
- feature = find_section(bdb, BDB_DRIVER_FEATURES);
- if (!feature)
- return;
+ feature = find_section(bdb, BDB_DRIVER_FEATURES);
+ if (!feature)
+ return;
- if (feature->lvds_config != BDB_DRIVER_INT_LVDS)
- pI830->integrated_lvds = FALSE;
+ if (feature->lvds_config != BDB_DRIVER_INT_LVDS)
+ pI830->integrated_lvds = FALSE;
}
static
void parse_sdvo_mapping(ScrnInfoPtr pScrn, struct bdb_header *bdb)
{
- unsigned int block_size;
- uint16_t *block_ptr;
- struct bdb_general_definitions *defs;
- struct child_device_config *child;
- int i, child_device_num, count;
- struct sdvo_device_mapping *p_mapping;
- I830Ptr pI830 = I830PTR(pScrn);
-
- defs = find_section(bdb, BDB_GENERAL_DEFINITIONS);
- if (!defs) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "can't find the general definition blocks\n");
- return;
- }
- /* Get the block size of general defintion block */
- block_ptr = (uint16_t *)((char *)defs - 2);
- block_size = *block_ptr;
- child_device_num = (block_size - sizeof(*defs)) / sizeof(*child);
- count = 0;
-
- for (i = 0; i < child_device_num; i++) {
- child = &defs->devices[i];
- if (!child->device_type) {
- /* skip invalid child device type*/
- continue;
- }
- if (child->slave_addr == SLAVE_ADDR1 ||
- child->slave_addr == SLAVE_ADDR2) {
- if (child->dvo_port != DEVICE_PORT_DVOB &&
- child->dvo_port != DEVICE_PORT_DVOC) {
- /* skip the incorrect sdvo port */
+ unsigned int block_size;
+ uint16_t *block_ptr;
+ struct bdb_general_definitions *defs;
+ struct child_device_config *child;
+ int i, child_device_num, count;
+ struct sdvo_device_mapping *p_mapping;
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ defs = find_section(bdb, BDB_GENERAL_DEFINITIONS);
+ if (!defs) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Incorrect SDVO port\n");
- continue;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "the SDVO device with slave addr %x "
- "is found on DVO %x port\n",
- child->slave_addr, child->dvo_port);
- /* fill the primary dvo port */
- p_mapping = &(pI830->sdvo_mappings[child->dvo_port - 1]);
- if (!p_mapping->initialized) {
- p_mapping->dvo_port = child->dvo_port;
- p_mapping->dvo_wiring = child->dvo_wiring;
- p_mapping->initialized = 1;
- p_mapping->slave_addr = child->slave_addr;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "One DVO port is shared by two slave "
- "address. Maybe it can't be handled\n");
- }
- /* If there exists the slave2_addr, maybe it is a sdvo
- * device that contain multiple inputs. And it can't
- * handled by SDVO driver.
- * Ignore the dvo mapping of slave2_addr
- * of course its mapping info won't be added.
- */
- if (child->slave2_addr) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Two DVO ports uses the same slave address."
- "Maybe it can't be handled by SDVO driver\n");
- }
- count++;
- } else {
- /* if the slave address is neither 0x70 nor 0x72, skip it. */
- continue;
+ "can't find the general definition blocks\n");
+ return;
+ }
+ /* Get the block size of general defintion block */
+ block_ptr = (uint16_t *) ((char *)defs - 2);
+ block_size = *block_ptr;
+ child_device_num = (block_size - sizeof(*defs)) / sizeof(*child);
+ count = 0;
+
+ for (i = 0; i < child_device_num; i++) {
+ child = &defs->devices[i];
+ if (!child->device_type) {
+ /* skip invalid child device type */
+ continue;
+ }
+ if (child->slave_addr == SLAVE_ADDR1 ||
+ child->slave_addr == SLAVE_ADDR2) {
+ if (child->dvo_port != DEVICE_PORT_DVOB &&
+ child->dvo_port != DEVICE_PORT_DVOC) {
+ /* skip the incorrect sdvo port */
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Incorrect SDVO port\n");
+ continue;
+ }
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "the SDVO device with slave addr %x "
+ "is found on DVO %x port\n",
+ child->slave_addr, child->dvo_port);
+ /* fill the primary dvo port */
+ p_mapping =
+ &(pI830->sdvo_mappings[child->dvo_port - 1]);
+ if (!p_mapping->initialized) {
+ p_mapping->dvo_port = child->dvo_port;
+ p_mapping->dvo_wiring = child->dvo_wiring;
+ p_mapping->initialized = 1;
+ p_mapping->slave_addr = child->slave_addr;
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "One DVO port is shared by two slave "
+ "address. Maybe it can't be handled\n");
+ }
+ /* If there exists the slave2_addr, maybe it is a sdvo
+ * device that contain multiple inputs. And it can't
+ * handled by SDVO driver.
+ * Ignore the dvo mapping of slave2_addr
+ * of course its mapping info won't be added.
+ */
+ if (child->slave2_addr) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Two DVO ports uses the same slave address."
+ "Maybe it can't be handled by SDVO driver\n");
+ }
+ count++;
+ } else {
+ /* if the slave address is neither 0x70 nor 0x72, skip it. */
+ continue;
+ }
}
- }
- /* If the count is zero, it indicates that no sdvo device is found */
- if (!count)
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "No SDVO device is found in VBT\n");
+ /* If the count is zero, it indicates that no sdvo device is found */
+ if (!count)
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "No SDVO device is found in VBT\n");
- return;
+ return;
}
+
#define INTEL_VBIOS_SIZE (64 * 1024) /* XXX */
/**
@@ -339,63 +333,62 @@ void parse_sdvo_mapping(ScrnInfoPtr pScrn, struct bdb_header *bdb)
*
* Returns 0 on success, nonzero on failure.
*/
-int
-i830_bios_init(ScrnInfoPtr pScrn)
+int i830_bios_init(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- struct vbt_header *vbt;
- struct bdb_header *bdb;
- int vbt_off, bdb_off;
- unsigned char *bios;
- int ret;
- int size;
-
- size = pI830->PciInfo->rom_size;
- if (size == 0) {
- size = INTEL_VBIOS_SIZE;
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "libpciaccess reported 0 rom size, guessing %dkB\n",
- size / 1024);
- }
- bios = xalloc(size);
- if (bios == NULL)
- return -1;
-
- ret = pci_device_read_rom (pI830->PciInfo, bios);
- if (ret != 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "libpciaccess failed to read %dkB video BIOS: %s\n",
- size / 1024, strerror(-ret));
- xfree (bios);
- return -1;
- }
-
- vbt_off = INTEL_BIOS_16(0x1a);
- if (vbt_off >= size) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Bad VBT offset: 0x%x\n",
- vbt_off);
- xfree(bios);
- return -1;
- }
+ I830Ptr pI830 = I830PTR(pScrn);
+ struct vbt_header *vbt;
+ struct bdb_header *bdb;
+ int vbt_off, bdb_off;
+ unsigned char *bios;
+ int ret;
+ int size;
+
+ size = pI830->PciInfo->rom_size;
+ if (size == 0) {
+ size = INTEL_VBIOS_SIZE;
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "libpciaccess reported 0 rom size, guessing %dkB\n",
+ size / 1024);
+ }
+ bios = xalloc(size);
+ if (bios == NULL)
+ return -1;
- vbt = (struct vbt_header *)(bios + vbt_off);
+ ret = pci_device_read_rom(pI830->PciInfo, bios);
+ if (ret != 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "libpciaccess failed to read %dkB video BIOS: %s\n",
+ size / 1024, strerror(-ret));
+ xfree(bios);
+ return -1;
+ }
- if (memcmp(vbt->signature, "$VBT", 4) != 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Bad VBT signature\n");
- xfree(bios);
- return -1;
- }
+ vbt_off = INTEL_BIOS_16(0x1a);
+ if (vbt_off >= size) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Bad VBT offset: 0x%x\n",
+ vbt_off);
+ xfree(bios);
+ return -1;
+ }
+
+ vbt = (struct vbt_header *)(bios + vbt_off);
- /* Now that we've found the VBIOS, go scour the VBTs */
- bdb_off = vbt_off + vbt->bdb_offset;
- bdb = (struct bdb_header *)(bios + bdb_off);
+ if (memcmp(vbt->signature, "$VBT", 4) != 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Bad VBT signature\n");
+ xfree(bios);
+ return -1;
+ }
- parse_general_features(pI830, bdb);
- parse_panel_data(pI830, bdb);
- parse_driver_feature(pI830, bdb);
- parse_sdvo_mapping(pScrn, bdb);
+ /* Now that we've found the VBIOS, go scour the VBTs */
+ bdb_off = vbt_off + vbt->bdb_offset;
+ bdb = (struct bdb_header *)(bios + bdb_off);
- xfree(bios);
+ parse_general_features(pI830, bdb);
+ parse_panel_data(pI830, bdb);
+ parse_driver_feature(pI830, bdb);
+ parse_sdvo_mapping(pScrn, bdb);
+
+ xfree(bios);
- return 0;
+ return 0;
}
diff --git a/src/i830_bios.h b/src/i830_bios.h
index 754fc86e..f43911e5 100644
--- a/src/i830_bios.h
+++ b/src/i830_bios.h
@@ -34,22 +34,22 @@
#endif
struct vbt_header {
- char signature[20]; /**< Always starts with 'VBT$' */
- uint16_t version; /**< decimal */
- uint16_t header_size; /**< in bytes */
- uint16_t vbt_size; /**< in bytes */
- uint8_t vbt_checksum;
- uint8_t reserved0;
- uint32_t bdb_offset; /**< from beginning of VBT */
- uint32_t aim_offset[4]; /**< from beginning of VBT */
-} __attribute__((packed));
+ char signature[20]; /**< Always starts with 'VBT$' */
+ uint16_t version; /**< decimal */
+ uint16_t header_size; /**< in bytes */
+ uint16_t vbt_size; /**< in bytes */
+ uint8_t vbt_checksum;
+ uint8_t reserved0;
+ uint32_t bdb_offset; /**< from beginning of VBT */
+ uint32_t aim_offset[4]; /**< from beginning of VBT */
+} __attribute__ ((packed));
struct bdb_header {
- char signature[16]; /**< Always 'BIOS_DATA_BLOCK' */
- uint16_t version; /**< decimal */
- uint16_t header_size; /**< in bytes */
- uint16_t bdb_size; /**< in bytes */
-} __attribute__((packed));
+ char signature[16]; /**< Always 'BIOS_DATA_BLOCK' */
+ uint16_t version; /**< decimal */
+ uint16_t header_size; /**< in bytes */
+ uint16_t bdb_size; /**< in bytes */
+} __attribute__ ((packed));
/*
* There are several types of BIOS data blocks (BDBs), each block has
@@ -76,7 +76,7 @@ struct bdb_header {
#define BDB_DRIVER_ROTATION 18
#define BDB_DISPLAY_REMOVE 19
#define BDB_OEM_CUSTOM 20
-#define BDB_EFP_LIST 21 /* workarounds for VGA hsync/vsync */
+#define BDB_EFP_LIST 21 /* workarounds for VGA hsync/vsync */
#define BDB_SDVO_LVDS_OPTIONS 22
#define BDB_SDVO_PANEL_DTDS 23
#define BDB_SDVO_LVDS_PNP_IDS 24
@@ -87,51 +87,51 @@ struct bdb_header {
#define BDB_LVDS_LFP_DATA 42
#define BDB_LVDS_BACKLIGHT 43
#define BDB_LVDS_POWER 44
-#define BDB_SKIP 254 /* VBIOS private block, ignore */
+#define BDB_SKIP 254 /* VBIOS private block, ignore */
struct bdb_general_features {
- /* bits 1 */
+ /* bits 1 */
unsigned char panel_fitting:2;
unsigned char flexaim:1;
unsigned char msg_enable:1;
unsigned char clear_screen:3;
unsigned char color_flip:1;
- /* bits 2 */
+ /* bits 2 */
unsigned char download_ext_vbt:1;
unsigned char enable_ssc:1;
unsigned char ssc_freq:1;
unsigned char enable_lfp_on_override:1;
unsigned char disable_ssc_ddt:1;
- unsigned char rsvd8:3; /* finish byte */
+ unsigned char rsvd8:3; /* finish byte */
- /* bits 3 */
+ /* bits 3 */
unsigned char disable_smooth_vision:1;
unsigned char single_dvi:1;
- unsigned char rsvd9:6; /* finish byte */
+ unsigned char rsvd9:6; /* finish byte */
- /* bits 4 */
+ /* bits 4 */
unsigned char legacy_monitor_detect;
- /* bits 5 */
+ /* bits 5 */
unsigned char int_crt_support:1;
unsigned char int_tv_support:1;
- unsigned char rsvd11:6; /* finish byte */
-} __attribute__((packed));
+ unsigned char rsvd11:6; /* finish byte */
+} __attribute__ ((packed));
-#define GPIO_PIN_NONE 0x00 /* "N/A" */
-#define GPIO_PIN_I2C 0x01 /* "I2C GPIO pins" */
-#define GPIO_PIN_CRT_DDC 0x02 /* "Analog CRT DDC GPIO pins" */
+#define GPIO_PIN_NONE 0x00 /* "N/A" */
+#define GPIO_PIN_I2C 0x01 /* "I2C GPIO pins" */
+#define GPIO_PIN_CRT_DDC 0x02 /* "Analog CRT DDC GPIO pins" */
/* 915+ */
-#define GPIO_PIN_LVDS 0x03 /* "Integrated LVDS DDC GPIO pins" */
-#define GPIO_PIN_SDVO_I2C 0x05 /* "sDVO I2C GPIO pins" */
-#define GPIO_PIN_SDVO_DDC1 0x1D /* "SDVO DDC1 GPIO pins" */
-#define GPIO_PIN_SDVO_DDC2 0x2D /* "SDVO DDC2 GPIO pins" */
+#define GPIO_PIN_LVDS 0x03 /* "Integrated LVDS DDC GPIO pins" */
+#define GPIO_PIN_SDVO_I2C 0x05 /* "sDVO I2C GPIO pins" */
+#define GPIO_PIN_SDVO_DDC1 0x1D /* "SDVO DDC1 GPIO pins" */
+#define GPIO_PIN_SDVO_DDC2 0x2D /* "SDVO DDC2 GPIO pins" */
/* pre-915 */
-#define GPIO_PIN_DVI_LVDS 0x03 /* "DVI/LVDS DDC GPIO pins" */
-#define GPIO_PIN_ADD_I2C 0x05 /* "ADDCARD I2C GPIO pins" */
-#define GPIO_PIN_ADD_DDC 0x04 /* "ADDCARD DDC GPIO pins" */
-#define GPIO_PIN_ADD_DDC_I2C 0x06 /* "ADDCARD DDC/I2C GPIO pins" */
+#define GPIO_PIN_DVI_LVDS 0x03 /* "DVI/LVDS DDC GPIO pins" */
+#define GPIO_PIN_ADD_I2C 0x05 /* "ADDCARD I2C GPIO pins" */
+#define GPIO_PIN_ADD_DDC 0x04 /* "ADDCARD DDC GPIO pins" */
+#define GPIO_PIN_ADD_DDC_I2C 0x06 /* "ADDCARD DDC/I2C GPIO pins" */
/* Pre 915 */
#define DEVICE_TYPE_NONE 0x00
@@ -181,40 +181,40 @@ struct bdb_general_features {
#define DEVICE_WIRE_DVOB_MASTER 0x0d
#define DEVICE_WIRE_DVOC_MASTER 0x0e
-#define DEVICE_PORT_DVOA 0x00 /* none on 845+ */
+#define DEVICE_PORT_DVOA 0x00 /* none on 845+ */
#define DEVICE_PORT_DVOB 0x01
#define DEVICE_PORT_DVOC 0x02
struct child_device_config {
- uint16_t handle;
- uint16_t device_type; /* See DEVICE_TYPE_* above */
- uint8_t device_id[10];
- uint16_t addin_offset;
- uint8_t dvo_port; /* See DEVICE_PORT_* above */
- uint8_t i2c_pin;
- uint8_t slave_addr;
- uint8_t ddc_pin;
- uint16_t edid_ptr;
- uint8_t dvo_cfg; /* See DEVICE_CFG_* above */
- uint8_t dvo2_port;
- uint8_t i2c2_pin;
- uint8_t slave2_addr;
- uint8_t ddc2_pin;
- uint8_t capabilities;
- uint8_t dvo_wiring; /* See DEVICE_WIRE_* above */
- uint8_t dvo2_wiring;
- uint16_t extended_type;
- uint8_t dvo_function;
-} __attribute__((packed));
+ uint16_t handle;
+ uint16_t device_type; /* See DEVICE_TYPE_* above */
+ uint8_t device_id[10];
+ uint16_t addin_offset;
+ uint8_t dvo_port; /* See DEVICE_PORT_* above */
+ uint8_t i2c_pin;
+ uint8_t slave_addr;
+ uint8_t ddc_pin;
+ uint16_t edid_ptr;
+ uint8_t dvo_cfg; /* See DEVICE_CFG_* above */
+ uint8_t dvo2_port;
+ uint8_t i2c2_pin;
+ uint8_t slave2_addr;
+ uint8_t ddc2_pin;
+ uint8_t capabilities;
+ uint8_t dvo_wiring; /* See DEVICE_WIRE_* above */
+ uint8_t dvo2_wiring;
+ uint16_t extended_type;
+ uint8_t dvo_function;
+} __attribute__ ((packed));
struct bdb_general_definitions {
- unsigned char crt_ddc_gmbus_pin; /* see GPIO_PIN_* above */
+ unsigned char crt_ddc_gmbus_pin; /* see GPIO_PIN_* above */
/* DPMS bits */
unsigned char dpms_acpi:1;
unsigned char skip_boot_crt_detect:1;
unsigned char dpms_aim:1;
- unsigned char rsvd1:5; /* finish byte */
+ unsigned char rsvd1:5; /* finish byte */
/* boot device bits */
unsigned char boot_display[2];
@@ -230,107 +230,107 @@ struct bdb_general_definitions {
*/
struct child_device_config devices[0];
/* may be another device block here on some platforms */
-} __attribute__((packed));
+} __attribute__ ((packed));
#define DEVICE_CHILD_SIZE 7
struct bdb_child_devices {
- uint8_t child_structure_size;
- struct child_device_config children[DEVICE_CHILD_SIZE];
-} __attribute__((packed));
+ uint8_t child_structure_size;
+ struct child_device_config children[DEVICE_CHILD_SIZE];
+} __attribute__ ((packed));
struct bdb_lvds_options {
- uint8_t panel_type;
- uint8_t rsvd1;
- /* LVDS capabilities, stored in a dword */
- uint8_t pfit_mode:2;
- uint8_t pfit_text_mode_enhanced:1;
- uint8_t pfit_gfx_mode_enhanced:1;
- uint8_t pfit_ratio_auto:1;
- uint8_t pixel_dither:1;
- uint8_t lvds_edid:1;
- uint8_t rsvd2:1;
- uint8_t rsvd4;
-} __attribute__((packed));
+ uint8_t panel_type;
+ uint8_t rsvd1;
+ /* LVDS capabilities, stored in a dword */
+ uint8_t pfit_mode:2;
+ uint8_t pfit_text_mode_enhanced:1;
+ uint8_t pfit_gfx_mode_enhanced:1;
+ uint8_t pfit_ratio_auto:1;
+ uint8_t pixel_dither:1;
+ uint8_t lvds_edid:1;
+ uint8_t rsvd2:1;
+ uint8_t rsvd4;
+} __attribute__ ((packed));
/* 915+ only */
struct bdb_tv_features {
- /* need to verify bit ordering */
- uint16_t under_over_scan_via_yprpb:2;
- uint16_t rsvd1:10;
- uint16_t under_over_scan_via_dvi:2;
- uint16_t add_overscan_mode:1;
- uint16_t rsvd2:1;
-} __attribute__((packed));
+ /* need to verify bit ordering */
+ uint16_t under_over_scan_via_yprpb:2;
+ uint16_t rsvd1:10;
+ uint16_t under_over_scan_via_dvi:2;
+ uint16_t add_overscan_mode:1;
+ uint16_t rsvd2:1;
+} __attribute__ ((packed));
struct lvds_fp_timing {
- uint16_t x_res;
- uint16_t y_res;
- uint32_t lvds_reg;
- uint32_t lvds_reg_val;
- uint32_t pp_on_reg;
- uint32_t pp_on_reg_val;
- uint32_t pp_off_reg;
- uint32_t pp_off_reg_val;
- uint32_t pp_cycle_reg;
- uint32_t pp_cycle_reg_val;
- uint32_t pfit_reg;
- uint32_t pfit_reg_val;
- uint16_t terminator;
-} __attribute__((packed));
+ uint16_t x_res;
+ uint16_t y_res;
+ uint32_t lvds_reg;
+ uint32_t lvds_reg_val;
+ uint32_t pp_on_reg;
+ uint32_t pp_on_reg_val;
+ uint32_t pp_off_reg;
+ uint32_t pp_off_reg_val;
+ uint32_t pp_cycle_reg;
+ uint32_t pp_cycle_reg_val;
+ uint32_t pfit_reg;
+ uint32_t pfit_reg_val;
+ uint16_t terminator;
+} __attribute__ ((packed));
struct lvds_dvo_timing {
- uint16_t dclk; /**< In 10khz */
- uint8_t hactive;
- uint8_t hblank;
- uint8_t high_h; /**< 7:4 = hactive 11:8, 3:0 = hblank 11:8 */
- uint8_t vactive;
- uint8_t vblank;
- uint8_t high_v; /**< 7:4 = vactive 11:8, 3:0 = vblank 11:8 */
- uint8_t hsync_off;
- uint8_t hsync_pulse_width;
- uint8_t vsync_off;
- uint8_t high_hsync_off; /**< 7:6 = hsync off 9:8 */
- uint8_t h_image;
- uint8_t v_image;
- uint8_t max_hv;
- uint8_t h_border;
- uint8_t v_border;
- uint8_t flags;
-} __attribute__((packed));
+ uint16_t dclk; /**< In 10khz */
+ uint8_t hactive;
+ uint8_t hblank;
+ uint8_t high_h; /**< 7:4 = hactive 11:8, 3:0 = hblank 11:8 */
+ uint8_t vactive;
+ uint8_t vblank;
+ uint8_t high_v; /**< 7:4 = vactive 11:8, 3:0 = vblank 11:8 */
+ uint8_t hsync_off;
+ uint8_t hsync_pulse_width;
+ uint8_t vsync_off;
+ uint8_t high_hsync_off; /**< 7:6 = hsync off 9:8 */
+ uint8_t h_image;
+ uint8_t v_image;
+ uint8_t max_hv;
+ uint8_t h_border;
+ uint8_t v_border;
+ uint8_t flags;
+} __attribute__ ((packed));
struct lvds_pnp_id {
- uint16_t mfg_name;
- uint16_t product_code;
- uint32_t serial;
- uint8_t mfg_week;
- uint8_t mfg_year;
-} __attribute__((packed));;
+ uint16_t mfg_name;
+ uint16_t product_code;
+ uint32_t serial;
+ uint8_t mfg_week;
+ uint8_t mfg_year;
+} __attribute__ ((packed));;
/* LFP pointer table contains entries to the struct below */
struct bdb_lvds_lfp_data_ptr {
- uint16_t fp_timing_offset; /* offsets are from start of bdb */
- uint8_t fp_table_size;
- uint16_t dvo_timing_offset;
- uint8_t dvo_table_size;
- uint16_t panel_pnp_id_offset;
- uint8_t pnp_table_size;
-} __attribute__((packed));
+ uint16_t fp_timing_offset; /* offsets are from start of bdb */
+ uint8_t fp_table_size;
+ uint16_t dvo_timing_offset;
+ uint8_t dvo_table_size;
+ uint16_t panel_pnp_id_offset;
+ uint8_t pnp_table_size;
+} __attribute__ ((packed));
struct bdb_lvds_lfp_data_ptrs {
- uint8_t lvds_entries;
- struct bdb_lvds_lfp_data_ptr ptr[16];
-} __attribute__((packed));
+ uint8_t lvds_entries;
+ struct bdb_lvds_lfp_data_ptr ptr[16];
+} __attribute__ ((packed));
struct bdb_lvds_lfp_data_entry {
- struct lvds_fp_timing fp_timing;
- struct lvds_dvo_timing dvo_timing;
- struct lvds_pnp_id pnp_id;
-} __attribute__((packed));
+ struct lvds_fp_timing fp_timing;
+ struct lvds_dvo_timing dvo_timing;
+ struct lvds_pnp_id pnp_id;
+} __attribute__ ((packed));
struct bdb_lvds_lfp_data {
- struct bdb_lvds_lfp_data_entry data[16];
-} __attribute__((packed));
+ struct bdb_lvds_lfp_data_entry data[16];
+} __attribute__ ((packed));
#define BACKLIGHT_TYPE_NONE 0
#define BACKLIGHT_TYPE_I2C 1
@@ -342,58 +342,58 @@ struct bdb_lvds_lfp_data {
#define BACKLIGHT_GMBUS_1MHZ 3
struct backlight_info {
- uint8_t inverter_type:2; /* see BACKLIGHT_TYPE_* above */
- uint8_t inverter_polarity:1; /* 1 means 0 is max, 255 is min */
- uint8_t gpio_pins:3; /* see GPIO_PIN_* above */
- uint8_t gmbus_speed:2;
- uint16_t pwm_frequency; /* in Hz */
- uint8_t min_brightness;
- /* Next two are only for 915+ systems */
- uint8_t i2c_addr;
- uint8_t i2c_cmd;
+ uint8_t inverter_type:2; /* see BACKLIGHT_TYPE_* above */
+ uint8_t inverter_polarity:1; /* 1 means 0 is max, 255 is min */
+ uint8_t gpio_pins:3; /* see GPIO_PIN_* above */
+ uint8_t gmbus_speed:2;
+ uint16_t pwm_frequency; /* in Hz */
+ uint8_t min_brightness;
+ /* Next two are only for 915+ systems */
+ uint8_t i2c_addr;
+ uint8_t i2c_cmd;
} __attribute((packed));
struct bdb_backlight_control {
- uint8_t row_size;
- struct backlight_info lfps[16];
-} __attribute__((packed));
+ uint8_t row_size;
+ struct backlight_info lfps[16];
+} __attribute__ ((packed));
struct bdb_bia {
- uint8_t bia_enable:1;
- uint8_t bia_level:3;
- uint8_t rsvd1:3;
- uint8_t als_enable:1;
- uint8_t als_response_data[20];
+ uint8_t bia_enable:1;
+ uint8_t bia_level:3;
+ uint8_t rsvd1:3;
+ uint8_t als_enable:1;
+ uint8_t als_response_data[20];
} __attribute((packed));
struct aimdb_header {
- char signature[16];
- char oem_device[20];
- uint16_t aimdb_version;
- uint16_t aimdb_header_size;
- uint16_t aimdb_size;
-} __attribute__((packed));
+ char signature[16];
+ char oem_device[20];
+ uint16_t aimdb_version;
+ uint16_t aimdb_header_size;
+ uint16_t aimdb_size;
+} __attribute__ ((packed));
struct aimdb_block {
- uint8_t aimdb_id;
- uint16_t aimdb_size;
-} __attribute__((packed));
+ uint8_t aimdb_id;
+ uint16_t aimdb_size;
+} __attribute__ ((packed));
struct vch_panel_data {
- uint16_t fp_timing_offset;
- uint8_t fp_timing_size;
- uint16_t dvo_timing_offset;
- uint8_t dvo_timing_size;
- uint16_t text_fitting_offset;
- uint8_t text_fitting_size;
- uint16_t graphics_fitting_offset;
- uint8_t graphics_fitting_size;
-} __attribute__((packed));
+ uint16_t fp_timing_offset;
+ uint8_t fp_timing_size;
+ uint16_t dvo_timing_offset;
+ uint8_t dvo_timing_size;
+ uint16_t text_fitting_offset;
+ uint8_t text_fitting_size;
+ uint16_t graphics_fitting_offset;
+ uint8_t graphics_fitting_size;
+} __attribute__ ((packed));
struct vch_bdb_22 {
- struct aimdb_block aimdb_block;
- struct vch_panel_data panels[16];
-} __attribute__((packed));
+ struct aimdb_block aimdb_block;
+ struct vch_panel_data panels[16];
+} __attribute__ ((packed));
#define BLC_INVERTER_TYPE_NONE 0
#define BLC_INVERTER_TYPE_I2C 1
@@ -407,19 +407,19 @@ struct vch_bdb_22 {
struct blc_struct {
uint8_t inverter_type:2;
- uint8_t inverter_polarity:1; /* 1 means inverted (0 = max brightness) */
+ uint8_t inverter_polarity:1; /* 1 means inverted (0 = max brightness) */
uint8_t gpio_pins:3;
uint8_t gmbus_speed:2;
- uint16_t pwm_freq; /* in Hz */
- uint8_t min_brightness; /* (0-255) */
+ uint16_t pwm_freq; /* in Hz */
+ uint8_t min_brightness; /* (0-255) */
uint8_t i2c_slave_addr;
uint8_t i2c_cmd;
-} __attribute__((packed));
+} __attribute__ ((packed));
struct bdb_lvds_backlight {
uint8_t blcstruct_size;
struct blc_struct panels[16];
-} __attribute__((packed));
+} __attribute__ ((packed));
struct bdb_lvds_power {
uint8_t dpst_enabled:1;
@@ -431,7 +431,7 @@ struct bdb_lvds_power {
uint16_t als_backlight3;
uint16_t als_backlight4;
uint16_t als_backlight5;
-} __attribute__((packed));
+} __attribute__ ((packed));
#define BDB_DRIVER_NO_LVDS 0
#define BDB_DRIVER_INT_LVDS 1
@@ -439,57 +439,56 @@ struct bdb_lvds_power {
#define BDB_DRIVER_EDP 3
struct bdb_driver_feature {
- uint8_t boot_dev_algorithm:1;
- uint8_t block_display_switch:1;
- uint8_t allow_display_switch:1;
- uint8_t hotplug_dvo:1;
- uint8_t dual_view_zoom:1;
- uint8_t int15h_hook:1;
- uint8_t sprite_in_clone:1;
- uint8_t primary_lfp_id:1;
-
- uint16_t boot_mode_x;
- uint16_t boot_mode_y;
- uint8_t boot_mode_bpp;
- uint8_t boot_mode_refresh;
-
- uint16_t enable_lfp_primary:1;
- uint16_t selective_mode_pruning:1;
- uint16_t dual_frequency:1;
- uint16_t render_clock_freq:1; /* 0: high freq; 1: low freq */
- uint16_t nt_clone_support:1;
- uint16_t power_scheme_ui:1; /* 0: CUI; 1: 3rd party */
- uint16_t sprite_display_assign:1; /* 0: secondary; 1: primary */
- uint16_t cui_aspect_scaling:1;
- uint16_t preserve_aspect_ratio:1;
- uint16_t sdvo_device_power_down:1;
- uint16_t crt_hotplug:1;
- uint16_t lvds_config:2;
- uint16_t reserved:3;
-
- uint8_t static_display:1;
- uint8_t reserved2:7;
- uint16_t legacy_crt_max_x;
- uint16_t legacy_crt_max_y;
- uint8_t legacy_crt_max_refresh;
-} __attribute__((packed));
+ uint8_t boot_dev_algorithm:1;
+ uint8_t block_display_switch:1;
+ uint8_t allow_display_switch:1;
+ uint8_t hotplug_dvo:1;
+ uint8_t dual_view_zoom:1;
+ uint8_t int15h_hook:1;
+ uint8_t sprite_in_clone:1;
+ uint8_t primary_lfp_id:1;
+
+ uint16_t boot_mode_x;
+ uint16_t boot_mode_y;
+ uint8_t boot_mode_bpp;
+ uint8_t boot_mode_refresh;
+
+ uint16_t enable_lfp_primary:1;
+ uint16_t selective_mode_pruning:1;
+ uint16_t dual_frequency:1;
+ uint16_t render_clock_freq:1; /* 0: high freq; 1: low freq */
+ uint16_t nt_clone_support:1;
+ uint16_t power_scheme_ui:1; /* 0: CUI; 1: 3rd party */
+ uint16_t sprite_display_assign:1; /* 0: secondary; 1: primary */
+ uint16_t cui_aspect_scaling:1;
+ uint16_t preserve_aspect_ratio:1;
+ uint16_t sdvo_device_power_down:1;
+ uint16_t crt_hotplug:1;
+ uint16_t lvds_config:2;
+ uint16_t reserved:3;
+
+ uint8_t static_display:1;
+ uint8_t reserved2:7;
+ uint16_t legacy_crt_max_x;
+ uint16_t legacy_crt_max_y;
+ uint8_t legacy_crt_max_refresh;
+} __attribute__ ((packed));
struct bdb_sdvo_lvds_options {
- uint8_t panel_backlight;
- uint8_t h40_set_panel_type;
- uint8_t panel_type;
- uint8_t ssc_clk_freq;
- uint16_t als_low_trip;
- uint16_t als_high_trip;
- uint8_t sclalarcoeff_tab_row_num;
- uint8_t sclalarcoeff_tab_row_size;
- uint8_t coefficient[8];
- uint8_t panel_misc_bits_1;
- uint8_t panel_misc_bits_2;
- uint8_t panel_misc_bits_3;
- uint8_t panel_misc_bits_4;
-} __attribute__((packed));
-
+ uint8_t panel_backlight;
+ uint8_t h40_set_panel_type;
+ uint8_t panel_type;
+ uint8_t ssc_clk_freq;
+ uint16_t als_low_trip;
+ uint16_t als_high_trip;
+ uint8_t sclalarcoeff_tab_row_num;
+ uint8_t sclalarcoeff_tab_row_size;
+ uint8_t coefficient[8];
+ uint8_t panel_misc_bits_1;
+ uint8_t panel_misc_bits_2;
+ uint8_t panel_misc_bits_3;
+ uint8_t panel_misc_bits_4;
+} __attribute__ ((packed));
#ifndef REG_DUMPER
int i830_bios_init(ScrnInfoPtr pScrn);
@@ -514,12 +513,12 @@ int i830_bios_init(ScrnInfoPtr pScrn);
*/
/* GR18 bits are set on display switch and hotkey events */
-#define GR18_DRIVER_SWITCH_EN (1<<7) /* 0: VBIOS control, 1: driver control */
-#define GR18_HOTKEY_MASK 0x78 /* See also SWF4 15:0 */
+#define GR18_DRIVER_SWITCH_EN (1<<7) /* 0: VBIOS control, 1: driver control */
+#define GR18_HOTKEY_MASK 0x78 /* See also SWF4 15:0 */
#define GR18_HK_NONE (0x0<<3)
#define GR18_HK_LFP_STRETCH (0x1<<3)
#define GR18_HK_TOGGLE_DISP (0x2<<3)
-#define GR18_HK_DISP_SWITCH (0x4<<3) /* see SWF14 15:0 for what to enable */
+#define GR18_HK_DISP_SWITCH (0x4<<3) /* see SWF14 15:0 for what to enable */
#define GR18_HK_POPUP_DISABLED (0x6<<3)
#define GR18_HK_POPUP_ENABLED (0x7<<3)
#define GR18_HK_PFIT (0x8<<3)
@@ -541,7 +540,7 @@ int i830_bios_init(ScrnInfoPtr pScrn);
#define SWF10_VBIOS_BLC_I2C_EN (1<<29)
#define SWF10_GTT_OVERRIDE_EN (1<<28)
-#define SWF10_LFP_DPMS_OVR (1<<27) /* override DPMS on display switch */
+#define SWF10_LFP_DPMS_OVR (1<<27) /* override DPMS on display switch */
#define SWF10_ACTIVE_TOGGLE_LIST_MASK (7<<24)
#define SWF10_OLD_TOGGLE 0x0
#define SWF10_TOGGLE_LIST_1 0x1
@@ -580,7 +579,7 @@ int i830_bios_init(ScrnInfoPtr pScrn);
#define SWF11_DISPLAY_HOLDOFF (1<<13)
#define SWF11_DPMS_REDUCED (1<<12)
#define SWF11_IS_VBE_MODE (1<<11)
-#define SWF11_PIPEB_ACCESS (1<<10) /* 0 here means pipe a */
+#define SWF11_PIPEB_ACCESS (1<<10) /* 0 here means pipe a */
#define SWF11_DPMS_MASK 0x07
#define SWF11_DPMS_OFF (1<<2)
#define SWF11_DPMS_SUSPEND (1<<1)
@@ -593,7 +592,7 @@ int i830_bios_init(ScrnInfoPtr pScrn);
#define SWF14_POPUP_EN (1<<28)
#define SWF14_DISPLAY_HOLDOFF (1<<27)
#define SWF14_DISP_DETECT_EN (1<<26)
-#define SWF14_DOCKING_STATUS_DOCKED (1<<25) /* 0 here means undocked */
+#define SWF14_DOCKING_STATUS_DOCKED (1<<25) /* 0 here means undocked */
#define SWF14_DRIVER_STATUS (1<<24)
#define SWF14_OS_TYPE_WIN9X (1<<23)
#define SWF14_OS_TYPE_WINNT (1<<22)
@@ -603,8 +602,8 @@ int i830_bios_init(ScrnInfoPtr pScrn);
#define SWF14_PM_ACPI (0x3 << 16)
#define SWF14_PM_APM_12 (0x2 << 16)
#define SWF14_PM_APM_11 (0x1 << 16)
-#define SWF14_HK_REQUEST_MASK 0x0000ffff /* see GR18 6:3 for event type */
- /* if GR18 indicates a display switch */
+#define SWF14_HK_REQUEST_MASK 0x0000ffff /* see GR18 6:3 for event type */
+ /* if GR18 indicates a display switch */
#define SWF14_DS_PIPEB_LFP2_EN (1<<15)
#define SWF14_DS_PIPEB_EFP2_EN (1<<14)
#define SWF14_DS_PIPEB_TV2_EN (1<<13)
@@ -621,9 +620,9 @@ int i830_bios_init(ScrnInfoPtr pScrn);
#define SWF14_DS_PIPEA_EFP_EN (1<<2)
#define SWF14_DS_PIPEA_TV_EN (1<<1)
#define SWF14_DS_PIPEA_CRT_EN (1<<0)
- /* if GR18 indicates a panel fitting request */
-#define SWF14_PFIT_EN (1<<0) /* 0 means disable */
- /* if GR18 indicates an APM change request */
+ /* if GR18 indicates a panel fitting request */
+#define SWF14_PFIT_EN (1<<0) /* 0 means disable */
+ /* if GR18 indicates an APM change request */
#define SWF14_APM_HIBERNATE 0x4
#define SWF14_APM_SUSPEND 0x3
#define SWF14_APM_STANDBY 0x1
diff --git a/src/i830_common.h b/src/i830_common.h
index e9795a29..5809a11f 100644
--- a/src/i830_common.h
+++ b/src/i830_common.h
@@ -26,7 +26,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
-
#ifndef _I830_COMMON_H_
#define _I830_COMMON_H_
@@ -35,7 +34,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#define I830_NR_TEX_REGIONS 255 /* maximum due to use of chars for next/prev */
#define I830_LOG_MIN_TEX_REGION_SIZE 14
-
/* Driver specific DRM command indices
* NOTE: these are not OS specific, but they are driver specific
*/
@@ -56,43 +54,42 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#define DRM_I830_GET_VBLANK_PIPE 0x0e
#define DRM_I830_HWS_PAGE_ADDR 0x11
-
typedef struct {
- enum {
- I830_INIT_DMA = 0x01,
- I830_CLEANUP_DMA = 0x02,
- I830_RESUME_DMA = 0x03
- } func;
- unsigned int mmio_offset;
- int sarea_priv_offset;
- unsigned int ring_start;
- unsigned int ring_end;
- unsigned int ring_size;
- unsigned int front_offset;
- unsigned int back_offset;
- unsigned int depth_offset;
- unsigned int w;
- unsigned int h;
- unsigned int pitch; /* Pitch of front buffer in units of pixels */
- unsigned int pitch_bits;
- unsigned int back_pitch;
- unsigned int depth_pitch;
- unsigned int cpp;
- unsigned int chipset;
+ enum {
+ I830_INIT_DMA = 0x01,
+ I830_CLEANUP_DMA = 0x02,
+ I830_RESUME_DMA = 0x03
+ } func;
+ unsigned int mmio_offset;
+ int sarea_priv_offset;
+ unsigned int ring_start;
+ unsigned int ring_end;
+ unsigned int ring_size;
+ unsigned int front_offset;
+ unsigned int back_offset;
+ unsigned int depth_offset;
+ unsigned int w;
+ unsigned int h;
+ unsigned int pitch; /* Pitch of front buffer in units of pixels */
+ unsigned int pitch_bits;
+ unsigned int back_pitch;
+ unsigned int depth_pitch;
+ unsigned int cpp;
+ unsigned int chipset;
} drmI830Init;
typedef struct {
- drmTextureRegion texList[I830_NR_TEX_REGIONS+1];
- int last_upload; /* last time texture was uploaded */
- int last_enqueue; /* last time a buffer was enqueued */
+ drmTextureRegion texList[I830_NR_TEX_REGIONS + 1];
+ int last_upload; /* last time texture was uploaded */
+ int last_enqueue; /* last time a buffer was enqueued */
volatile int last_dispatch; /* age of the most recently dispatched buffer */
int ctxOwner; /* last context to upload state */
int texAge;
- int pf_enabled; /* is pageflipping allowed? */
- int pf_active;
- int pf_current_page; /* which buffer is being displayed? */
- int perf_boxes; /* performance boxes to be displayed */
- int width, height; /* screen size in pixels */
+ int pf_enabled; /* is pageflipping allowed? */
+ int pf_active;
+ int pf_current_page; /* which buffer is being displayed? */
+ int perf_boxes; /* performance boxes to be displayed */
+ int width, height; /* screen size in pixels */
drm_handle_t front_handle;
int front_offset;
@@ -111,17 +108,17 @@ typedef struct {
int tex_size;
int log_tex_granularity;
int pitch;
- int rotation; /* 0, 90, 180 or 270 */
+ int rotation; /* 0, 90, 180 or 270 */
int rotated_offset;
int rotated_size;
int rotated_pitch;
int virtualX, virtualY;
- unsigned int front_tiled;
- unsigned int back_tiled;
- unsigned int depth_tiled;
- unsigned int rotated_tiled;
- unsigned int rotated2_tiled;
+ unsigned int front_tiled;
+ unsigned int back_tiled;
+ unsigned int depth_tiled;
+ unsigned int rotated_tiled;
+ unsigned int rotated2_tiled;
int pipeA_x;
int pipeA_y;
@@ -150,31 +147,30 @@ typedef struct {
/* Flags for perf_boxes
*/
-#define I830_BOX_RING_EMPTY 0x1 /* populated by kernel */
-#define I830_BOX_FLIP 0x2 /* populated by kernel */
-#define I830_BOX_WAIT 0x4 /* populated by kernel & client */
-#define I830_BOX_TEXTURE_LOAD 0x8 /* populated by kernel */
-#define I830_BOX_LOST_CONTEXT 0x10 /* populated by client */
-
+#define I830_BOX_RING_EMPTY 0x1 /* populated by kernel */
+#define I830_BOX_FLIP 0x2 /* populated by kernel */
+#define I830_BOX_WAIT 0x4 /* populated by kernel & client */
+#define I830_BOX_TEXTURE_LOAD 0x8 /* populated by kernel */
+#define I830_BOX_LOST_CONTEXT 0x10 /* populated by client */
typedef struct {
- int start; /* agp offset */
+ int start; /* agp offset */
int used; /* nr bytes in use */
int DR1; /* hw flags for GFX_OP_DRAWRECT_INFO */
- int DR4; /* window origin for GFX_OP_DRAWRECT_INFO*/
+ int DR4; /* window origin for GFX_OP_DRAWRECT_INFO */
int num_cliprects; /* mulitpass with multiple cliprects? */
- drm_clip_rect_t *cliprects; /* pointer to userspace cliprects */
+ drm_clip_rect_t *cliprects; /* pointer to userspace cliprects */
} drmI830BatchBuffer;
typedef struct {
- char *buf; /* agp offset */
- int sz; /* nr bytes in use */
+ char *buf; /* agp offset */
+ int sz; /* nr bytes in use */
int DR1; /* hw flags for GFX_OP_DRAWRECT_INFO */
- int DR4; /* window origin for GFX_OP_DRAWRECT_INFO*/
+ int DR4; /* window origin for GFX_OP_DRAWRECT_INFO */
int num_cliprects; /* mulitpass with multiple cliprects? */
- drm_clip_rect_t *cliprects; /* pointer to userspace cliprects */
+ drm_clip_rect_t *cliprects; /* pointer to userspace cliprects */
} drmI830CmdBuffer;
-
+
typedef struct {
int *irq_seq;
} drmI830IrqEmit;
@@ -189,7 +185,7 @@ typedef struct {
} drmI830GetParam;
#define I830_PARAM_IRQ_ACTIVE 1
-#define I830_PARAM_ALLOW_BATCHBUFFER 2
+#define I830_PARAM_ALLOW_BATCHBUFFER 2
typedef struct {
int param;
@@ -200,7 +196,6 @@ typedef struct {
#define I830_SETPARAM_TEX_LRU_LOG_GRANULARITY 2
#define I830_SETPARAM_ALLOW_BATCHBUFFER 3
-
/* A memory manager for regions of shared memory:
*/
#define I830_MEM_REGION_AGP 1
@@ -220,7 +215,7 @@ typedef struct {
typedef struct {
int region;
int size;
- int start;
+ int start;
} drmI830MemInitHeap;
typedef struct {
diff --git a/src/i830_debug.c b/src/i830_debug.c
index 68ff8604..bca07c68 100644
--- a/src/i830_debug.c
+++ b/src/i830_debug.c
@@ -50,555 +50,559 @@
DEBUGSTRING(i830_16bit_func)
{
- return XNFprintf("0x%04x", (uint16_t)val);
+ return XNFprintf("0x%04x", (uint16_t) val);
}
DEBUGSTRING(i830_debug_dcc)
{
- char *addressing = NULL;
+ char *addressing = NULL;
- if (!IS_MOBILE(pI830))
- return NULL;
+ if (!IS_MOBILE(pI830))
+ return NULL;
- if (IS_I965G(pI830)) {
- if (val & (1 << 1))
- addressing = "dual channel interleaved";
- else
- addressing = "single or dual channel asymmetric";
- } else {
- switch (val & 3) {
- case 0: addressing = "single channel"; break;
- case 1: addressing = "dual channel asymmetric"; break;
- case 2: addressing = "dual channel interleaved"; break;
- case 3: addressing = "unknown channel layout"; break;
+ if (IS_I965G(pI830)) {
+ if (val & (1 << 1))
+ addressing = "dual channel interleaved";
+ else
+ addressing = "single or dual channel asymmetric";
+ } else {
+ switch (val & 3) {
+ case 0:
+ addressing = "single channel";
+ break;
+ case 1:
+ addressing = "dual channel asymmetric";
+ break;
+ case 2:
+ addressing = "dual channel interleaved";
+ break;
+ case 3:
+ addressing = "unknown channel layout";
+ break;
+ }
}
- }
- return XNFprintf("%s, XOR randomization: %sabled, XOR bit: %d",
- addressing,
- (val & (1 << 10)) ? "dis" : "en",
- (val & (1 << 9)) ? 17 : 11);
+ return XNFprintf("%s, XOR randomization: %sabled, XOR bit: %d",
+ addressing,
+ (val & (1 << 10)) ? "dis" : "en",
+ (val & (1 << 9)) ? 17 : 11);
}
DEBUGSTRING(i830_debug_chdecmisc)
{
- char *enhmodesel = NULL;
-
- switch ((val >> 5) & 3) {
- case 1: enhmodesel = "XOR bank/rank"; break;
- case 2: enhmodesel = "swap bank"; break;
- case 3: enhmodesel = "XOR bank"; break;
- case 0: enhmodesel = "none"; break;
- }
-
- return XNFprintf("%s, ch2 enh %sabled, ch1 enh %sabled, ch0 enh %sabled, "
- "flex %sabled, ep %spresent",
- enhmodesel,
- (val & (1 << 4)) ? "en" : "dis",
- (val & (1 << 3)) ? "en" : "dis",
- (val & (1 << 2)) ? "en" : "dis",
- (val & (1 << 1)) ? "en" : "dis",
- (val & (1 << 0)) ? "" : "not ");
+ char *enhmodesel = NULL;
+
+ switch ((val >> 5) & 3) {
+ case 1:
+ enhmodesel = "XOR bank/rank";
+ break;
+ case 2:
+ enhmodesel = "swap bank";
+ break;
+ case 3:
+ enhmodesel = "XOR bank";
+ break;
+ case 0:
+ enhmodesel = "none";
+ break;
+ }
+
+ return
+ XNFprintf("%s, ch2 enh %sabled, ch1 enh %sabled, ch0 enh %sabled, "
+ "flex %sabled, ep %spresent", enhmodesel,
+ (val & (1 << 4)) ? "en" : "dis",
+ (val & (1 << 3)) ? "en" : "dis",
+ (val & (1 << 2)) ? "en" : "dis",
+ (val & (1 << 1)) ? "en" : "dis",
+ (val & (1 << 0)) ? "" : "not ");
}
DEBUGSTRING(i830_debug_xyminus1)
{
- return XNFprintf("%d, %d", (val & 0xffff) + 1,
- ((val & 0xffff0000) >> 16) + 1);
+ return XNFprintf("%d, %d", (val & 0xffff) + 1,
+ ((val & 0xffff0000) >> 16) + 1);
}
DEBUGSTRING(i830_debug_yxminus1)
{
- return XNFprintf("%d, %d", ((val & 0xffff0000) >> 16) + 1,
- (val & 0xffff) + 1);
+ return XNFprintf("%d, %d", ((val & 0xffff0000) >> 16) + 1,
+ (val & 0xffff) + 1);
}
DEBUGSTRING(i830_debug_xy)
{
- return XNFprintf("%d, %d", (val & 0xffff),
- ((val & 0xffff0000) >> 16));
+ return XNFprintf("%d, %d", (val & 0xffff), ((val & 0xffff0000) >> 16));
}
DEBUGSTRING(i830_debug_dspstride)
{
- return XNFprintf("%d bytes", val);
+ return XNFprintf("%d bytes", val);
}
DEBUGSTRING(i830_debug_dspcntr)
{
- char *enabled = val & DISPLAY_PLANE_ENABLE ? "enabled" : "disabled";
- char plane = val & DISPPLANE_SEL_PIPE_B ? 'B' : 'A';
- if (IS_IGDNG(pI830))
- return XNFprintf("%s", enabled);
- else
- return XNFprintf("%s, pipe %c", enabled, plane);
+ char *enabled = val & DISPLAY_PLANE_ENABLE ? "enabled" : "disabled";
+ char plane = val & DISPPLANE_SEL_PIPE_B ? 'B' : 'A';
+ if (IS_IGDNG(pI830))
+ return XNFprintf("%s", enabled);
+ else
+ return XNFprintf("%s, pipe %c", enabled, plane);
}
DEBUGSTRING(i830_debug_pipeconf)
{
- char *enabled = val & PIPEACONF_ENABLE ? "enabled" : "disabled";
- char *bit30;
- char *bpc = NULL;
- if (IS_I965G(pI830))
- bit30 = val & I965_PIPECONF_ACTIVE ? "active" : "inactive";
- else
- bit30 = val & PIPEACONF_DOUBLE_WIDE ? "double-wide" : "single-wide";
-
- if (IS_IGDNG(pI830)) {
- switch (val & (7<<5)) {
- case PIPECONF_8BPP:
- bpc = "8bpc";
- break;
- case PIPECONF_10BPP:
- bpc = "10bpc";
- break;
- case PIPECONF_6BPP:
- bpc = "6bpc";
- break;
- case PIPECONF_12BPP:
- bpc = "12bpc";
- break;
+ char *enabled = val & PIPEACONF_ENABLE ? "enabled" : "disabled";
+ char *bit30;
+ char *bpc = NULL;
+ if (IS_I965G(pI830))
+ bit30 = val & I965_PIPECONF_ACTIVE ? "active" : "inactive";
+ else
+ bit30 =
+ val & PIPEACONF_DOUBLE_WIDE ? "double-wide" : "single-wide";
+
+ if (IS_IGDNG(pI830)) {
+ switch (val & (7 << 5)) {
+ case PIPECONF_8BPP:
+ bpc = "8bpc";
+ break;
+ case PIPECONF_10BPP:
+ bpc = "10bpc";
+ break;
+ case PIPECONF_6BPP:
+ bpc = "6bpc";
+ break;
+ case PIPECONF_12BPP:
+ bpc = "12bpc";
+ break;
+ }
}
- }
- if (IS_IGDNG(pI830))
- return XNFprintf("%s, %s, %s", enabled, bit30, bpc);
- else
- return XNFprintf("%s, %s", enabled, bit30);
+ if (IS_IGDNG(pI830))
+ return XNFprintf("%s, %s, %s", enabled, bit30, bpc);
+ else
+ return XNFprintf("%s, %s", enabled, bit30);
}
DEBUGSTRING(i830_debug_pipestat)
{
- char *_FIFO_UNDERRUN = val & FIFO_UNDERRUN ? " FIFO_UNDERRUN" : "";
- char *_CRC_ERROR_ENABLE = val & CRC_ERROR_ENABLE ? " CRC_ERROR_ENABLE" : "";
- char *_CRC_DONE_ENABLE = val & CRC_DONE_ENABLE ? " CRC_DONE_ENABLE" : "";
- char *_GMBUS_EVENT_ENABLE = val & GMBUS_EVENT_ENABLE ? " GMBUS_EVENT_ENABLE" : "";
- char *_VSYNC_INT_ENABLE = val & VSYNC_INT_ENABLE ? " VSYNC_INT_ENABLE" : "";
- char *_DLINE_COMPARE_ENABLE = val & DLINE_COMPARE_ENABLE ? " DLINE_COMPARE_ENABLE" : "";
- char *_DPST_EVENT_ENABLE = val & DPST_EVENT_ENABLE ? " DPST_EVENT_ENABLE" : "";
- char *_LBLC_EVENT_ENABLE = val & LBLC_EVENT_ENABLE ? " LBLC_EVENT_ENABLE" : "";
- char *_OFIELD_INT_ENABLE = val & OFIELD_INT_ENABLE ? " OFIELD_INT_ENABLE" : "";
- char *_EFIELD_INT_ENABLE = val & EFIELD_INT_ENABLE ? " EFIELD_INT_ENABLE" : "";
- char *_SVBLANK_INT_ENABLE = val & SVBLANK_INT_ENABLE ? " SVBLANK_INT_ENABLE" : "";
- char *_VBLANK_INT_ENABLE = val & VBLANK_INT_ENABLE ? " VBLANK_INT_ENABLE" : "";
- char *_OREG_UPDATE_ENABLE = val & OREG_UPDATE_ENABLE ? " OREG_UPDATE_ENABLE" : "";
- char *_CRC_ERROR_INT_STATUS = val & CRC_ERROR_INT_STATUS ? " CRC_ERROR_INT_STATUS" : "";
- char *_CRC_DONE_INT_STATUS = val & CRC_DONE_INT_STATUS ? " CRC_DONE_INT_STATUS" : "";
- char *_GMBUS_INT_STATUS = val & GMBUS_INT_STATUS ? " GMBUS_INT_STATUS" : "";
- char *_VSYNC_INT_STATUS = val & VSYNC_INT_STATUS ? " VSYNC_INT_STATUS" : "";
- char *_DLINE_COMPARE_STATUS = val & DLINE_COMPARE_STATUS ? " DLINE_COMPARE_STATUS" : "";
- char *_DPST_EVENT_STATUS = val & DPST_EVENT_STATUS ? " DPST_EVENT_STATUS" : "";
- char *_LBLC_EVENT_STATUS = val & LBLC_EVENT_STATUS ? " LBLC_EVENT_STATUS" : "";
- char *_OFIELD_INT_STATUS = val & OFIELD_INT_STATUS ? " OFIELD_INT_STATUS" : "";
- char *_EFIELD_INT_STATUS = val & EFIELD_INT_STATUS ? " EFIELD_INT_STATUS" : "";
- char *_SVBLANK_INT_STATUS = val & SVBLANK_INT_STATUS ? " SVBLANK_INT_STATUS" : "";
- char *_VBLANK_INT_STATUS = val & VBLANK_INT_STATUS ? " VBLANK_INT_STATUS" : "";
- char *_OREG_UPDATE_STATUS = val & OREG_UPDATE_STATUS ? " OREG_UPDATE_STATUS" : "";
- return XNFprintf("status:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
- _FIFO_UNDERRUN,
- _CRC_ERROR_ENABLE,
- _CRC_DONE_ENABLE,
- _GMBUS_EVENT_ENABLE,
- _VSYNC_INT_ENABLE,
- _DLINE_COMPARE_ENABLE,
- _DPST_EVENT_ENABLE,
- _LBLC_EVENT_ENABLE,
- _OFIELD_INT_ENABLE,
- _EFIELD_INT_ENABLE,
- _SVBLANK_INT_ENABLE,
- _VBLANK_INT_ENABLE,
- _OREG_UPDATE_ENABLE,
- _CRC_ERROR_INT_STATUS,
- _CRC_DONE_INT_STATUS,
- _GMBUS_INT_STATUS,
- _VSYNC_INT_STATUS,
- _DLINE_COMPARE_STATUS,
- _DPST_EVENT_STATUS,
- _LBLC_EVENT_STATUS,
- _OFIELD_INT_STATUS,
- _EFIELD_INT_STATUS,
- _SVBLANK_INT_STATUS,
- _VBLANK_INT_STATUS,
- _OREG_UPDATE_STATUS);
+ char *_FIFO_UNDERRUN = val & FIFO_UNDERRUN ? " FIFO_UNDERRUN" : "";
+ char *_CRC_ERROR_ENABLE =
+ val & CRC_ERROR_ENABLE ? " CRC_ERROR_ENABLE" : "";
+ char *_CRC_DONE_ENABLE =
+ val & CRC_DONE_ENABLE ? " CRC_DONE_ENABLE" : "";
+ char *_GMBUS_EVENT_ENABLE =
+ val & GMBUS_EVENT_ENABLE ? " GMBUS_EVENT_ENABLE" : "";
+ char *_VSYNC_INT_ENABLE =
+ val & VSYNC_INT_ENABLE ? " VSYNC_INT_ENABLE" : "";
+ char *_DLINE_COMPARE_ENABLE =
+ val & DLINE_COMPARE_ENABLE ? " DLINE_COMPARE_ENABLE" : "";
+ char *_DPST_EVENT_ENABLE =
+ val & DPST_EVENT_ENABLE ? " DPST_EVENT_ENABLE" : "";
+ char *_LBLC_EVENT_ENABLE =
+ val & LBLC_EVENT_ENABLE ? " LBLC_EVENT_ENABLE" : "";
+ char *_OFIELD_INT_ENABLE =
+ val & OFIELD_INT_ENABLE ? " OFIELD_INT_ENABLE" : "";
+ char *_EFIELD_INT_ENABLE =
+ val & EFIELD_INT_ENABLE ? " EFIELD_INT_ENABLE" : "";
+ char *_SVBLANK_INT_ENABLE =
+ val & SVBLANK_INT_ENABLE ? " SVBLANK_INT_ENABLE" : "";
+ char *_VBLANK_INT_ENABLE =
+ val & VBLANK_INT_ENABLE ? " VBLANK_INT_ENABLE" : "";
+ char *_OREG_UPDATE_ENABLE =
+ val & OREG_UPDATE_ENABLE ? " OREG_UPDATE_ENABLE" : "";
+ char *_CRC_ERROR_INT_STATUS =
+ val & CRC_ERROR_INT_STATUS ? " CRC_ERROR_INT_STATUS" : "";
+ char *_CRC_DONE_INT_STATUS =
+ val & CRC_DONE_INT_STATUS ? " CRC_DONE_INT_STATUS" : "";
+ char *_GMBUS_INT_STATUS =
+ val & GMBUS_INT_STATUS ? " GMBUS_INT_STATUS" : "";
+ char *_VSYNC_INT_STATUS =
+ val & VSYNC_INT_STATUS ? " VSYNC_INT_STATUS" : "";
+ char *_DLINE_COMPARE_STATUS =
+ val & DLINE_COMPARE_STATUS ? " DLINE_COMPARE_STATUS" : "";
+ char *_DPST_EVENT_STATUS =
+ val & DPST_EVENT_STATUS ? " DPST_EVENT_STATUS" : "";
+ char *_LBLC_EVENT_STATUS =
+ val & LBLC_EVENT_STATUS ? " LBLC_EVENT_STATUS" : "";
+ char *_OFIELD_INT_STATUS =
+ val & OFIELD_INT_STATUS ? " OFIELD_INT_STATUS" : "";
+ char *_EFIELD_INT_STATUS =
+ val & EFIELD_INT_STATUS ? " EFIELD_INT_STATUS" : "";
+ char *_SVBLANK_INT_STATUS =
+ val & SVBLANK_INT_STATUS ? " SVBLANK_INT_STATUS" : "";
+ char *_VBLANK_INT_STATUS =
+ val & VBLANK_INT_STATUS ? " VBLANK_INT_STATUS" : "";
+ char *_OREG_UPDATE_STATUS =
+ val & OREG_UPDATE_STATUS ? " OREG_UPDATE_STATUS" : "";
+ return
+ XNFprintf
+ ("status:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+ _FIFO_UNDERRUN, _CRC_ERROR_ENABLE, _CRC_DONE_ENABLE,
+ _GMBUS_EVENT_ENABLE, _VSYNC_INT_ENABLE, _DLINE_COMPARE_ENABLE,
+ _DPST_EVENT_ENABLE, _LBLC_EVENT_ENABLE, _OFIELD_INT_ENABLE,
+ _EFIELD_INT_ENABLE, _SVBLANK_INT_ENABLE, _VBLANK_INT_ENABLE,
+ _OREG_UPDATE_ENABLE, _CRC_ERROR_INT_STATUS, _CRC_DONE_INT_STATUS,
+ _GMBUS_INT_STATUS, _VSYNC_INT_STATUS, _DLINE_COMPARE_STATUS,
+ _DPST_EVENT_STATUS, _LBLC_EVENT_STATUS, _OFIELD_INT_STATUS,
+ _EFIELD_INT_STATUS, _SVBLANK_INT_STATUS, _VBLANK_INT_STATUS,
+ _OREG_UPDATE_STATUS);
}
DEBUGSTRING(i830_debug_hvtotal)
{
- return XNFprintf("%d active, %d total", (val & 0xffff) + 1,
- ((val & 0xffff0000) >> 16) + 1);
+ return XNFprintf("%d active, %d total", (val & 0xffff) + 1,
+ ((val & 0xffff0000) >> 16) + 1);
}
DEBUGSTRING(i830_debug_hvsyncblank)
{
- return XNFprintf("%d start, %d end", (val & 0xffff) + 1,
- ((val & 0xffff0000) >> 16) + 1);
+ return XNFprintf("%d start, %d end", (val & 0xffff) + 1,
+ ((val & 0xffff0000) >> 16) + 1);
}
DEBUGSTRING(i830_debug_vgacntrl)
{
- return XNFprintf("%s", val & VGA_DISP_DISABLE ? "disabled" : "enabled");
+ return XNFprintf("%s", val & VGA_DISP_DISABLE ? "disabled" : "enabled");
}
DEBUGSTRING(i830_debug_fp)
{
- if (IS_IGD(pI830)) {
+ if (IS_IGD(pI830)) {
+ return XNFprintf("n = %d, m1 = %d, m2 = %d",
+ ffs((val & FP_N_IGD_DIV_MASK) >>
+ FP_N_DIV_SHIFT) - 1,
+ ((val & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT),
+ ((val & FP_M2_IGD_DIV_MASK) >>
+ FP_M2_DIV_SHIFT));
+ }
return XNFprintf("n = %d, m1 = %d, m2 = %d",
- ffs((val & FP_N_IGD_DIV_MASK) >> FP_N_DIV_SHIFT) - 1,
+ ((val & FP_N_DIV_MASK) >> FP_N_DIV_SHIFT),
((val & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT),
- ((val & FP_M2_IGD_DIV_MASK) >> FP_M2_DIV_SHIFT));
- }
- return XNFprintf("n = %d, m1 = %d, m2 = %d",
- ((val & FP_N_DIV_MASK) >> FP_N_DIV_SHIFT),
- ((val & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT),
- ((val & FP_M2_DIV_MASK) >> FP_M2_DIV_SHIFT));
+ ((val & FP_M2_DIV_MASK) >> FP_M2_DIV_SHIFT));
}
DEBUGSTRING(i830_debug_vga_pd)
{
- int vga0_p1, vga0_p2, vga1_p1, vga1_p2;
+ int vga0_p1, vga0_p2, vga1_p1, vga1_p2;
- /* XXX: i9xx version */
+ /* XXX: i9xx version */
- if (val & VGA0_PD_P1_DIV_2)
- vga0_p1 = 2;
- else
- vga0_p1 = ((val & VGA0_PD_P1_MASK) >> VGA0_PD_P1_SHIFT) + 2;
- vga0_p2 = (val & VGA0_PD_P2_DIV_4) ? 4 : 2;
+ if (val & VGA0_PD_P1_DIV_2)
+ vga0_p1 = 2;
+ else
+ vga0_p1 = ((val & VGA0_PD_P1_MASK) >> VGA0_PD_P1_SHIFT) + 2;
+ vga0_p2 = (val & VGA0_PD_P2_DIV_4) ? 4 : 2;
- if (val & VGA1_PD_P1_DIV_2)
- vga1_p1 = 2;
- else
- vga1_p1 = ((val & VGA1_PD_P1_MASK) >> VGA1_PD_P1_SHIFT) + 2;
- vga1_p2 = (val & VGA1_PD_P2_DIV_4) ? 4 : 2;
+ if (val & VGA1_PD_P1_DIV_2)
+ vga1_p1 = 2;
+ else
+ vga1_p1 = ((val & VGA1_PD_P1_MASK) >> VGA1_PD_P1_SHIFT) + 2;
+ vga1_p2 = (val & VGA1_PD_P2_DIV_4) ? 4 : 2;
- return XNFprintf("vga0 p1 = %d, p2 = %d, vga1 p1 = %d, p2 = %d",
- vga0_p1, vga0_p2, vga1_p1, vga1_p2);
+ return XNFprintf("vga0 p1 = %d, p2 = %d, vga1 p1 = %d, p2 = %d",
+ vga0_p1, vga0_p2, vga1_p1, vga1_p2);
}
DEBUGSTRING(i830_debug_pp_status)
{
- char *status = val & PP_ON ? "on" : "off";
- char *ready = val & PP_READY ? "ready" : "not ready";
- char *seq = "unknown";
-
- switch (val & PP_SEQUENCE_MASK) {
- case PP_SEQUENCE_NONE:
- seq = "idle";
- break;
- case PP_SEQUENCE_ON:
- seq = "on";
- break;
- case PP_SEQUENCE_OFF:
- seq = "off";
- break;
- }
-
- return XNFprintf("%s, %s, sequencing %s", status, ready, seq);
+ char *status = val & PP_ON ? "on" : "off";
+ char *ready = val & PP_READY ? "ready" : "not ready";
+ char *seq = "unknown";
+
+ switch (val & PP_SEQUENCE_MASK) {
+ case PP_SEQUENCE_NONE:
+ seq = "idle";
+ break;
+ case PP_SEQUENCE_ON:
+ seq = "on";
+ break;
+ case PP_SEQUENCE_OFF:
+ seq = "off";
+ break;
+ }
+
+ return XNFprintf("%s, %s, sequencing %s", status, ready, seq);
}
DEBUGSTRING(i830_debug_pp_control)
{
- return XNFprintf("power target: %s",
- val & POWER_TARGET_ON ? "on" : "off");
+ return XNFprintf("power target: %s",
+ val & POWER_TARGET_ON ? "on" : "off");
}
DEBUGSTRING(i830_debug_dpll)
{
- char *enabled = val & DPLL_VCO_ENABLE ? "enabled" : "disabled";
- char *dvomode = val & DPLL_DVO_HIGH_SPEED ? "dvo" : "non-dvo";
- char *vgamode = val & DPLL_VGA_MODE_DIS ? "" : ", VGA";
- char *mode = "unknown";
- char *clock = "unknown";
- char *fpextra = val & DISPLAY_RATE_SELECT_FPA1 ? ", using FPx1!" : "";
- char sdvoextra[20];
- int p1, p2 = 0;
-
- if (IS_I9XX(pI830)) {
- if (IS_IGD(pI830)) {
- p1 = ffs((val & DPLL_FPA01_P1_POST_DIV_MASK_IGD) >>
- DPLL_FPA01_P1_POST_DIV_SHIFT_IGD);
+ char *enabled = val & DPLL_VCO_ENABLE ? "enabled" : "disabled";
+ char *dvomode = val & DPLL_DVO_HIGH_SPEED ? "dvo" : "non-dvo";
+ char *vgamode = val & DPLL_VGA_MODE_DIS ? "" : ", VGA";
+ char *mode = "unknown";
+ char *clock = "unknown";
+ char *fpextra = val & DISPLAY_RATE_SELECT_FPA1 ? ", using FPx1!" : "";
+ char sdvoextra[20];
+ int p1, p2 = 0;
+
+ if (IS_I9XX(pI830)) {
+ if (IS_IGD(pI830)) {
+ p1 = ffs((val & DPLL_FPA01_P1_POST_DIV_MASK_IGD) >>
+ DPLL_FPA01_P1_POST_DIV_SHIFT_IGD);
+ } else {
+ p1 = ffs((val & DPLL_FPA01_P1_POST_DIV_MASK) >>
+ DPLL_FPA01_P1_POST_DIV_SHIFT);
+ }
+ switch (val & DPLL_MODE_MASK) {
+ case DPLLB_MODE_DAC_SERIAL:
+ mode = "DAC/serial";
+ p2 = val & DPLL_DAC_SERIAL_P2_CLOCK_DIV_5 ? 5 : 10;
+ break;
+ case DPLLB_MODE_LVDS:
+ mode = "LVDS";
+ p2 = val & DPLLB_LVDS_P2_CLOCK_DIV_7 ? 7 : 14;
+ break;
+ }
} else {
- p1 = ffs((val & DPLL_FPA01_P1_POST_DIV_MASK) >>
- DPLL_FPA01_P1_POST_DIV_SHIFT);
+ Bool is_lvds = (INREG(LVDS) & LVDS_PORT_EN) && (reg == DPLL_B);
+
+ if (is_lvds) {
+ mode = "LVDS";
+ p1 = ffs((val & DPLL_FPA01_P1_POST_DIV_MASK_I830_LVDS)
+ >> DPLL_FPA01_P1_POST_DIV_SHIFT);
+ if ((INREG(LVDS) & LVDS_CLKB_POWER_MASK) ==
+ LVDS_CLKB_POWER_UP)
+ p2 = 7;
+ else
+ p2 = 14;
+
+ } else {
+ mode = "DAC/serial";
+ if (val & PLL_P1_DIVIDE_BY_TWO) {
+ p1 = 2;
+ } else {
+ /* Map the number in the field to (3, 33) */
+ p1 = ((val & DPLL_FPA01_P1_POST_DIV_MASK_I830)
+ >> DPLL_FPA01_P1_POST_DIV_SHIFT) + 2;
+ }
+ if (val & PLL_P2_DIVIDE_BY_4)
+ p2 = 4;
+ else
+ p2 = 2;
+ }
}
- switch (val & DPLL_MODE_MASK) {
- case DPLLB_MODE_DAC_SERIAL:
- mode = "DAC/serial";
- p2 = val & DPLL_DAC_SERIAL_P2_CLOCK_DIV_5 ? 5 : 10;
- break;
- case DPLLB_MODE_LVDS:
- mode = "LVDS";
- p2 = val & DPLLB_LVDS_P2_CLOCK_DIV_7 ? 7 : 14;
- break;
+
+ switch (val & PLL_REF_INPUT_MASK) {
+ case PLL_REF_INPUT_DREFCLK:
+ clock = "default";
+ break;
+ case PLL_REF_INPUT_TVCLKINA:
+ clock = "TV A";
+ break;
+ case PLL_REF_INPUT_TVCLKINBC:
+ clock = "TV B/C";
+ break;
+ case PLLB_REF_INPUT_SPREADSPECTRUMIN:
+ if (reg == DPLL_B)
+ clock = "spread spectrum";
+ break;
}
- } else {
- Bool is_lvds = (INREG(LVDS) & LVDS_PORT_EN) && (reg == DPLL_B);
-
- if (is_lvds) {
- mode = "LVDS";
- p1 = ffs((val & DPLL_FPA01_P1_POST_DIV_MASK_I830_LVDS) >>
- DPLL_FPA01_P1_POST_DIV_SHIFT);
- if ((INREG(LVDS) & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP)
- p2 = 7;
- else
- p2 = 14;
+ if (IS_I945G(pI830) || IS_I945GM(pI830) || IS_G33CLASS(pI830)) {
+ sprintf(sdvoextra, ", SDVO mult %d",
+ (int)((val & SDVO_MULTIPLIER_MASK) >>
+ SDVO_MULTIPLIER_SHIFT_HIRES) + 1);
} else {
- mode = "DAC/serial";
- if (val & PLL_P1_DIVIDE_BY_TWO) {
- p1 = 2;
- } else {
- /* Map the number in the field to (3, 33) */
- p1 = ((val & DPLL_FPA01_P1_POST_DIV_MASK_I830) >>
- DPLL_FPA01_P1_POST_DIV_SHIFT) + 2;
- }
- if (val & PLL_P2_DIVIDE_BY_4)
- p2 = 4;
- else
- p2 = 2;
+ sdvoextra[0] = '\0';
}
- }
-
- switch (val & PLL_REF_INPUT_MASK) {
- case PLL_REF_INPUT_DREFCLK:
- clock = "default";
- break;
- case PLL_REF_INPUT_TVCLKINA:
- clock = "TV A";
- break;
- case PLL_REF_INPUT_TVCLKINBC:
- clock = "TV B/C";
- break;
- case PLLB_REF_INPUT_SPREADSPECTRUMIN:
- if (reg == DPLL_B)
- clock = "spread spectrum";
- break;
- }
-
- if (IS_I945G(pI830) || IS_I945GM(pI830) || IS_G33CLASS(pI830)) {
- sprintf(sdvoextra, ", SDVO mult %d",
- (int)((val & SDVO_MULTIPLIER_MASK) >>
- SDVO_MULTIPLIER_SHIFT_HIRES) + 1);
- } else {
- sdvoextra[0] = '\0';
- }
-
- return XNFprintf("%s, %s%s, %s clock, %s mode, p1 = %d, "
- "p2 = %d%s%s",
- enabled, dvomode, vgamode, clock, mode, p1, p2,
- fpextra, sdvoextra);
+
+ return XNFprintf("%s, %s%s, %s clock, %s mode, p1 = %d, "
+ "p2 = %d%s%s",
+ enabled, dvomode, vgamode, clock, mode, p1, p2,
+ fpextra, sdvoextra);
}
DEBUGSTRING(i830_debug_dpll_test)
{
- char *dpllandiv = val & DPLLA_TEST_N_BYPASS ? ", DPLLA N bypassed" : "";
- char *dpllamdiv = val & DPLLA_TEST_M_BYPASS ? ", DPLLA M bypassed" : "";
- char *dpllainput = val & DPLLA_INPUT_BUFFER_ENABLE ?
- "" : ", DPLLA input buffer disabled";
- char *dpllbndiv = val & DPLLB_TEST_N_BYPASS ? ", DPLLB N bypassed" : "";
- char *dpllbmdiv = val & DPLLB_TEST_M_BYPASS ? ", DPLLB M bypassed" : "";
- char *dpllbinput = val & DPLLB_INPUT_BUFFER_ENABLE ?
- "" : ", DPLLB input buffer disabled";
-
- return XNFprintf("%s%s%s%s%s%s",
- dpllandiv, dpllamdiv, dpllainput,
- dpllbndiv, dpllbmdiv, dpllbinput);
+ char *dpllandiv = val & DPLLA_TEST_N_BYPASS ? ", DPLLA N bypassed" : "";
+ char *dpllamdiv = val & DPLLA_TEST_M_BYPASS ? ", DPLLA M bypassed" : "";
+ char *dpllainput = val & DPLLA_INPUT_BUFFER_ENABLE ?
+ "" : ", DPLLA input buffer disabled";
+ char *dpllbndiv = val & DPLLB_TEST_N_BYPASS ? ", DPLLB N bypassed" : "";
+ char *dpllbmdiv = val & DPLLB_TEST_M_BYPASS ? ", DPLLB M bypassed" : "";
+ char *dpllbinput = val & DPLLB_INPUT_BUFFER_ENABLE ?
+ "" : ", DPLLB input buffer disabled";
+
+ return XNFprintf("%s%s%s%s%s%s",
+ dpllandiv, dpllamdiv, dpllainput,
+ dpllbndiv, dpllbmdiv, dpllbinput);
}
DEBUGSTRING(i830_debug_adpa)
{
- char pipe = (val & ADPA_PIPE_B_SELECT) ? 'B' : 'A';
- char *enable = (val & ADPA_DAC_ENABLE) ? "enabled" : "disabled";
- char hsync = (val & ADPA_HSYNC_ACTIVE_HIGH) ? '+' : '-';
- char vsync = (val & ADPA_VSYNC_ACTIVE_HIGH) ? '+' : '-';
-
- if (IS_IGDNG(pI830))
- return XNFprintf("%s, transcoder %c, %chsync, %cvsync",
- enable, pipe, hsync, vsync);
- else
- return XNFprintf("%s, pipe %c, %chsync, %cvsync",
- enable, pipe, hsync, vsync);
+ char pipe = (val & ADPA_PIPE_B_SELECT) ? 'B' : 'A';
+ char *enable = (val & ADPA_DAC_ENABLE) ? "enabled" : "disabled";
+ char hsync = (val & ADPA_HSYNC_ACTIVE_HIGH) ? '+' : '-';
+ char vsync = (val & ADPA_VSYNC_ACTIVE_HIGH) ? '+' : '-';
+
+ if (IS_IGDNG(pI830))
+ return XNFprintf("%s, transcoder %c, %chsync, %cvsync",
+ enable, pipe, hsync, vsync);
+ else
+ return XNFprintf("%s, pipe %c, %chsync, %cvsync",
+ enable, pipe, hsync, vsync);
}
DEBUGSTRING(i830_debug_lvds)
{
- char pipe = val & LVDS_PIPEB_SELECT ? 'B' : 'A';
- char *enable = val & LVDS_PORT_EN ? "enabled" : "disabled";
- int depth;
- char *channels;
-
- if ((val & LVDS_A3_POWER_MASK) == LVDS_A3_POWER_UP)
- depth = 24;
- else
- depth = 18;
- if ((val & LVDS_B0B3_POWER_MASK) == LVDS_B0B3_POWER_UP)
- channels = "2 channels";
- else
- channels = "1 channel";
-
-
- return XNFprintf("%s, pipe %c, %d bit, %s",
- enable, pipe, depth, channels);
+ char pipe = val & LVDS_PIPEB_SELECT ? 'B' : 'A';
+ char *enable = val & LVDS_PORT_EN ? "enabled" : "disabled";
+ int depth;
+ char *channels;
+
+ if ((val & LVDS_A3_POWER_MASK) == LVDS_A3_POWER_UP)
+ depth = 24;
+ else
+ depth = 18;
+ if ((val & LVDS_B0B3_POWER_MASK) == LVDS_B0B3_POWER_UP)
+ channels = "2 channels";
+ else
+ channels = "1 channel";
+
+ return XNFprintf("%s, pipe %c, %d bit, %s",
+ enable, pipe, depth, channels);
}
DEBUGSTRING(i830_debug_dvo)
{
- char *enable = val & DVO_ENABLE ? "enabled" : "disabled";
- char pipe = val & DVO_PIPE_B_SELECT ? 'B' : 'A';
- char *stall;
- char hsync = val & DVO_HSYNC_ACTIVE_HIGH ? '+' : '-';
- char vsync = val & DVO_VSYNC_ACTIVE_HIGH ? '+' : '-';
-
- switch (val & DVO_PIPE_STALL_MASK) {
- case DVO_PIPE_STALL_UNUSED:
- stall = "no stall";
- break;
- case DVO_PIPE_STALL:
- stall = "stall";
- break;
- case DVO_PIPE_STALL_TV:
- stall = "TV stall";
- break;
- default:
- stall = "unknown stall";
- break;
- }
-
- return XNFprintf("%s, pipe %c, %s, %chsync, %cvsync",
- enable, pipe, stall, hsync, vsync);
+ char *enable = val & DVO_ENABLE ? "enabled" : "disabled";
+ char pipe = val & DVO_PIPE_B_SELECT ? 'B' : 'A';
+ char *stall;
+ char hsync = val & DVO_HSYNC_ACTIVE_HIGH ? '+' : '-';
+ char vsync = val & DVO_VSYNC_ACTIVE_HIGH ? '+' : '-';
+
+ switch (val & DVO_PIPE_STALL_MASK) {
+ case DVO_PIPE_STALL_UNUSED:
+ stall = "no stall";
+ break;
+ case DVO_PIPE_STALL:
+ stall = "stall";
+ break;
+ case DVO_PIPE_STALL_TV:
+ stall = "TV stall";
+ break;
+ default:
+ stall = "unknown stall";
+ break;
+ }
+
+ return XNFprintf("%s, pipe %c, %s, %chsync, %cvsync",
+ enable, pipe, stall, hsync, vsync);
}
DEBUGSTRING(i830_debug_sdvo)
{
- char *enable = val & SDVO_ENABLE ? "enabled" : "disabled";
- char pipe = val & SDVO_PIPE_B_SELECT ? 'B' : 'A';
- char *stall = val & SDVO_STALL_SELECT ? "enabled" : "disabled";
- char *detected = val & SDVO_DETECTED ? "" : "not ";
- char *gang = val & SDVOC_GANG_MODE ? ", gang mode" : "";
- char sdvoextra[20];
-
- if (IS_I915G(pI830) || IS_I915GM(pI830)) {
- sprintf(sdvoextra, ", SDVO mult %d",
- (int)((val & SDVO_PORT_MULTIPLY_MASK) >>
- SDVO_PORT_MULTIPLY_SHIFT) + 1);
- } else {
- sdvoextra[0] = '\0';
- }
-
- return XNFprintf("%s, pipe %c, stall %s, %sdetected%s%s",
- enable, pipe, stall, detected, sdvoextra, gang);
+ char *enable = val & SDVO_ENABLE ? "enabled" : "disabled";
+ char pipe = val & SDVO_PIPE_B_SELECT ? 'B' : 'A';
+ char *stall = val & SDVO_STALL_SELECT ? "enabled" : "disabled";
+ char *detected = val & SDVO_DETECTED ? "" : "not ";
+ char *gang = val & SDVOC_GANG_MODE ? ", gang mode" : "";
+ char sdvoextra[20];
+
+ if (IS_I915G(pI830) || IS_I915GM(pI830)) {
+ sprintf(sdvoextra, ", SDVO mult %d",
+ (int)((val & SDVO_PORT_MULTIPLY_MASK) >>
+ SDVO_PORT_MULTIPLY_SHIFT) + 1);
+ } else {
+ sdvoextra[0] = '\0';
+ }
+
+ return XNFprintf("%s, pipe %c, stall %s, %sdetected%s%s",
+ enable, pipe, stall, detected, sdvoextra, gang);
}
DEBUGSTRING(i830_debug_dspclk_gate_d)
{
- char *DPUNIT_B = val & DPUNIT_B_CLOCK_GATE_DISABLE ? " DPUNIT_B" : "";
- char *VSUNIT = val & VSUNIT_CLOCK_GATE_DISABLE ? " VSUNIT" : "";
- char *VRHUNIT = val & VRHUNIT_CLOCK_GATE_DISABLE ? " VRHUNIT" : "";
- char *VRDUNIT = val & VRDUNIT_CLOCK_GATE_DISABLE ? " VRDUNIT" : "";
- char *AUDUNIT = val & AUDUNIT_CLOCK_GATE_DISABLE ? " AUDUNIT" : "";
- char *DPUNIT_A = val & DPUNIT_A_CLOCK_GATE_DISABLE ? " DPUNIT_A" : "";
- char *DPCUNIT = val & DPCUNIT_CLOCK_GATE_DISABLE ? " DPCUNIT" : "";
- char *TVRUNIT = val & TVRUNIT_CLOCK_GATE_DISABLE ? " TVRUNIT" : "";
- char *TVCUNIT = val & TVCUNIT_CLOCK_GATE_DISABLE ? " TVCUNIT" : "";
- char *TVFUNIT = val & TVFUNIT_CLOCK_GATE_DISABLE ? " TVFUNIT" : "";
- char *TVEUNIT = val & TVEUNIT_CLOCK_GATE_DISABLE ? " TVEUNIT" : "";
- char *DVSUNIT = val & DVSUNIT_CLOCK_GATE_DISABLE ? " DVSUNIT" : "";
- char *DSSUNIT = val & DSSUNIT_CLOCK_GATE_DISABLE ? " DSSUNIT" : "";
- char *DDBUNIT = val & DDBUNIT_CLOCK_GATE_DISABLE ? " DDBUNIT" : "";
- char *DPRUNIT = val & DPRUNIT_CLOCK_GATE_DISABLE ? " DPRUNIT" : "";
- char *DPFUNIT = val & DPFUNIT_CLOCK_GATE_DISABLE ? " DPFUNIT" : "";
- char *DPBMUNIT = val & DPBMUNIT_CLOCK_GATE_DISABLE ? " DPBMUNIT" : "";
- char *DPLSUNIT = val & DPLSUNIT_CLOCK_GATE_DISABLE ? " DPLSUNIT" : "";
- char *DPLUNIT = val & DPLUNIT_CLOCK_GATE_DISABLE ? " DPLUNIT" : "";
- char *DPOUNIT = val & DPOUNIT_CLOCK_GATE_DISABLE ? " DPOUNIT" : "";
- char *DPBUNIT = val & DPBUNIT_CLOCK_GATE_DISABLE ? " DPBUNIT" : "";
- char *DCUNIT = val & DCUNIT_CLOCK_GATE_DISABLE ? " DCUNIT" : "";
- char *DPUNIT = val & DPUNIT_CLOCK_GATE_DISABLE ? " DPUNIT" : "";
- char *VRUNIT = val & VRUNIT_CLOCK_GATE_DISABLE ? " VRUNIT" : "";
- char *OVHUNIT = val & OVHUNIT_CLOCK_GATE_DISABLE ? " OVHUNIT" : "";
- char *DPIOUNIT = val & DPIOUNIT_CLOCK_GATE_DISABLE ? " DPIOUNIT" : "";
- char *OVFUNIT = val & OVFUNIT_CLOCK_GATE_DISABLE ? " OVFUNIT" : "";
- char *OVBUNIT = val & OVBUNIT_CLOCK_GATE_DISABLE ? " OVBUNIT" : "";
- char *OVRUNIT = val & OVRUNIT_CLOCK_GATE_DISABLE ? " OVRUNIT" : "";
- char *OVCUNIT = val & OVCUNIT_CLOCK_GATE_DISABLE ? " OVCUNIT" : "";
- char *OVUUNIT = val & OVUUNIT_CLOCK_GATE_DISABLE ? " OVUUNIT" : "";
- char *OVLUNIT = val & OVLUNIT_CLOCK_GATE_DISABLE ? " OVLUNIT" : "";
-
- return XNFprintf ("clock gates disabled:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
- DPUNIT_B,
- VSUNIT,
- VRHUNIT,
- VRDUNIT,
- AUDUNIT,
- DPUNIT_A,
- DPCUNIT,
- TVRUNIT,
- TVCUNIT,
- TVFUNIT,
- TVEUNIT,
- DVSUNIT,
- DSSUNIT,
- DDBUNIT,
- DPRUNIT,
- DPFUNIT,
- DPBMUNIT,
- DPLSUNIT,
- DPLUNIT,
- DPOUNIT,
- DPBUNIT,
- DCUNIT,
- DPUNIT,
- VRUNIT,
- OVHUNIT,
- DPIOUNIT,
- OVFUNIT,
- OVBUNIT,
- OVRUNIT,
- OVCUNIT,
- OVUUNIT,
- OVLUNIT);
+ char *DPUNIT_B = val & DPUNIT_B_CLOCK_GATE_DISABLE ? " DPUNIT_B" : "";
+ char *VSUNIT = val & VSUNIT_CLOCK_GATE_DISABLE ? " VSUNIT" : "";
+ char *VRHUNIT = val & VRHUNIT_CLOCK_GATE_DISABLE ? " VRHUNIT" : "";
+ char *VRDUNIT = val & VRDUNIT_CLOCK_GATE_DISABLE ? " VRDUNIT" : "";
+ char *AUDUNIT = val & AUDUNIT_CLOCK_GATE_DISABLE ? " AUDUNIT" : "";
+ char *DPUNIT_A = val & DPUNIT_A_CLOCK_GATE_DISABLE ? " DPUNIT_A" : "";
+ char *DPCUNIT = val & DPCUNIT_CLOCK_GATE_DISABLE ? " DPCUNIT" : "";
+ char *TVRUNIT = val & TVRUNIT_CLOCK_GATE_DISABLE ? " TVRUNIT" : "";
+ char *TVCUNIT = val & TVCUNIT_CLOCK_GATE_DISABLE ? " TVCUNIT" : "";
+ char *TVFUNIT = val & TVFUNIT_CLOCK_GATE_DISABLE ? " TVFUNIT" : "";
+ char *TVEUNIT = val & TVEUNIT_CLOCK_GATE_DISABLE ? " TVEUNIT" : "";
+ char *DVSUNIT = val & DVSUNIT_CLOCK_GATE_DISABLE ? " DVSUNIT" : "";
+ char *DSSUNIT = val & DSSUNIT_CLOCK_GATE_DISABLE ? " DSSUNIT" : "";
+ char *DDBUNIT = val & DDBUNIT_CLOCK_GATE_DISABLE ? " DDBUNIT" : "";
+ char *DPRUNIT = val & DPRUNIT_CLOCK_GATE_DISABLE ? " DPRUNIT" : "";
+ char *DPFUNIT = val & DPFUNIT_CLOCK_GATE_DISABLE ? " DPFUNIT" : "";
+ char *DPBMUNIT = val & DPBMUNIT_CLOCK_GATE_DISABLE ? " DPBMUNIT" : "";
+ char *DPLSUNIT = val & DPLSUNIT_CLOCK_GATE_DISABLE ? " DPLSUNIT" : "";
+ char *DPLUNIT = val & DPLUNIT_CLOCK_GATE_DISABLE ? " DPLUNIT" : "";
+ char *DPOUNIT = val & DPOUNIT_CLOCK_GATE_DISABLE ? " DPOUNIT" : "";
+ char *DPBUNIT = val & DPBUNIT_CLOCK_GATE_DISABLE ? " DPBUNIT" : "";
+ char *DCUNIT = val & DCUNIT_CLOCK_GATE_DISABLE ? " DCUNIT" : "";
+ char *DPUNIT = val & DPUNIT_CLOCK_GATE_DISABLE ? " DPUNIT" : "";
+ char *VRUNIT = val & VRUNIT_CLOCK_GATE_DISABLE ? " VRUNIT" : "";
+ char *OVHUNIT = val & OVHUNIT_CLOCK_GATE_DISABLE ? " OVHUNIT" : "";
+ char *DPIOUNIT = val & DPIOUNIT_CLOCK_GATE_DISABLE ? " DPIOUNIT" : "";
+ char *OVFUNIT = val & OVFUNIT_CLOCK_GATE_DISABLE ? " OVFUNIT" : "";
+ char *OVBUNIT = val & OVBUNIT_CLOCK_GATE_DISABLE ? " OVBUNIT" : "";
+ char *OVRUNIT = val & OVRUNIT_CLOCK_GATE_DISABLE ? " OVRUNIT" : "";
+ char *OVCUNIT = val & OVCUNIT_CLOCK_GATE_DISABLE ? " OVCUNIT" : "";
+ char *OVUUNIT = val & OVUUNIT_CLOCK_GATE_DISABLE ? " OVUUNIT" : "";
+ char *OVLUNIT = val & OVLUNIT_CLOCK_GATE_DISABLE ? " OVLUNIT" : "";
+
+ return
+ XNFprintf
+ ("clock gates disabled:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+ DPUNIT_B, VSUNIT, VRHUNIT, VRDUNIT, AUDUNIT, DPUNIT_A, DPCUNIT,
+ TVRUNIT, TVCUNIT, TVFUNIT, TVEUNIT, DVSUNIT, DSSUNIT, DDBUNIT,
+ DPRUNIT, DPFUNIT, DPBMUNIT, DPLSUNIT, DPLUNIT, DPOUNIT, DPBUNIT,
+ DCUNIT, DPUNIT, VRUNIT, OVHUNIT, DPIOUNIT, OVFUNIT, OVBUNIT,
+ OVRUNIT, OVCUNIT, OVUUNIT, OVLUNIT);
}
-
DEBUGSTRING(i810_debug_915_fence)
{
- char *enable = (val & 1) ? " enabled" : "disabled";
- char format = (val & 1 << 12) ? 'Y' : 'X';
- int pitch = 1 << (((val & 0x70) >> 4) - 1);
- unsigned int offset = val & 0x0ff00000;
- int size = (1024 * 1024) << (((val & 0x700) >> 8) - 1);
-
- if (IS_I965G(pI830) || ((IS_I915G(pI830) || IS_I915GM(pI830)) && reg >= FENCE_NEW))
- return NULL;
-
- if (format == 'X')
- pitch *= 4;
-
- return XNFprintf("%s, %c tiled, %4d pitch, 0x%08x - 0x%08x (%dkb)",
- enable, format, pitch, offset, offset + size, size / 1024);
+ char *enable = (val & 1) ? " enabled" : "disabled";
+ char format = (val & 1 << 12) ? 'Y' : 'X';
+ int pitch = 1 << (((val & 0x70) >> 4) - 1);
+ unsigned int offset = val & 0x0ff00000;
+ int size = (1024 * 1024) << (((val & 0x700) >> 8) - 1);
+
+ if (IS_I965G(pI830)
+ || ((IS_I915G(pI830) || IS_I915GM(pI830)) && reg >= FENCE_NEW))
+ return NULL;
+
+ if (format == 'X')
+ pitch *= 4;
+
+ return XNFprintf("%s, %c tiled, %4d pitch, 0x%08x - 0x%08x (%dkb)",
+ enable, format, pitch, offset, offset + size,
+ size / 1024);
}
DEBUGSTRING(i810_debug_965_fence_start)
{
- char *enable = (val & FENCE_VALID) ? " enabled" : "disabled";
- char format = (val & I965_FENCE_Y_MAJOR) ? 'Y' : 'X';
- int pitch = ((val & 0xffc) >> 2) * 128;
- unsigned int offset = val & 0xfffff000;
+ char *enable = (val & FENCE_VALID) ? " enabled" : "disabled";
+ char format = (val & I965_FENCE_Y_MAJOR) ? 'Y' : 'X';
+ int pitch = ((val & 0xffc) >> 2) * 128;
+ unsigned int offset = val & 0xfffff000;
- if (!IS_I965G(pI830))
- return NULL;
+ if (!IS_I965G(pI830))
+ return NULL;
- return XNFprintf("%s, %c tile walk, %4d pitch, 0x%08x start",
- enable, format, pitch, offset);
+ return XNFprintf("%s, %c tile walk, %4d pitch, 0x%08x start",
+ enable, format, pitch, offset);
}
DEBUGSTRING(i810_debug_965_fence_end)
{
- unsigned int end = val & 0xfffff000;
+ unsigned int end = val & 0xfffff000;
- if (!IS_I965G(pI830))
- return NULL;
+ if (!IS_I965G(pI830))
+ return NULL;
- return XNFprintf(" 0x%08x end", end);
+ return XNFprintf(" 0x%08x end", end);
}
#define DEFINEREG(reg) \
@@ -609,1148 +613,1197 @@ DEBUGSTRING(i810_debug_965_fence_end)
{ reg, #reg, func, 0 }
struct i830SnapshotRec {
- int reg;
- char *name;
- char *(*debug_output)(I830Ptr pI830, int reg, uint32_t val);
- uint32_t val;
+ int reg;
+ char *name;
+ char *(*debug_output) (I830Ptr pI830, int reg, uint32_t val);
+ uint32_t val;
};
static struct i830SnapshotRec i830_snapshot[] = {
- DEFINEREG2(DCC, i830_debug_dcc),
- DEFINEREG2(CHDECMISC, i830_debug_chdecmisc),
- DEFINEREG_16BIT(C0DRB0),
- DEFINEREG_16BIT(C0DRB1),
- DEFINEREG_16BIT(C0DRB2),
- DEFINEREG_16BIT(C0DRB3),
- DEFINEREG_16BIT(C1DRB0),
- DEFINEREG_16BIT(C1DRB1),
- DEFINEREG_16BIT(C1DRB2),
- DEFINEREG_16BIT(C1DRB3),
- DEFINEREG_16BIT(C0DRA01),
- DEFINEREG_16BIT(C0DRA23),
- DEFINEREG_16BIT(C1DRA01),
- DEFINEREG_16BIT(C1DRA23),
-
- DEFINEREG(PGETBL_CTL),
-
- DEFINEREG2(VCLK_DIVISOR_VGA0, i830_debug_fp),
- DEFINEREG2(VCLK_DIVISOR_VGA1, i830_debug_fp),
- DEFINEREG2(VCLK_POST_DIV, i830_debug_vga_pd),
- DEFINEREG2(DPLL_TEST, i830_debug_dpll_test),
- DEFINEREG(CACHE_MODE_0),
- DEFINEREG(D_STATE),
- DEFINEREG2(DSPCLK_GATE_D, i830_debug_dspclk_gate_d),
- DEFINEREG(RENCLK_GATE_D1),
- DEFINEREG(RENCLK_GATE_D2),
+ DEFINEREG2(DCC, i830_debug_dcc),
+ DEFINEREG2(CHDECMISC, i830_debug_chdecmisc),
+ DEFINEREG_16BIT(C0DRB0),
+ DEFINEREG_16BIT(C0DRB1),
+ DEFINEREG_16BIT(C0DRB2),
+ DEFINEREG_16BIT(C0DRB3),
+ DEFINEREG_16BIT(C1DRB0),
+ DEFINEREG_16BIT(C1DRB1),
+ DEFINEREG_16BIT(C1DRB2),
+ DEFINEREG_16BIT(C1DRB3),
+ DEFINEREG_16BIT(C0DRA01),
+ DEFINEREG_16BIT(C0DRA23),
+ DEFINEREG_16BIT(C1DRA01),
+ DEFINEREG_16BIT(C1DRA23),
+
+ DEFINEREG(PGETBL_CTL),
+
+ DEFINEREG2(VCLK_DIVISOR_VGA0, i830_debug_fp),
+ DEFINEREG2(VCLK_DIVISOR_VGA1, i830_debug_fp),
+ DEFINEREG2(VCLK_POST_DIV, i830_debug_vga_pd),
+ DEFINEREG2(DPLL_TEST, i830_debug_dpll_test),
+ DEFINEREG(CACHE_MODE_0),
+ DEFINEREG(D_STATE),
+ DEFINEREG2(DSPCLK_GATE_D, i830_debug_dspclk_gate_d),
+ DEFINEREG(RENCLK_GATE_D1),
+ DEFINEREG(RENCLK_GATE_D2),
/* DEFINEREG(RAMCLK_GATE_D), CRL only */
- DEFINEREG2(SDVOB, i830_debug_sdvo),
- DEFINEREG2(SDVOC, i830_debug_sdvo),
+ DEFINEREG2(SDVOB, i830_debug_sdvo),
+ DEFINEREG2(SDVOC, i830_debug_sdvo),
/* DEFINEREG(UDIB_SVB_SHB_CODES), CRL only */
/* DEFINEREG(UDIB_SHA_BLANK_CODES), CRL only */
- DEFINEREG(SDVOUDI),
- DEFINEREG(DSPARB),
- DEFINEREG(DSPFW1),
- DEFINEREG(DSPFW2),
- DEFINEREG(DSPFW3),
-
- DEFINEREG2(ADPA, i830_debug_adpa),
- DEFINEREG2(LVDS, i830_debug_lvds),
- DEFINEREG2(DVOA, i830_debug_dvo),
- DEFINEREG2(DVOB, i830_debug_dvo),
- DEFINEREG2(DVOC, i830_debug_dvo),
- DEFINEREG(DVOA_SRCDIM),
- DEFINEREG(DVOB_SRCDIM),
- DEFINEREG(DVOC_SRCDIM),
-
- DEFINEREG2(PP_CONTROL, i830_debug_pp_control),
- DEFINEREG2(PP_STATUS, i830_debug_pp_status),
- DEFINEREG(PP_ON_DELAYS),
- DEFINEREG(PP_OFF_DELAYS),
- DEFINEREG(PP_DIVISOR),
- DEFINEREG(PFIT_CONTROL),
- DEFINEREG(PFIT_PGM_RATIOS),
- DEFINEREG(PORT_HOTPLUG_EN),
- DEFINEREG(PORT_HOTPLUG_STAT),
-
- DEFINEREG2(DSPACNTR, i830_debug_dspcntr),
- DEFINEREG2(DSPASTRIDE, i830_debug_dspstride),
- DEFINEREG2(DSPAPOS, i830_debug_xy),
- DEFINEREG2(DSPASIZE, i830_debug_xyminus1),
- DEFINEREG(DSPABASE),
- DEFINEREG(DSPASURF),
- DEFINEREG(DSPATILEOFF),
- DEFINEREG2(PIPEACONF, i830_debug_pipeconf),
- DEFINEREG2(PIPEASRC, i830_debug_yxminus1),
- DEFINEREG2(PIPEASTAT, i830_debug_pipestat),
- DEFINEREG(PIPEA_GMCH_DATA_M),
- DEFINEREG(PIPEA_GMCH_DATA_N),
- DEFINEREG(PIPEA_DP_LINK_M),
- DEFINEREG(PIPEA_DP_LINK_N),
- DEFINEREG(CURSOR_A_BASE),
- DEFINEREG(CURSOR_A_CONTROL),
- DEFINEREG(CURSOR_A_POSITION),
-
- DEFINEREG2(FPA0, i830_debug_fp),
- DEFINEREG2(FPA1, i830_debug_fp),
- DEFINEREG2(DPLL_A, i830_debug_dpll),
- DEFINEREG(DPLL_A_MD),
- DEFINEREG2(HTOTAL_A, i830_debug_hvtotal),
- DEFINEREG2(HBLANK_A, i830_debug_hvsyncblank),
- DEFINEREG2(HSYNC_A, i830_debug_hvsyncblank),
- DEFINEREG2(VTOTAL_A, i830_debug_hvtotal),
- DEFINEREG2(VBLANK_A, i830_debug_hvsyncblank),
- DEFINEREG2(VSYNC_A, i830_debug_hvsyncblank),
- DEFINEREG(BCLRPAT_A),
- DEFINEREG(VSYNCSHIFT_A),
-
- DEFINEREG2(DSPBCNTR, i830_debug_dspcntr),
- DEFINEREG2(DSPBSTRIDE, i830_debug_dspstride),
- DEFINEREG2(DSPBPOS, i830_debug_xy),
- DEFINEREG2(DSPBSIZE, i830_debug_xyminus1),
- DEFINEREG(DSPBBASE),
- DEFINEREG(DSPBSURF),
- DEFINEREG(DSPBTILEOFF),
- DEFINEREG2(PIPEBCONF, i830_debug_pipeconf),
- DEFINEREG2(PIPEBSRC, i830_debug_yxminus1),
- DEFINEREG2(PIPEBSTAT, i830_debug_pipestat),
- DEFINEREG(PIPEB_GMCH_DATA_M),
- DEFINEREG(PIPEB_GMCH_DATA_N),
- DEFINEREG(PIPEB_DP_LINK_M),
- DEFINEREG(PIPEB_DP_LINK_N),
- DEFINEREG(CURSOR_B_BASE),
- DEFINEREG(CURSOR_B_CONTROL),
- DEFINEREG(CURSOR_B_POSITION),
-
- DEFINEREG2(FPB0, i830_debug_fp),
- DEFINEREG2(FPB1, i830_debug_fp),
- DEFINEREG2(DPLL_B, i830_debug_dpll),
- DEFINEREG(DPLL_B_MD),
- DEFINEREG2(HTOTAL_B, i830_debug_hvtotal),
- DEFINEREG2(HBLANK_B, i830_debug_hvsyncblank),
- DEFINEREG2(HSYNC_B, i830_debug_hvsyncblank),
- DEFINEREG2(VTOTAL_B, i830_debug_hvtotal),
- DEFINEREG2(VBLANK_B, i830_debug_hvsyncblank),
- DEFINEREG2(VSYNC_B, i830_debug_hvsyncblank),
- DEFINEREG(BCLRPAT_B),
- DEFINEREG(VSYNCSHIFT_B),
-
- DEFINEREG(VCLK_DIVISOR_VGA0),
- DEFINEREG(VCLK_DIVISOR_VGA1),
- DEFINEREG(VCLK_POST_DIV),
- DEFINEREG2(VGACNTRL, i830_debug_vgacntrl),
-
- DEFINEREG(TV_CTL),
- DEFINEREG(TV_DAC),
- DEFINEREG(TV_CSC_Y),
- DEFINEREG(TV_CSC_Y2),
- DEFINEREG(TV_CSC_U),
- DEFINEREG(TV_CSC_U2),
- DEFINEREG(TV_CSC_V),
- DEFINEREG(TV_CSC_V2),
- DEFINEREG(TV_CLR_KNOBS),
- DEFINEREG(TV_CLR_LEVEL),
- DEFINEREG(TV_H_CTL_1),
- DEFINEREG(TV_H_CTL_2),
- DEFINEREG(TV_H_CTL_3),
- DEFINEREG(TV_V_CTL_1),
- DEFINEREG(TV_V_CTL_2),
- DEFINEREG(TV_V_CTL_3),
- DEFINEREG(TV_V_CTL_4),
- DEFINEREG(TV_V_CTL_5),
- DEFINEREG(TV_V_CTL_6),
- DEFINEREG(TV_V_CTL_7),
- DEFINEREG(TV_SC_CTL_1),
- DEFINEREG(TV_SC_CTL_2),
- DEFINEREG(TV_SC_CTL_3),
- DEFINEREG(TV_WIN_POS),
- DEFINEREG(TV_WIN_SIZE),
- DEFINEREG(TV_FILTER_CTL_1),
- DEFINEREG(TV_FILTER_CTL_2),
- DEFINEREG(TV_FILTER_CTL_3),
- DEFINEREG(TV_CC_CONTROL),
- DEFINEREG(TV_CC_DATA),
- DEFINEREG(TV_H_LUMA_0),
- DEFINEREG(TV_H_LUMA_59),
- DEFINEREG(TV_H_CHROMA_0),
- DEFINEREG(TV_H_CHROMA_59),
-
- DEFINEREG(FBC_CFB_BASE),
- DEFINEREG(FBC_LL_BASE),
- DEFINEREG(FBC_CONTROL),
- DEFINEREG(FBC_COMMAND),
- DEFINEREG(FBC_STATUS),
- DEFINEREG(FBC_CONTROL2),
- DEFINEREG(FBC_FENCE_OFF),
- DEFINEREG(FBC_MOD_NUM),
-
- DEFINEREG(MI_MODE),
- /* DEFINEREG(MI_DISPLAY_POWER_DOWN), CRL only */
- DEFINEREG(MI_ARB_STATE),
- DEFINEREG(MI_RDRET_STATE),
- DEFINEREG(ECOSKPD),
-
- DEFINEREG(DP_B),
- DEFINEREG(DPB_AUX_CH_CTL),
- DEFINEREG(DPB_AUX_CH_DATA1),
- DEFINEREG(DPB_AUX_CH_DATA2),
- DEFINEREG(DPB_AUX_CH_DATA3),
- DEFINEREG(DPB_AUX_CH_DATA4),
- DEFINEREG(DPB_AUX_CH_DATA5),
-
- DEFINEREG(DP_C),
- DEFINEREG(DPC_AUX_CH_CTL),
- DEFINEREG(DPC_AUX_CH_DATA1),
- DEFINEREG(DPC_AUX_CH_DATA2),
- DEFINEREG(DPC_AUX_CH_DATA3),
- DEFINEREG(DPC_AUX_CH_DATA4),
- DEFINEREG(DPC_AUX_CH_DATA5),
-
- DEFINEREG(DP_D),
- DEFINEREG(DPD_AUX_CH_CTL),
- DEFINEREG(DPD_AUX_CH_DATA1),
- DEFINEREG(DPD_AUX_CH_DATA2),
- DEFINEREG(DPD_AUX_CH_DATA3),
- DEFINEREG(DPD_AUX_CH_DATA4),
- DEFINEREG(DPD_AUX_CH_DATA5),
-
- DEFINEREG(AUD_CONFIG),
- DEFINEREG(AUD_HDMIW_STATUS),
- DEFINEREG(AUD_CONV_CHCNT),
- DEFINEREG(VIDEO_DIP_CTL),
- DEFINEREG(AUD_PINW_CNTR),
- DEFINEREG(AUD_CNTL_ST),
- DEFINEREG(AUD_PIN_CAP),
- DEFINEREG(AUD_PINW_CAP),
- DEFINEREG(AUD_PINW_UNSOLRESP),
- DEFINEREG(AUD_OUT_DIG_CNVT),
- DEFINEREG(AUD_OUT_CWCAP),
- DEFINEREG(AUD_GRP_CAP),
+ DEFINEREG(SDVOUDI),
+ DEFINEREG(DSPARB),
+ DEFINEREG(DSPFW1),
+ DEFINEREG(DSPFW2),
+ DEFINEREG(DSPFW3),
+
+ DEFINEREG2(ADPA, i830_debug_adpa),
+ DEFINEREG2(LVDS, i830_debug_lvds),
+ DEFINEREG2(DVOA, i830_debug_dvo),
+ DEFINEREG2(DVOB, i830_debug_dvo),
+ DEFINEREG2(DVOC, i830_debug_dvo),
+ DEFINEREG(DVOA_SRCDIM),
+ DEFINEREG(DVOB_SRCDIM),
+ DEFINEREG(DVOC_SRCDIM),
+
+ DEFINEREG2(PP_CONTROL, i830_debug_pp_control),
+ DEFINEREG2(PP_STATUS, i830_debug_pp_status),
+ DEFINEREG(PP_ON_DELAYS),
+ DEFINEREG(PP_OFF_DELAYS),
+ DEFINEREG(PP_DIVISOR),
+ DEFINEREG(PFIT_CONTROL),
+ DEFINEREG(PFIT_PGM_RATIOS),
+ DEFINEREG(PORT_HOTPLUG_EN),
+ DEFINEREG(PORT_HOTPLUG_STAT),
+
+ DEFINEREG2(DSPACNTR, i830_debug_dspcntr),
+ DEFINEREG2(DSPASTRIDE, i830_debug_dspstride),
+ DEFINEREG2(DSPAPOS, i830_debug_xy),
+ DEFINEREG2(DSPASIZE, i830_debug_xyminus1),
+ DEFINEREG(DSPABASE),
+ DEFINEREG(DSPASURF),
+ DEFINEREG(DSPATILEOFF),
+ DEFINEREG2(PIPEACONF, i830_debug_pipeconf),
+ DEFINEREG2(PIPEASRC, i830_debug_yxminus1),
+ DEFINEREG2(PIPEASTAT, i830_debug_pipestat),
+ DEFINEREG(PIPEA_GMCH_DATA_M),
+ DEFINEREG(PIPEA_GMCH_DATA_N),
+ DEFINEREG(PIPEA_DP_LINK_M),
+ DEFINEREG(PIPEA_DP_LINK_N),
+ DEFINEREG(CURSOR_A_BASE),
+ DEFINEREG(CURSOR_A_CONTROL),
+ DEFINEREG(CURSOR_A_POSITION),
+
+ DEFINEREG2(FPA0, i830_debug_fp),
+ DEFINEREG2(FPA1, i830_debug_fp),
+ DEFINEREG2(DPLL_A, i830_debug_dpll),
+ DEFINEREG(DPLL_A_MD),
+ DEFINEREG2(HTOTAL_A, i830_debug_hvtotal),
+ DEFINEREG2(HBLANK_A, i830_debug_hvsyncblank),
+ DEFINEREG2(HSYNC_A, i830_debug_hvsyncblank),
+ DEFINEREG2(VTOTAL_A, i830_debug_hvtotal),
+ DEFINEREG2(VBLANK_A, i830_debug_hvsyncblank),
+ DEFINEREG2(VSYNC_A, i830_debug_hvsyncblank),
+ DEFINEREG(BCLRPAT_A),
+ DEFINEREG(VSYNCSHIFT_A),
+
+ DEFINEREG2(DSPBCNTR, i830_debug_dspcntr),
+ DEFINEREG2(DSPBSTRIDE, i830_debug_dspstride),
+ DEFINEREG2(DSPBPOS, i830_debug_xy),
+ DEFINEREG2(DSPBSIZE, i830_debug_xyminus1),
+ DEFINEREG(DSPBBASE),
+ DEFINEREG(DSPBSURF),
+ DEFINEREG(DSPBTILEOFF),
+ DEFINEREG2(PIPEBCONF, i830_debug_pipeconf),
+ DEFINEREG2(PIPEBSRC, i830_debug_yxminus1),
+ DEFINEREG2(PIPEBSTAT, i830_debug_pipestat),
+ DEFINEREG(PIPEB_GMCH_DATA_M),
+ DEFINEREG(PIPEB_GMCH_DATA_N),
+ DEFINEREG(PIPEB_DP_LINK_M),
+ DEFINEREG(PIPEB_DP_LINK_N),
+ DEFINEREG(CURSOR_B_BASE),
+ DEFINEREG(CURSOR_B_CONTROL),
+ DEFINEREG(CURSOR_B_POSITION),
+
+ DEFINEREG2(FPB0, i830_debug_fp),
+ DEFINEREG2(FPB1, i830_debug_fp),
+ DEFINEREG2(DPLL_B, i830_debug_dpll),
+ DEFINEREG(DPLL_B_MD),
+ DEFINEREG2(HTOTAL_B, i830_debug_hvtotal),
+ DEFINEREG2(HBLANK_B, i830_debug_hvsyncblank),
+ DEFINEREG2(HSYNC_B, i830_debug_hvsyncblank),
+ DEFINEREG2(VTOTAL_B, i830_debug_hvtotal),
+ DEFINEREG2(VBLANK_B, i830_debug_hvsyncblank),
+ DEFINEREG2(VSYNC_B, i830_debug_hvsyncblank),
+ DEFINEREG(BCLRPAT_B),
+ DEFINEREG(VSYNCSHIFT_B),
+
+ DEFINEREG(VCLK_DIVISOR_VGA0),
+ DEFINEREG(VCLK_DIVISOR_VGA1),
+ DEFINEREG(VCLK_POST_DIV),
+ DEFINEREG2(VGACNTRL, i830_debug_vgacntrl),
+
+ DEFINEREG(TV_CTL),
+ DEFINEREG(TV_DAC),
+ DEFINEREG(TV_CSC_Y),
+ DEFINEREG(TV_CSC_Y2),
+ DEFINEREG(TV_CSC_U),
+ DEFINEREG(TV_CSC_U2),
+ DEFINEREG(TV_CSC_V),
+ DEFINEREG(TV_CSC_V2),
+ DEFINEREG(TV_CLR_KNOBS),
+ DEFINEREG(TV_CLR_LEVEL),
+ DEFINEREG(TV_H_CTL_1),
+ DEFINEREG(TV_H_CTL_2),
+ DEFINEREG(TV_H_CTL_3),
+ DEFINEREG(TV_V_CTL_1),
+ DEFINEREG(TV_V_CTL_2),
+ DEFINEREG(TV_V_CTL_3),
+ DEFINEREG(TV_V_CTL_4),
+ DEFINEREG(TV_V_CTL_5),
+ DEFINEREG(TV_V_CTL_6),
+ DEFINEREG(TV_V_CTL_7),
+ DEFINEREG(TV_SC_CTL_1),
+ DEFINEREG(TV_SC_CTL_2),
+ DEFINEREG(TV_SC_CTL_3),
+ DEFINEREG(TV_WIN_POS),
+ DEFINEREG(TV_WIN_SIZE),
+ DEFINEREG(TV_FILTER_CTL_1),
+ DEFINEREG(TV_FILTER_CTL_2),
+ DEFINEREG(TV_FILTER_CTL_3),
+ DEFINEREG(TV_CC_CONTROL),
+ DEFINEREG(TV_CC_DATA),
+ DEFINEREG(TV_H_LUMA_0),
+ DEFINEREG(TV_H_LUMA_59),
+ DEFINEREG(TV_H_CHROMA_0),
+ DEFINEREG(TV_H_CHROMA_59),
+
+ DEFINEREG(FBC_CFB_BASE),
+ DEFINEREG(FBC_LL_BASE),
+ DEFINEREG(FBC_CONTROL),
+ DEFINEREG(FBC_COMMAND),
+ DEFINEREG(FBC_STATUS),
+ DEFINEREG(FBC_CONTROL2),
+ DEFINEREG(FBC_FENCE_OFF),
+ DEFINEREG(FBC_MOD_NUM),
+
+ DEFINEREG(MI_MODE),
+ /* DEFINEREG(MI_DISPLAY_POWER_DOWN), CRL only */
+ DEFINEREG(MI_ARB_STATE),
+ DEFINEREG(MI_RDRET_STATE),
+ DEFINEREG(ECOSKPD),
+
+ DEFINEREG(DP_B),
+ DEFINEREG(DPB_AUX_CH_CTL),
+ DEFINEREG(DPB_AUX_CH_DATA1),
+ DEFINEREG(DPB_AUX_CH_DATA2),
+ DEFINEREG(DPB_AUX_CH_DATA3),
+ DEFINEREG(DPB_AUX_CH_DATA4),
+ DEFINEREG(DPB_AUX_CH_DATA5),
+
+ DEFINEREG(DP_C),
+ DEFINEREG(DPC_AUX_CH_CTL),
+ DEFINEREG(DPC_AUX_CH_DATA1),
+ DEFINEREG(DPC_AUX_CH_DATA2),
+ DEFINEREG(DPC_AUX_CH_DATA3),
+ DEFINEREG(DPC_AUX_CH_DATA4),
+ DEFINEREG(DPC_AUX_CH_DATA5),
+
+ DEFINEREG(DP_D),
+ DEFINEREG(DPD_AUX_CH_CTL),
+ DEFINEREG(DPD_AUX_CH_DATA1),
+ DEFINEREG(DPD_AUX_CH_DATA2),
+ DEFINEREG(DPD_AUX_CH_DATA3),
+ DEFINEREG(DPD_AUX_CH_DATA4),
+ DEFINEREG(DPD_AUX_CH_DATA5),
+
+ DEFINEREG(AUD_CONFIG),
+ DEFINEREG(AUD_HDMIW_STATUS),
+ DEFINEREG(AUD_CONV_CHCNT),
+ DEFINEREG(VIDEO_DIP_CTL),
+ DEFINEREG(AUD_PINW_CNTR),
+ DEFINEREG(AUD_CNTL_ST),
+ DEFINEREG(AUD_PIN_CAP),
+ DEFINEREG(AUD_PINW_CAP),
+ DEFINEREG(AUD_PINW_UNSOLRESP),
+ DEFINEREG(AUD_OUT_DIG_CNVT),
+ DEFINEREG(AUD_OUT_CWCAP),
+ DEFINEREG(AUD_GRP_CAP),
#define DEFINEFENCE_915(i) \
{ FENCE+i*4, "FENCE " #i, i810_debug_915_fence, 0 }
#define DEFINEFENCE_945(i) \
{ FENCE_NEW+(i - 8) * 4, "FENCE " #i, i810_debug_915_fence, 0 }
- DEFINEFENCE_915(0),
- DEFINEFENCE_915(1),
- DEFINEFENCE_915(2),
- DEFINEFENCE_915(3),
- DEFINEFENCE_915(4),
- DEFINEFENCE_915(5),
- DEFINEFENCE_915(6),
- DEFINEFENCE_915(7),
- DEFINEFENCE_945(8),
- DEFINEFENCE_945(9),
- DEFINEFENCE_945(10),
- DEFINEFENCE_945(11),
- DEFINEFENCE_945(12),
- DEFINEFENCE_945(13),
- DEFINEFENCE_945(14),
- DEFINEFENCE_945(15),
+ DEFINEFENCE_915(0),
+ DEFINEFENCE_915(1),
+ DEFINEFENCE_915(2),
+ DEFINEFENCE_915(3),
+ DEFINEFENCE_915(4),
+ DEFINEFENCE_915(5),
+ DEFINEFENCE_915(6),
+ DEFINEFENCE_915(7),
+ DEFINEFENCE_945(8),
+ DEFINEFENCE_945(9),
+ DEFINEFENCE_945(10),
+ DEFINEFENCE_945(11),
+ DEFINEFENCE_945(12),
+ DEFINEFENCE_945(13),
+ DEFINEFENCE_945(14),
+ DEFINEFENCE_945(15),
#define DEFINEFENCE_965(i) \
{ FENCE_NEW+i*8, "FENCE START " #i, i810_debug_965_fence_start, 0 }, \
{ FENCE_NEW+i*8+4, "FENCE END " #i, i810_debug_965_fence_end, 0 }
- DEFINEFENCE_965(0),
- DEFINEFENCE_965(1),
- DEFINEFENCE_965(2),
- DEFINEFENCE_965(3),
- DEFINEFENCE_965(4),
- DEFINEFENCE_965(5),
- DEFINEFENCE_965(6),
- DEFINEFENCE_965(7),
- DEFINEFENCE_965(8),
- DEFINEFENCE_965(9),
- DEFINEFENCE_965(10),
- DEFINEFENCE_965(11),
- DEFINEFENCE_965(12),
- DEFINEFENCE_965(13),
- DEFINEFENCE_965(14),
- DEFINEFENCE_965(15),
+ DEFINEFENCE_965(0),
+ DEFINEFENCE_965(1),
+ DEFINEFENCE_965(2),
+ DEFINEFENCE_965(3),
+ DEFINEFENCE_965(4),
+ DEFINEFENCE_965(5),
+ DEFINEFENCE_965(6),
+ DEFINEFENCE_965(7),
+ DEFINEFENCE_965(8),
+ DEFINEFENCE_965(9),
+ DEFINEFENCE_965(10),
+ DEFINEFENCE_965(11),
+ DEFINEFENCE_965(12),
+ DEFINEFENCE_965(13),
+ DEFINEFENCE_965(14),
+ DEFINEFENCE_965(15),
};
+
#define NUM_I830_SNAPSHOTREGS (sizeof(i830_snapshot) / sizeof(i830_snapshot[0]))
DEBUGSTRING(igdng_debug_rr_hw_ctl)
{
- return XNFprintf("low %d, high %d", val & RR_HW_LOW_POWER_FRAMES_MASK,
- (val & RR_HW_HIGH_POWER_FRAMES_MASK) >> 8 );
+ return XNFprintf("low %d, high %d", val & RR_HW_LOW_POWER_FRAMES_MASK,
+ (val & RR_HW_HIGH_POWER_FRAMES_MASK) >> 8);
}
DEBUGSTRING(igdng_debug_m_tu)
{
- return XNFprintf("TU %d, val 0x%x %d", (val >> 25) + 1, val & 0xffffff, val & 0xffffff);
+ return XNFprintf("TU %d, val 0x%x %d", (val >> 25) + 1, val & 0xffffff,
+ val & 0xffffff);
}
DEBUGSTRING(igdng_debug_n)
{
- return XNFprintf("val 0x%x %d", val & 0xffffff, val & 0xffffff);
+ return XNFprintf("val 0x%x %d", val & 0xffffff, val & 0xffffff);
}
DEBUGSTRING(igdng_debug_fdi_tx_ctl)
{
- char *train = NULL, *voltage = NULL, *pre_emphasis = NULL, *portw = NULL;
+ char *train = NULL, *voltage = NULL, *pre_emphasis = NULL, *portw =
+ NULL;
- switch (val & FDI_LINK_TRAIN_NONE) {
+ switch (val & FDI_LINK_TRAIN_NONE) {
case FDI_LINK_TRAIN_PATTERN_1:
- train = "pattern_1";
- break;
+ train = "pattern_1";
+ break;
case FDI_LINK_TRAIN_PATTERN_2:
- train = "pattern_2";
- break;
+ train = "pattern_2";
+ break;
case FDI_LINK_TRAIN_PATTERN_IDLE:
- train = "pattern_idle";
- break;
+ train = "pattern_idle";
+ break;
case FDI_LINK_TRAIN_NONE:
- train = "not train";
- break;
- }
+ train = "not train";
+ break;
+ }
- switch (val & (7<<25)) {
+ switch (val & (7 << 25)) {
case FDI_LINK_TRAIN_VOLTAGE_0_4V:
- voltage = "0.4V";
- break;
+ voltage = "0.4V";
+ break;
case FDI_LINK_TRAIN_VOLTAGE_0_6V:
- voltage = "0.6V";
- break;
+ voltage = "0.6V";
+ break;
case FDI_LINK_TRAIN_VOLTAGE_0_8V:
- voltage = "0.8V";
- break;
+ voltage = "0.8V";
+ break;
case FDI_LINK_TRAIN_VOLTAGE_1_2V:
- voltage = "1.2V";
- break;
+ voltage = "1.2V";
+ break;
default:
- voltage = "reserved";
- }
+ voltage = "reserved";
+ }
- switch (val & (7<<22)) {
+ switch (val & (7 << 22)) {
case FDI_LINK_TRAIN_PRE_EMPHASIS_NONE:
- pre_emphasis = "none";
- break;
+ pre_emphasis = "none";
+ break;
case FDI_LINK_TRAIN_PRE_EMPHASIS_1_5X:
- pre_emphasis = "1.5x";
- break;
+ pre_emphasis = "1.5x";
+ break;
case FDI_LINK_TRAIN_PRE_EMPHASIS_2X:
- pre_emphasis = "2x";
- break;
+ pre_emphasis = "2x";
+ break;
case FDI_LINK_TRAIN_PRE_EMPHASIS_3X:
- pre_emphasis = "3x";
- break;
+ pre_emphasis = "3x";
+ break;
default:
- pre_emphasis = "reserved";
- }
+ pre_emphasis = "reserved";
+ }
- switch (val & (7<<19)) {
+ switch (val & (7 << 19)) {
case FDI_DP_PORT_WIDTH_X1:
- portw = "X1";
- break;
+ portw = "X1";
+ break;
case FDI_DP_PORT_WIDTH_X2:
- portw = "X2";
- break;
+ portw = "X2";
+ break;
case FDI_DP_PORT_WIDTH_X3:
- portw = "X3";
- break;
+ portw = "X3";
+ break;
case FDI_DP_PORT_WIDTH_X4:
- portw = "X4";
- break;
- }
-
- return XNFprintf("%s, train pattern %s, voltage swing %s,"
- "pre-emphasis %s, port width %s, enhanced framing %s, FDI PLL %s, scrambing %s, master mode %s",
- val & FDI_TX_ENABLE ? "enable" : "disable",
- train, voltage, pre_emphasis, portw,
- val & FDI_TX_ENHANCE_FRAME_ENABLE ? "enable" : "disable",
- val & FDI_TX_PLL_ENABLE ? "enable" : "disable",
- val & (1 << 7) ? "disable" : "enable",
- val & (1 << 0) ? "enable" : "disable");
+ portw = "X4";
+ break;
+ }
+
+ return XNFprintf("%s, train pattern %s, voltage swing %s,"
+ "pre-emphasis %s, port width %s, enhanced framing %s, FDI PLL %s, scrambing %s, master mode %s",
+ val & FDI_TX_ENABLE ? "enable" : "disable",
+ train, voltage, pre_emphasis, portw,
+ val & FDI_TX_ENHANCE_FRAME_ENABLE ? "enable" :
+ "disable",
+ val & FDI_TX_PLL_ENABLE ? "enable" : "disable",
+ val & (1 << 7) ? "disable" : "enable",
+ val & (1 << 0) ? "enable" : "disable");
}
DEBUGSTRING(igdng_debug_fdi_rx_ctl)
{
- char *train = NULL, *portw = NULL, *bpc = NULL;
+ char *train = NULL, *portw = NULL, *bpc = NULL;
- switch (val & FDI_LINK_TRAIN_NONE) {
+ switch (val & FDI_LINK_TRAIN_NONE) {
case FDI_LINK_TRAIN_PATTERN_1:
- train = "pattern_1";
- break;
+ train = "pattern_1";
+ break;
case FDI_LINK_TRAIN_PATTERN_2:
- train = "pattern_2";
- break;
+ train = "pattern_2";
+ break;
case FDI_LINK_TRAIN_PATTERN_IDLE:
- train = "pattern_idle";
- break;
+ train = "pattern_idle";
+ break;
case FDI_LINK_TRAIN_NONE:
- train = "not train";
- break;
- }
+ train = "not train";
+ break;
+ }
- switch (val & (7<<19)) {
+ switch (val & (7 << 19)) {
case FDI_DP_PORT_WIDTH_X1:
- portw = "X1";
- break;
+ portw = "X1";
+ break;
case FDI_DP_PORT_WIDTH_X2:
- portw = "X2";
- break;
+ portw = "X2";
+ break;
case FDI_DP_PORT_WIDTH_X3:
- portw = "X3";
- break;
+ portw = "X3";
+ break;
case FDI_DP_PORT_WIDTH_X4:
- portw = "X4";
- break;
- }
+ portw = "X4";
+ break;
+ }
- switch (val & (7<<16)) {
+ switch (val & (7 << 16)) {
case FDI_8BPC:
- bpc = "8bpc";
- break;
+ bpc = "8bpc";
+ break;
case FDI_10BPC:
- bpc = "10bpc";
- break;
+ bpc = "10bpc";
+ break;
case FDI_6BPC:
- bpc = "6bpc";
- break;
+ bpc = "6bpc";
+ break;
case FDI_12BPC:
- bpc = "12bpc";
- break;
- }
-
- return XNFprintf("%s, train pattern %s, port width %s, %s,"
- "link_reverse_strap_overwrite %s, dmi_link_reverse %s, FDI PLL %s,"
- "FS ecc %s, FE ecc %s, FS err report %s, FE err report %s,"
- "scrambing %s, enhanced framing %s, %s",
- val & FDI_RX_ENABLE ? "enable" : "disable",
- train, portw, bpc,
- val & FDI_LINK_REVERSE_OVERWRITE ? "yes" : "no",
- val & FDI_DMI_LINK_REVERSE_MASK ? "yes" : "no",
- val & FDI_RX_PLL_ENABLE ? "enable" : "disable",
- val & FDI_FS_ERR_CORRECT_ENABLE ? "enable" : "disable",
- val & FDI_FE_ERR_CORRECT_ENABLE ? "enable" : "disable",
- val & FDI_FS_ERR_REPORT_ENABLE ? "enable" : "disable",
- val & FDI_FE_ERR_REPORT_ENABLE ? "enable" : "disable",
- val & (1 << 7) ? "disable" : "enable",
- val & FDI_RX_ENHANCE_FRAME_ENABLE ? "enable" : "disable",
- val & FDI_SEL_PCDCLK ? "PCDClk" : "RawClk");
+ bpc = "12bpc";
+ break;
+ }
+
+ return XNFprintf("%s, train pattern %s, port width %s, %s,"
+ "link_reverse_strap_overwrite %s, dmi_link_reverse %s, FDI PLL %s,"
+ "FS ecc %s, FE ecc %s, FS err report %s, FE err report %s,"
+ "scrambing %s, enhanced framing %s, %s",
+ val & FDI_RX_ENABLE ? "enable" : "disable",
+ train, portw, bpc,
+ val & FDI_LINK_REVERSE_OVERWRITE ? "yes" : "no",
+ val & FDI_DMI_LINK_REVERSE_MASK ? "yes" : "no",
+ val & FDI_RX_PLL_ENABLE ? "enable" : "disable",
+ val & FDI_FS_ERR_CORRECT_ENABLE ? "enable" : "disable",
+ val & FDI_FE_ERR_CORRECT_ENABLE ? "enable" : "disable",
+ val & FDI_FS_ERR_REPORT_ENABLE ? "enable" : "disable",
+ val & FDI_FE_ERR_REPORT_ENABLE ? "enable" : "disable",
+ val & (1 << 7) ? "disable" : "enable",
+ val & FDI_RX_ENHANCE_FRAME_ENABLE ? "enable" :
+ "disable", val & FDI_SEL_PCDCLK ? "PCDClk" : "RawClk");
}
DEBUGSTRING(igdng_debug_dspstride)
{
- return XNFprintf("%d", val >> 6);
+ return XNFprintf("%d", val >> 6);
}
DEBUGSTRING(igdng_debug_pch_dpll)
{
- char *enable = val & DPLL_VCO_ENABLE ? "enable" : "disable";
- char *highspeed = val & DPLL_DVO_HIGH_SPEED ? "yes" : "no";
- char *mode = NULL;
- char *p2 = NULL;
- int fpa0_p1, fpa1_p1;
- char *refclk = NULL;
- int sdvo_mul;
-
- if ((val & DPLLB_MODE_LVDS) == DPLLB_MODE_LVDS) {
- mode = "LVDS";
- if (val & DPLLB_LVDS_P2_CLOCK_DIV_7)
- p2 = "Div 7";
- else
- p2 = "Div 14";
- } else if ((val & DPLLB_MODE_LVDS) == DPLLB_MODE_DAC_SERIAL) {
- mode = "Non-LVDS";
- if (val & DPLL_DAC_SERIAL_P2_CLOCK_DIV_5)
- p2 = "Div 5";
- else
- p2 = "Div 10";
- }
- fpa0_p1 = ffs((val & DPLL_FPA01_P1_POST_DIV_MASK) >> 16);
- fpa1_p1 = ffs((val & DPLL_FPA1_P1_POST_DIV_MASK));
+ char *enable = val & DPLL_VCO_ENABLE ? "enable" : "disable";
+ char *highspeed = val & DPLL_DVO_HIGH_SPEED ? "yes" : "no";
+ char *mode = NULL;
+ char *p2 = NULL;
+ int fpa0_p1, fpa1_p1;
+ char *refclk = NULL;
+ int sdvo_mul;
+
+ if ((val & DPLLB_MODE_LVDS) == DPLLB_MODE_LVDS) {
+ mode = "LVDS";
+ if (val & DPLLB_LVDS_P2_CLOCK_DIV_7)
+ p2 = "Div 7";
+ else
+ p2 = "Div 14";
+ } else if ((val & DPLLB_MODE_LVDS) == DPLLB_MODE_DAC_SERIAL) {
+ mode = "Non-LVDS";
+ if (val & DPLL_DAC_SERIAL_P2_CLOCK_DIV_5)
+ p2 = "Div 5";
+ else
+ p2 = "Div 10";
+ }
+ fpa0_p1 = ffs((val & DPLL_FPA01_P1_POST_DIV_MASK) >> 16);
+ fpa1_p1 = ffs((val & DPLL_FPA1_P1_POST_DIV_MASK));
- switch (val & PLL_REF_INPUT_MASK) {
+ switch (val & PLL_REF_INPUT_MASK) {
case PLL_REF_INPUT_DREFCLK:
- refclk = "default 120Mhz";
- break;
+ refclk = "default 120Mhz";
+ break;
case PLL_REF_INPUT_SUPER_SSC:
- refclk = "SuperSSC 120Mhz";
- break;
+ refclk = "SuperSSC 120Mhz";
+ break;
case PLL_REF_INPUT_TVCLKINBC:
- refclk = "SDVO TVClkIn";
- break;
+ refclk = "SDVO TVClkIn";
+ break;
case PLLB_REF_INPUT_SPREADSPECTRUMIN:
- refclk = "SSC";
- break;
+ refclk = "SSC";
+ break;
case PLL_REF_INPUT_DMICLK:
- refclk = "DMI RefCLK";
- break;
- }
+ refclk = "DMI RefCLK";
+ break;
+ }
- sdvo_mul = ((val & PLL_REF_SDVO_HDMI_MULTIPLIER_MASK) >> 9) + 1;
+ sdvo_mul = ((val & PLL_REF_SDVO_HDMI_MULTIPLIER_MASK) >> 9) + 1;
- return XNFprintf("%s, sdvo high speed %s, mode %s, p2 %s, "
- "FPA0 P1 %d, FPA1 P1 %d, refclk %s, sdvo/hdmi mul %d",
- enable, highspeed, mode, p2, fpa0_p1, fpa1_p1, refclk, sdvo_mul);
+ return XNFprintf("%s, sdvo high speed %s, mode %s, p2 %s, "
+ "FPA0 P1 %d, FPA1 P1 %d, refclk %s, sdvo/hdmi mul %d",
+ enable, highspeed, mode, p2, fpa0_p1, fpa1_p1, refclk,
+ sdvo_mul);
}
DEBUGSTRING(igdng_debug_dref_ctl)
{
- char *cpu_source;
- char *ssc_source = val & DREF_SSC_SOURCE_ENABLE ? "enable" : "disable";
- char *nonspread_source = val & DREF_NONSPREAD_SOURCE_ENABLE ? "enable":"disable";
- char *superspread_source = val & DREF_SUPERSPREAD_SOURCE_ENABLE ? "enable":"disable";
- char *ssc4_mode = val & DREF_SSC4_CENTERSPREAD ? "centerspread" : "downspread";
- char *ssc1 = val & DREF_SSC1_ENABLE ? "enable" : "disable";
- char *ssc4 = val & DREF_SSC4_ENABLE ? "enable" : "disable";
-
- switch (val & DREF_CPU_SOURCE_OUTPUT_NONSPREAD) {
+ char *cpu_source;
+ char *ssc_source = val & DREF_SSC_SOURCE_ENABLE ? "enable" : "disable";
+ char *nonspread_source =
+ val & DREF_NONSPREAD_SOURCE_ENABLE ? "enable" : "disable";
+ char *superspread_source =
+ val & DREF_SUPERSPREAD_SOURCE_ENABLE ? "enable" : "disable";
+ char *ssc4_mode =
+ val & DREF_SSC4_CENTERSPREAD ? "centerspread" : "downspread";
+ char *ssc1 = val & DREF_SSC1_ENABLE ? "enable" : "disable";
+ char *ssc4 = val & DREF_SSC4_ENABLE ? "enable" : "disable";
+
+ switch (val & DREF_CPU_SOURCE_OUTPUT_NONSPREAD) {
case DREF_CPU_SOURCE_OUTPUT_DISABLE:
- cpu_source = "disable";
- break;
+ cpu_source = "disable";
+ break;
case DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD:
- cpu_source = "downspread";
- break;
+ cpu_source = "downspread";
+ break;
case DREF_CPU_SOURCE_OUTPUT_NONSPREAD:
- cpu_source = "nonspread";
- break;
+ cpu_source = "nonspread";
+ break;
default:
- cpu_source = "reserved";
- }
- return XNFprintf("cpu source %s, ssc_source %s, nonspread_source %s, "
- "superspread_source %s, ssc4_mode %s, ssc1 %s, ssc4 %s",
- cpu_source, ssc_source, nonspread_source, superspread_source,
- ssc4_mode, ssc1, ssc4);
+ cpu_source = "reserved";
+ }
+ return XNFprintf("cpu source %s, ssc_source %s, nonspread_source %s, "
+ "superspread_source %s, ssc4_mode %s, ssc1 %s, ssc4 %s",
+ cpu_source, ssc_source, nonspread_source,
+ superspread_source, ssc4_mode, ssc1, ssc4);
}
DEBUGSTRING(igdng_debug_rawclk_freq)
{
- char *tp1 = NULL, *tp2 = NULL;
+ char *tp1 = NULL, *tp2 = NULL;
- switch (val & FDL_TP1_TIMER_MASK) {
+ switch (val & FDL_TP1_TIMER_MASK) {
case 0:
- tp1 = "0.5us";
- break;
+ tp1 = "0.5us";
+ break;
case (1 << 12):
- tp1 = "1.0us";
- break;
+ tp1 = "1.0us";
+ break;
case (2 << 12):
- tp1 = "2.0us";
- break;
+ tp1 = "2.0us";
+ break;
case (3 << 12):
- tp1 = "4.0us";
- break;
- }
- switch (val & FDL_TP2_TIMER_MASK) {
+ tp1 = "4.0us";
+ break;
+ }
+ switch (val & FDL_TP2_TIMER_MASK) {
case 0:
- tp2 = "1.5us";
- break;
+ tp2 = "1.5us";
+ break;
case (1 << 10):
- tp2 = "3.0us";
- break;
+ tp2 = "3.0us";
+ break;
case (2 << 10):
- tp2 = "6.0us";
- break;
+ tp2 = "6.0us";
+ break;
case (3 << 10):
- tp2 = "12.0us";
- break;
- }
- return XNFprintf("FDL_TP1 timer %s, FDL_TP2 timer %s, freq %d",
- tp1, tp2, val & RAWCLK_FREQ_MASK);
+ tp2 = "12.0us";
+ break;
+ }
+ return XNFprintf("FDL_TP1 timer %s, FDL_TP2 timer %s, freq %d",
+ tp1, tp2, val & RAWCLK_FREQ_MASK);
}
DEBUGSTRING(igdng_debug_fdi_rx_misc)
{
- return XNFprintf("FDI Delay %d", val & ((1 << 13) - 1));
+ return XNFprintf("FDI Delay %d", val & ((1 << 13) - 1));
}
DEBUGSTRING(igdng_debug_transconf)
{
- return XNFprintf("%s, %s",
- val & TRANS_ENABLE ? "enable" : "disable",
- val & TRANS_STATE_ENABLE ? "active" : "inactive");
+ return XNFprintf("%s, %s",
+ val & TRANS_ENABLE ? "enable" : "disable",
+ val & TRANS_STATE_ENABLE ? "active" : "inactive");
}
DEBUGSTRING(igdng_debug_panel_fitting)
{
- char *vadapt = NULL, *filter_sel = NULL;
+ char *vadapt = NULL, *filter_sel = NULL;
- switch (val & (3 << 25)) {
+ switch (val & (3 << 25)) {
case 0:
- vadapt = "least";
- break;
- case (1<<25):
- vadapt = "moderate";
- break;
- case (2<<25):
- vadapt = "reserved";
- break;
- case (3<<25):
- vadapt = "most";
- break;
- }
-
- switch (val & (3 << 23)) {
+ vadapt = "least";
+ break;
+ case (1 << 25):
+ vadapt = "moderate";
+ break;
+ case (2 << 25):
+ vadapt = "reserved";
+ break;
+ case (3 << 25):
+ vadapt = "most";
+ break;
+ }
+
+ switch (val & (3 << 23)) {
case 0:
- filter_sel = "programmed";
- break;
- case (1<<25):
- filter_sel = "hardcoded";
- break;
- case (2<<25):
- filter_sel = "edge_enhance";
- break;
- case (3<<25):
- filter_sel = "edge_soften";
- break;
- }
-
- return XNFprintf("%s, auto_scale %s, auto_scale_cal %s, v_filter %s, vadapt %s, mode %s, filter_sel %s,"
- "chroma pre-filter %s, vert3tap %s, v_inter_invert %s",
- val & PF_ENABLE ? "enable" : "disable",
- val & (1 << 30) ? "no" : "yes",
- val & (1 << 29) ? "yes" : "no",
- val & (1 << 28) ? "bypass" : "enable",
- val & (1 << 27) ? "enable" : "disable",
- vadapt, filter_sel,
- val & (1 << 22) ? "enable" : "disable",
- val & (1 << 21) ? "force" : "auto",
- val & (1 << 20) ? "field 0" : "field 1");
+ filter_sel = "programmed";
+ break;
+ case (1 << 25):
+ filter_sel = "hardcoded";
+ break;
+ case (2 << 25):
+ filter_sel = "edge_enhance";
+ break;
+ case (3 << 25):
+ filter_sel = "edge_soften";
+ break;
+ }
+
+ return
+ XNFprintf
+ ("%s, auto_scale %s, auto_scale_cal %s, v_filter %s, vadapt %s, mode %s, filter_sel %s,"
+ "chroma pre-filter %s, vert3tap %s, v_inter_invert %s",
+ val & PF_ENABLE ? "enable" : "disable",
+ val & (1 << 30) ? "no" : "yes", val & (1 << 29) ? "yes" : "no",
+ val & (1 << 28) ? "bypass" : "enable",
+ val & (1 << 27) ? "enable" : "disable", vadapt, filter_sel,
+ val & (1 << 22) ? "enable" : "disable",
+ val & (1 << 21) ? "force" : "auto",
+ val & (1 << 20) ? "field 0" : "field 1");
}
DEBUGSTRING(igdng_debug_pf_win)
{
- int a, b;
+ int a, b;
- a = (val >> 16) & 0x1fff;
- b = val & 0xfff;
+ a = (val >> 16) & 0x1fff;
+ b = val & 0xfff;
- return XNFprintf("%d, %d", a, b);
+ return XNFprintf("%d, %d", a, b);
}
-
static struct i830SnapshotRec igdng_snapshot[] = {
- DEFINEREG2(CPU_VGACNTRL, i830_debug_vgacntrl),
- DEFINEREG(DIGITAL_PORT_HOTPLUG_CNTRL),
-
- DEFINEREG2(RR_HW_CTL, igdng_debug_rr_hw_ctl),
-
- DEFINEREG(FDI_PLL_BIOS_0),
- DEFINEREG(FDI_PLL_BIOS_1),
- DEFINEREG(FDI_PLL_BIOS_2),
-
- DEFINEREG(DISPLAY_PORT_PLL_BIOS_0),
- DEFINEREG(DISPLAY_PORT_PLL_BIOS_1),
- DEFINEREG(DISPLAY_PORT_PLL_BIOS_2),
-
- DEFINEREG(FDI_PLL_FREQ_CTL),
-
- DEFINEREG2(PIPEACONF, i830_debug_pipeconf),
-
- DEFINEREG2(HTOTAL_A, i830_debug_hvtotal),
- DEFINEREG2(HBLANK_A, i830_debug_hvsyncblank),
- DEFINEREG2(HSYNC_A, i830_debug_hvsyncblank),
- DEFINEREG2(VTOTAL_A, i830_debug_hvtotal),
- DEFINEREG2(VBLANK_A, i830_debug_hvsyncblank),
- DEFINEREG2(VSYNC_A, i830_debug_hvsyncblank),
- DEFINEREG(VSYNCSHIFT_A),
- DEFINEREG2(PIPEASRC, i830_debug_yxminus1),
-
- DEFINEREG2(PIPEA_DATA_M1, igdng_debug_m_tu),
- DEFINEREG2(PIPEA_DATA_N1, igdng_debug_n),
- DEFINEREG2(PIPEA_DATA_M2, igdng_debug_m_tu),
- DEFINEREG2(PIPEA_DATA_N2, igdng_debug_n),
-
- DEFINEREG2(PIPEA_LINK_M1, igdng_debug_n),
- DEFINEREG2(PIPEA_LINK_N1, igdng_debug_n),
- DEFINEREG2(PIPEA_LINK_M2, igdng_debug_n),
- DEFINEREG2(PIPEA_LINK_N2, igdng_debug_n),
-
- DEFINEREG2(DSPACNTR, i830_debug_dspcntr),
- DEFINEREG(DSPABASE),
- DEFINEREG2(DSPASTRIDE, igdng_debug_dspstride),
- DEFINEREG(DSPASURF),
- DEFINEREG2(DSPATILEOFF, i830_debug_xy),
-
- DEFINEREG2(PIPEBCONF, i830_debug_pipeconf),
-
- DEFINEREG2(HTOTAL_B, i830_debug_hvtotal),
- DEFINEREG2(HBLANK_B, i830_debug_hvsyncblank),
- DEFINEREG2(HSYNC_B, i830_debug_hvsyncblank),
- DEFINEREG2(VTOTAL_B, i830_debug_hvtotal),
- DEFINEREG2(VBLANK_B, i830_debug_hvsyncblank),
- DEFINEREG2(VSYNC_B, i830_debug_hvsyncblank),
- DEFINEREG(VSYNCSHIFT_B),
-
- DEFINEREG2(DSPBCNTR, i830_debug_dspcntr),
- DEFINEREG(DSPBBASE),
- DEFINEREG2(DSPBSTRIDE, igdng_debug_dspstride),
- DEFINEREG(DSPBSURF),
- DEFINEREG2(DSPBTILEOFF, i830_debug_xy),
-
- DEFINEREG2(PIPEBSRC, i830_debug_yxminus1),
-
- DEFINEREG2(PIPEB_DATA_M1, igdng_debug_m_tu),
- DEFINEREG2(PIPEB_DATA_N1, igdng_debug_n),
- DEFINEREG2(PIPEB_DATA_M2, igdng_debug_m_tu),
- DEFINEREG2(PIPEB_DATA_N2, igdng_debug_n),
-
- DEFINEREG2(PIPEB_LINK_M1, igdng_debug_n),
- DEFINEREG2(PIPEB_LINK_N1, igdng_debug_n),
- DEFINEREG2(PIPEB_LINK_M2, igdng_debug_n),
- DEFINEREG2(PIPEB_LINK_N2, igdng_debug_n),
-
- DEFINEREG2(PFA_CTL_1, igdng_debug_panel_fitting),
- DEFINEREG2(PFB_CTL_1, igdng_debug_panel_fitting),
- DEFINEREG2(PFA_WIN_POS, igdng_debug_pf_win),
- DEFINEREG2(PFB_WIN_POS, igdng_debug_pf_win),
- DEFINEREG2(PFA_WIN_SIZE, igdng_debug_pf_win),
- DEFINEREG2(PFB_WIN_SIZE, igdng_debug_pf_win),
-
- /* PCH */
-
- DEFINEREG2(PCH_DREF_CONTROL, igdng_debug_dref_ctl),
- DEFINEREG2(PCH_RAWCLK_FREQ, igdng_debug_rawclk_freq),
- DEFINEREG(PCH_DPLL_TMR_CFG),
- DEFINEREG(PCH_SSC4_PARMS),
- DEFINEREG(PCH_SSC4_AUX_PARMS),
-
- DEFINEREG2(PCH_DPLL_A, igdng_debug_pch_dpll),
- DEFINEREG2(PCH_DPLL_B, igdng_debug_pch_dpll),
- DEFINEREG2(PCH_FPA0, i830_debug_fp),
- DEFINEREG2(PCH_FPA1, i830_debug_fp),
- DEFINEREG2(PCH_FPB0, i830_debug_fp),
- DEFINEREG2(PCH_FPB1, i830_debug_fp),
-
- DEFINEREG2(TRANS_HTOTAL_A, i830_debug_hvtotal),
- DEFINEREG2(TRANS_HBLANK_A, i830_debug_hvsyncblank),
- DEFINEREG2(TRANS_HSYNC_A, i830_debug_hvsyncblank),
- DEFINEREG2(TRANS_VTOTAL_A, i830_debug_hvtotal),
- DEFINEREG2(TRANS_VBLANK_A, i830_debug_hvsyncblank),
- DEFINEREG2(TRANS_VSYNC_A, i830_debug_hvsyncblank),
-
- DEFINEREG2(TRANSA_DATA_M1, igdng_debug_m_tu),
- DEFINEREG2(TRANSA_DATA_N1, igdng_debug_n),
- DEFINEREG2(TRANSA_DATA_M2, igdng_debug_m_tu),
- DEFINEREG2(TRANSA_DATA_N2, igdng_debug_n),
- DEFINEREG2(TRANSA_DP_LINK_M1, igdng_debug_n),
- DEFINEREG2(TRANSA_DP_LINK_N1, igdng_debug_n),
- DEFINEREG2(TRANSA_DP_LINK_M2, igdng_debug_n),
- DEFINEREG2(TRANSA_DP_LINK_N2, igdng_debug_n),
-
- DEFINEREG2(TRANS_HTOTAL_B, i830_debug_hvtotal),
- DEFINEREG2(TRANS_HBLANK_B, i830_debug_hvsyncblank),
- DEFINEREG2(TRANS_HSYNC_B, i830_debug_hvsyncblank),
- DEFINEREG2(TRANS_VTOTAL_B, i830_debug_hvtotal),
- DEFINEREG2(TRANS_VBLANK_B, i830_debug_hvsyncblank),
- DEFINEREG2(TRANS_VSYNC_B, i830_debug_hvsyncblank),
-
- DEFINEREG2(TRANSB_DATA_M1, igdng_debug_m_tu),
- DEFINEREG2(TRANSB_DATA_N1, igdng_debug_n),
- DEFINEREG2(TRANSB_DATA_M2, igdng_debug_m_tu),
- DEFINEREG2(TRANSB_DATA_N2, igdng_debug_n),
- DEFINEREG2(TRANSB_DP_LINK_M1, igdng_debug_n),
- DEFINEREG2(TRANSB_DP_LINK_N1, igdng_debug_n),
- DEFINEREG2(TRANSB_DP_LINK_M2, igdng_debug_n),
- DEFINEREG2(TRANSB_DP_LINK_N2, igdng_debug_n),
-
- DEFINEREG2(TRANSACONF, igdng_debug_transconf),
- DEFINEREG2(TRANSBCONF, igdng_debug_transconf),
-
- DEFINEREG2(FDI_TXA_CTL, igdng_debug_fdi_tx_ctl),
- DEFINEREG2(FDI_TXB_CTL, igdng_debug_fdi_tx_ctl),
- DEFINEREG2(FDI_RXA_CTL, igdng_debug_fdi_rx_ctl),
- DEFINEREG2(FDI_RXB_CTL, igdng_debug_fdi_rx_ctl),
-
- DEFINEREG2(FDI_RXA_MISC, igdng_debug_fdi_rx_misc),
- DEFINEREG2(FDI_RXB_MISC, igdng_debug_fdi_rx_misc),
- DEFINEREG(FDI_RXA_TUSIZE1),
- DEFINEREG(FDI_RXA_TUSIZE2),
- DEFINEREG(FDI_RXB_TUSIZE1),
- DEFINEREG(FDI_RXB_TUSIZE2),
-
- DEFINEREG(FDI_PLL_CTL_1),
- DEFINEREG(FDI_PLL_CTL_2),
-
- DEFINEREG(FDI_RXA_IIR),
- DEFINEREG(FDI_RXA_IMR),
- DEFINEREG(FDI_RXB_IIR),
- DEFINEREG(FDI_RXB_IMR),
-
- DEFINEREG2(PCH_ADPA, i830_debug_adpa),
- DEFINEREG(HDMIB),
- DEFINEREG(HDMIC),
- DEFINEREG(HDMID),
- DEFINEREG2(PCH_LVDS, i830_debug_lvds),
+ DEFINEREG2(CPU_VGACNTRL, i830_debug_vgacntrl),
+ DEFINEREG(DIGITAL_PORT_HOTPLUG_CNTRL),
+
+ DEFINEREG2(RR_HW_CTL, igdng_debug_rr_hw_ctl),
+
+ DEFINEREG(FDI_PLL_BIOS_0),
+ DEFINEREG(FDI_PLL_BIOS_1),
+ DEFINEREG(FDI_PLL_BIOS_2),
+
+ DEFINEREG(DISPLAY_PORT_PLL_BIOS_0),
+ DEFINEREG(DISPLAY_PORT_PLL_BIOS_1),
+ DEFINEREG(DISPLAY_PORT_PLL_BIOS_2),
+
+ DEFINEREG(FDI_PLL_FREQ_CTL),
+
+ DEFINEREG2(PIPEACONF, i830_debug_pipeconf),
+
+ DEFINEREG2(HTOTAL_A, i830_debug_hvtotal),
+ DEFINEREG2(HBLANK_A, i830_debug_hvsyncblank),
+ DEFINEREG2(HSYNC_A, i830_debug_hvsyncblank),
+ DEFINEREG2(VTOTAL_A, i830_debug_hvtotal),
+ DEFINEREG2(VBLANK_A, i830_debug_hvsyncblank),
+ DEFINEREG2(VSYNC_A, i830_debug_hvsyncblank),
+ DEFINEREG(VSYNCSHIFT_A),
+ DEFINEREG2(PIPEASRC, i830_debug_yxminus1),
+
+ DEFINEREG2(PIPEA_DATA_M1, igdng_debug_m_tu),
+ DEFINEREG2(PIPEA_DATA_N1, igdng_debug_n),
+ DEFINEREG2(PIPEA_DATA_M2, igdng_debug_m_tu),
+ DEFINEREG2(PIPEA_DATA_N2, igdng_debug_n),
+
+ DEFINEREG2(PIPEA_LINK_M1, igdng_debug_n),
+ DEFINEREG2(PIPEA_LINK_N1, igdng_debug_n),
+ DEFINEREG2(PIPEA_LINK_M2, igdng_debug_n),
+ DEFINEREG2(PIPEA_LINK_N2, igdng_debug_n),
+
+ DEFINEREG2(DSPACNTR, i830_debug_dspcntr),
+ DEFINEREG(DSPABASE),
+ DEFINEREG2(DSPASTRIDE, igdng_debug_dspstride),
+ DEFINEREG(DSPASURF),
+ DEFINEREG2(DSPATILEOFF, i830_debug_xy),
+
+ DEFINEREG2(PIPEBCONF, i830_debug_pipeconf),
+
+ DEFINEREG2(HTOTAL_B, i830_debug_hvtotal),
+ DEFINEREG2(HBLANK_B, i830_debug_hvsyncblank),
+ DEFINEREG2(HSYNC_B, i830_debug_hvsyncblank),
+ DEFINEREG2(VTOTAL_B, i830_debug_hvtotal),
+ DEFINEREG2(VBLANK_B, i830_debug_hvsyncblank),
+ DEFINEREG2(VSYNC_B, i830_debug_hvsyncblank),
+ DEFINEREG(VSYNCSHIFT_B),
+
+ DEFINEREG2(DSPBCNTR, i830_debug_dspcntr),
+ DEFINEREG(DSPBBASE),
+ DEFINEREG2(DSPBSTRIDE, igdng_debug_dspstride),
+ DEFINEREG(DSPBSURF),
+ DEFINEREG2(DSPBTILEOFF, i830_debug_xy),
+
+ DEFINEREG2(PIPEBSRC, i830_debug_yxminus1),
+
+ DEFINEREG2(PIPEB_DATA_M1, igdng_debug_m_tu),
+ DEFINEREG2(PIPEB_DATA_N1, igdng_debug_n),
+ DEFINEREG2(PIPEB_DATA_M2, igdng_debug_m_tu),
+ DEFINEREG2(PIPEB_DATA_N2, igdng_debug_n),
+
+ DEFINEREG2(PIPEB_LINK_M1, igdng_debug_n),
+ DEFINEREG2(PIPEB_LINK_N1, igdng_debug_n),
+ DEFINEREG2(PIPEB_LINK_M2, igdng_debug_n),
+ DEFINEREG2(PIPEB_LINK_N2, igdng_debug_n),
+
+ DEFINEREG2(PFA_CTL_1, igdng_debug_panel_fitting),
+ DEFINEREG2(PFB_CTL_1, igdng_debug_panel_fitting),
+ DEFINEREG2(PFA_WIN_POS, igdng_debug_pf_win),
+ DEFINEREG2(PFB_WIN_POS, igdng_debug_pf_win),
+ DEFINEREG2(PFA_WIN_SIZE, igdng_debug_pf_win),
+ DEFINEREG2(PFB_WIN_SIZE, igdng_debug_pf_win),
+
+ /* PCH */
+
+ DEFINEREG2(PCH_DREF_CONTROL, igdng_debug_dref_ctl),
+ DEFINEREG2(PCH_RAWCLK_FREQ, igdng_debug_rawclk_freq),
+ DEFINEREG(PCH_DPLL_TMR_CFG),
+ DEFINEREG(PCH_SSC4_PARMS),
+ DEFINEREG(PCH_SSC4_AUX_PARMS),
+
+ DEFINEREG2(PCH_DPLL_A, igdng_debug_pch_dpll),
+ DEFINEREG2(PCH_DPLL_B, igdng_debug_pch_dpll),
+ DEFINEREG2(PCH_FPA0, i830_debug_fp),
+ DEFINEREG2(PCH_FPA1, i830_debug_fp),
+ DEFINEREG2(PCH_FPB0, i830_debug_fp),
+ DEFINEREG2(PCH_FPB1, i830_debug_fp),
+
+ DEFINEREG2(TRANS_HTOTAL_A, i830_debug_hvtotal),
+ DEFINEREG2(TRANS_HBLANK_A, i830_debug_hvsyncblank),
+ DEFINEREG2(TRANS_HSYNC_A, i830_debug_hvsyncblank),
+ DEFINEREG2(TRANS_VTOTAL_A, i830_debug_hvtotal),
+ DEFINEREG2(TRANS_VBLANK_A, i830_debug_hvsyncblank),
+ DEFINEREG2(TRANS_VSYNC_A, i830_debug_hvsyncblank),
+
+ DEFINEREG2(TRANSA_DATA_M1, igdng_debug_m_tu),
+ DEFINEREG2(TRANSA_DATA_N1, igdng_debug_n),
+ DEFINEREG2(TRANSA_DATA_M2, igdng_debug_m_tu),
+ DEFINEREG2(TRANSA_DATA_N2, igdng_debug_n),
+ DEFINEREG2(TRANSA_DP_LINK_M1, igdng_debug_n),
+ DEFINEREG2(TRANSA_DP_LINK_N1, igdng_debug_n),
+ DEFINEREG2(TRANSA_DP_LINK_M2, igdng_debug_n),
+ DEFINEREG2(TRANSA_DP_LINK_N2, igdng_debug_n),
+
+ DEFINEREG2(TRANS_HTOTAL_B, i830_debug_hvtotal),
+ DEFINEREG2(TRANS_HBLANK_B, i830_debug_hvsyncblank),
+ DEFINEREG2(TRANS_HSYNC_B, i830_debug_hvsyncblank),
+ DEFINEREG2(TRANS_VTOTAL_B, i830_debug_hvtotal),
+ DEFINEREG2(TRANS_VBLANK_B, i830_debug_hvsyncblank),
+ DEFINEREG2(TRANS_VSYNC_B, i830_debug_hvsyncblank),
+
+ DEFINEREG2(TRANSB_DATA_M1, igdng_debug_m_tu),
+ DEFINEREG2(TRANSB_DATA_N1, igdng_debug_n),
+ DEFINEREG2(TRANSB_DATA_M2, igdng_debug_m_tu),
+ DEFINEREG2(TRANSB_DATA_N2, igdng_debug_n),
+ DEFINEREG2(TRANSB_DP_LINK_M1, igdng_debug_n),
+ DEFINEREG2(TRANSB_DP_LINK_N1, igdng_debug_n),
+ DEFINEREG2(TRANSB_DP_LINK_M2, igdng_debug_n),
+ DEFINEREG2(TRANSB_DP_LINK_N2, igdng_debug_n),
+
+ DEFINEREG2(TRANSACONF, igdng_debug_transconf),
+ DEFINEREG2(TRANSBCONF, igdng_debug_transconf),
+
+ DEFINEREG2(FDI_TXA_CTL, igdng_debug_fdi_tx_ctl),
+ DEFINEREG2(FDI_TXB_CTL, igdng_debug_fdi_tx_ctl),
+ DEFINEREG2(FDI_RXA_CTL, igdng_debug_fdi_rx_ctl),
+ DEFINEREG2(FDI_RXB_CTL, igdng_debug_fdi_rx_ctl),
+
+ DEFINEREG2(FDI_RXA_MISC, igdng_debug_fdi_rx_misc),
+ DEFINEREG2(FDI_RXB_MISC, igdng_debug_fdi_rx_misc),
+ DEFINEREG(FDI_RXA_TUSIZE1),
+ DEFINEREG(FDI_RXA_TUSIZE2),
+ DEFINEREG(FDI_RXB_TUSIZE1),
+ DEFINEREG(FDI_RXB_TUSIZE2),
+
+ DEFINEREG(FDI_PLL_CTL_1),
+ DEFINEREG(FDI_PLL_CTL_2),
+
+ DEFINEREG(FDI_RXA_IIR),
+ DEFINEREG(FDI_RXA_IMR),
+ DEFINEREG(FDI_RXB_IIR),
+ DEFINEREG(FDI_RXB_IMR),
+
+ DEFINEREG2(PCH_ADPA, i830_debug_adpa),
+ DEFINEREG(HDMIB),
+ DEFINEREG(HDMIC),
+ DEFINEREG(HDMID),
+ DEFINEREG2(PCH_LVDS, i830_debug_lvds),
};
+
#define NUM_IGDNG_SNAPSHOTREGS (sizeof(igdng_snapshot) / sizeof(igdng_snapshot[0]))
#undef DEFINEREG
#ifndef REG_DUMPER
void i830TakeRegSnapshot(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int i;
+ I830Ptr pI830 = I830PTR(pScrn);
+ int i;
- if (IS_IGDNG(pI830)) {
- for (i = 0; i < NUM_IGDNG_SNAPSHOTREGS; i++) {
- igdng_snapshot[i].val = INREG(igdng_snapshot[i].reg);
- }
- } else {
- for (i = 0; i < NUM_I830_SNAPSHOTREGS; i++) {
- i830_snapshot[i].val = INREG(i830_snapshot[i].reg);
+ if (IS_IGDNG(pI830)) {
+ for (i = 0; i < NUM_IGDNG_SNAPSHOTREGS; i++) {
+ igdng_snapshot[i].val = INREG(igdng_snapshot[i].reg);
+ }
+ } else {
+ for (i = 0; i < NUM_I830_SNAPSHOTREGS; i++) {
+ i830_snapshot[i].val = INREG(i830_snapshot[i].reg);
+ }
}
- }
}
static void IGDNGCompareRegsToSnapshot(ScrnInfoPtr pScrn, char *where)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int i;
-
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Comparing regs from server start up to %s\n", where);
- for (i = 0; i < NUM_IGDNG_SNAPSHOTREGS; i++) {
- uint32_t val = INREG(igdng_snapshot[i].reg);
- if (igdng_snapshot[i].val == val)
- continue;
-
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Register 0x%x (%s) changed from 0x%08x to 0x%08x\n",
- igdng_snapshot[i].reg, igdng_snapshot[i].name,
- (int)igdng_snapshot[i].val, (int)val);
-
- if (igdng_snapshot[i].debug_output != NULL) {
- char *before, *after;
-
- before = igdng_snapshot[i].debug_output(pI830,
- igdng_snapshot[i].reg,
- igdng_snapshot[i].val);
- after = igdng_snapshot[i].debug_output(pI830,
- igdng_snapshot[i].reg,
- val);
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "%s before: %s\n", igdng_snapshot[i].name, before);
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "%s after: %s\n", igdng_snapshot[i].name, after);
+ I830Ptr pI830 = I830PTR(pScrn);
+ int i;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Comparing regs from server start up to %s\n", where);
+ for (i = 0; i < NUM_IGDNG_SNAPSHOTREGS; i++) {
+ uint32_t val = INREG(igdng_snapshot[i].reg);
+ if (igdng_snapshot[i].val == val)
+ continue;
+
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Register 0x%x (%s) changed from 0x%08x to 0x%08x\n",
+ igdng_snapshot[i].reg, igdng_snapshot[i].name,
+ (int)igdng_snapshot[i].val, (int)val);
+
+ if (igdng_snapshot[i].debug_output != NULL) {
+ char *before, *after;
+
+ before = igdng_snapshot[i].debug_output(pI830,
+ igdng_snapshot
+ [i].reg,
+ igdng_snapshot
+ [i].val);
+ after =
+ igdng_snapshot[i].debug_output(pI830,
+ igdng_snapshot[i].
+ reg, val);
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "%s before: %s\n", igdng_snapshot[i].name,
+ before);
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "%s after: %s\n", igdng_snapshot[i].name,
+ after);
+
+ }
}
- }
}
void i830CompareRegsToSnapshot(ScrnInfoPtr pScrn, char *where)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int i;
-
- if (IS_IGDNG(pI830)) {
- IGDNGCompareRegsToSnapshot(pScrn, where);
- return;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Comparing regs from server start up to %s\n", where);
- for (i = 0; i < NUM_I830_SNAPSHOTREGS; i++) {
- uint32_t val = INREG(i830_snapshot[i].reg);
- if (i830_snapshot[i].val == val)
- continue;
-
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Register 0x%x (%s) changed from 0x%08x to 0x%08x\n",
- i830_snapshot[i].reg, i830_snapshot[i].name,
- (int)i830_snapshot[i].val, (int)val);
-
- if (i830_snapshot[i].debug_output != NULL) {
- char *before, *after;
-
- before = i830_snapshot[i].debug_output(pI830,
- i830_snapshot[i].reg,
- i830_snapshot[i].val);
- after = i830_snapshot[i].debug_output(pI830,
- i830_snapshot[i].reg,
- val);
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "%s before: %s\n", i830_snapshot[i].name, before);
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "%s after: %s\n", i830_snapshot[i].name, after);
+ I830Ptr pI830 = I830PTR(pScrn);
+ int i;
+
+ if (IS_IGDNG(pI830)) {
+ IGDNGCompareRegsToSnapshot(pScrn, where);
+ return;
+ }
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Comparing regs from server start up to %s\n", where);
+ for (i = 0; i < NUM_I830_SNAPSHOTREGS; i++) {
+ uint32_t val = INREG(i830_snapshot[i].reg);
+ if (i830_snapshot[i].val == val)
+ continue;
+
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Register 0x%x (%s) changed from 0x%08x to 0x%08x\n",
+ i830_snapshot[i].reg, i830_snapshot[i].name,
+ (int)i830_snapshot[i].val, (int)val);
+
+ if (i830_snapshot[i].debug_output != NULL) {
+ char *before, *after;
+
+ before = i830_snapshot[i].debug_output(pI830,
+ i830_snapshot[i].
+ reg,
+ i830_snapshot[i].
+ val);
+ after =
+ i830_snapshot[i].debug_output(pI830,
+ i830_snapshot[i].reg,
+ val);
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "%s before: %s\n", i830_snapshot[i].name,
+ before);
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "%s after: %s\n", i830_snapshot[i].name,
+ after);
+ }
}
- }
}
#endif /* !REG_DUMPER */
#if 0
-static void i830DumpIndexed (ScrnInfoPtr pScrn, char *name, int id, int val, int min, int max)
+static void i830DumpIndexed(ScrnInfoPtr pScrn, char *name, int id, int val,
+ int min, int max)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int i;
-
- for (i = min; i <= max; i++) {
- OUTREG8 (id, i);
- xf86DrvMsg (pScrn->scrnIndex, X_INFO, "%18.18s%02x: 0x%02x\n",
- name, i, INREG8(val));
- }
+ I830Ptr pI830 = I830PTR(pScrn);
+ int i;
+
+ for (i = min; i <= max; i++) {
+ OUTREG8(id, i);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%18.18s%02x: 0x%02x\n",
+ name, i, INREG8(val));
+ }
}
static void i830DumpAR(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int i;
- uint16_t st01;
- unsigned char orig_arx, msr;
-
- msr = INREG8(0x3cc);
- if (msr & 1)
- st01 = 0x3da;
- else
- st01 = 0x3ba;
-
- INREG8(st01); /* make sure index/write register is in index mode */
- orig_arx = INREG8(0x3c0);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%19.19sX: 0x%02x\n",
- "AR", orig_arx);
-
- for (i = 0; i <= 0x14; i++) {
+ I830Ptr pI830 = I830PTR(pScrn);
+ int i;
+ uint16_t st01;
+ unsigned char orig_arx, msr;
+
+ msr = INREG8(0x3cc);
+ if (msr & 1)
+ st01 = 0x3da;
+ else
+ st01 = 0x3ba;
+
+ INREG8(st01); /* make sure index/write register is in index mode */
+ orig_arx = INREG8(0x3c0);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%19.19sX: 0x%02x\n",
+ "AR", orig_arx);
+
+ for (i = 0; i <= 0x14; i++) {
+ INREG8(st01);
+ OUTREG8(0x3c0, i);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%18.18s%02x: 0x%02x\n",
+ "AR", i, INREG8(0x3c1));
+ }
INREG8(st01);
- OUTREG8(0x3c0, i);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%18.18s%02x: 0x%02x\n",
- "AR", i, INREG8(0x3c1));
- }
- INREG8(st01);
- OUTREG8(0x3c0, orig_arx);
- INREG8(st01); /* switch back to index mode */
+ OUTREG8(0x3c0, orig_arx);
+ INREG8(st01); /* switch back to index mode */
}
#endif
-static void IGDNGDumpRegs (ScrnInfoPtr pScrn)
+static void IGDNGDumpRegs(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int i;
-
- xf86DrvMsg (pScrn->scrnIndex, X_INFO, "DumpRegsBegin\n");
- for (i = 0; i < NUM_IGDNG_SNAPSHOTREGS; i++) {
- uint32_t val = INREG(igdng_snapshot[i].reg);
-
- if (igdng_snapshot[i].debug_output != NULL) {
- char *debug = igdng_snapshot[i].debug_output(pI830,
- igdng_snapshot[i].reg,
- val);
- if (debug != NULL) {
- xf86DrvMsg (pScrn->scrnIndex, X_INFO, "%20.20s: 0x%08x (%s)\n",
- igdng_snapshot[i].name, (unsigned int)val, debug);
- xfree(debug);
- }
- } else {
- xf86DrvMsg (pScrn->scrnIndex, X_INFO, "%20.20s: 0x%08x\n",
- igdng_snapshot[i].name, (unsigned int)val);
+ I830Ptr pI830 = I830PTR(pScrn);
+ int i;
+
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DumpRegsBegin\n");
+ for (i = 0; i < NUM_IGDNG_SNAPSHOTREGS; i++) {
+ uint32_t val = INREG(igdng_snapshot[i].reg);
+
+ if (igdng_snapshot[i].debug_output != NULL) {
+ char *debug = igdng_snapshot[i].debug_output(pI830,
+ igdng_snapshot
+ [i].reg,
+ val);
+ if (debug != NULL) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "%20.20s: 0x%08x (%s)\n",
+ igdng_snapshot[i].name,
+ (unsigned int)val, debug);
+ xfree(debug);
+ }
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "%20.20s: 0x%08x\n", igdng_snapshot[i].name,
+ (unsigned int)val);
+ }
}
- }
}
-void i830DumpRegs (ScrnInfoPtr pScrn)
+void i830DumpRegs(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int i;
- int fp, dpll;
- int pipe;
- int n, m1, m2, m, p1, p2;
- int ref;
- int dot;
- int phase;
+ I830Ptr pI830 = I830PTR(pScrn);
+ int i;
+ int fp, dpll;
+ int pipe;
+ int n, m1, m2, m, p1, p2;
+ int ref;
+ int dot;
+ int phase;
#if 0
- int msr;
- int crt;
+ int msr;
+ int crt;
#endif
- if (IS_IGDNG(pI830)) {
- IGDNGDumpRegs(pScrn);
- return;
- }
- xf86DrvMsg (pScrn->scrnIndex, X_INFO, "DumpRegsBegin\n");
- for (i = 0; i < NUM_I830_SNAPSHOTREGS; i++) {
- uint32_t val = INREG(i830_snapshot[i].reg);
-
- if (i830_snapshot[i].debug_output != NULL) {
- char *debug = i830_snapshot[i].debug_output(pI830,
- i830_snapshot[i].reg,
- val);
- if (debug != NULL) {
- xf86DrvMsg (pScrn->scrnIndex, X_INFO, "%20.20s: 0x%08x (%s)\n",
- i830_snapshot[i].name, (unsigned int)val, debug);
- xfree(debug);
- }
- } else {
- xf86DrvMsg (pScrn->scrnIndex, X_INFO, "%20.20s: 0x%08x\n",
- i830_snapshot[i].name, (unsigned int)val);
+ if (IS_IGDNG(pI830)) {
+ IGDNGDumpRegs(pScrn);
+ return;
+ }
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DumpRegsBegin\n");
+ for (i = 0; i < NUM_I830_SNAPSHOTREGS; i++) {
+ uint32_t val = INREG(i830_snapshot[i].reg);
+
+ if (i830_snapshot[i].debug_output != NULL) {
+ char *debug = i830_snapshot[i].debug_output(pI830,
+ i830_snapshot
+ [i].reg,
+ val);
+ if (debug != NULL) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "%20.20s: 0x%08x (%s)\n",
+ i830_snapshot[i].name,
+ (unsigned int)val, debug);
+ xfree(debug);
+ }
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "%20.20s: 0x%08x\n", i830_snapshot[i].name,
+ (unsigned int)val);
+ }
}
- }
#if 0
- i830DumpIndexed (pScrn, "SR", 0x3c4, 0x3c5, 0, 7);
- msr = INREG8(0x3cc);
- xf86DrvMsg (pScrn->scrnIndex, X_INFO, "%20.20s: 0x%02x\n",
- "MSR", (unsigned int) msr);
-
- i830DumpAR (pScrn);
- if (msr & 1)
- crt = 0x3d0;
- else
- crt = 0x3b0;
- i830DumpIndexed (pScrn, "CR", crt + 4, crt + 5, 0, 0x24);
+ i830DumpIndexed(pScrn, "SR", 0x3c4, 0x3c5, 0, 7);
+ msr = INREG8(0x3cc);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%20.20s: 0x%02x\n",
+ "MSR", (unsigned int)msr);
+
+ i830DumpAR(pScrn);
+ if (msr & 1)
+ crt = 0x3d0;
+ else
+ crt = 0x3b0;
+ i830DumpIndexed(pScrn, "CR", crt + 4, crt + 5, 0, 0x24);
#endif
- for (pipe = 0; pipe <= 1; pipe++)
- {
- fp = INREG(pipe == 0 ? FPA0 : FPB0);
- dpll = INREG(pipe == 0 ? DPLL_A : DPLL_B);
- if (IS_I9XX(pI830))
- {
- uint32_t lvds = INREG(LVDS);
- if ((lvds & LVDS_PORT_EN) &&
- (lvds & LVDS_PIPEB_SELECT) == (pipe << 30))
- {
- if ((lvds & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP)
- p2 = 7;
- else
- p2 = 14;
- }
- else
- {
- switch ((dpll >> 24) & 0x3) {
+ for (pipe = 0; pipe <= 1; pipe++) {
+ fp = INREG(pipe == 0 ? FPA0 : FPB0);
+ dpll = INREG(pipe == 0 ? DPLL_A : DPLL_B);
+ if (IS_I9XX(pI830)) {
+ uint32_t lvds = INREG(LVDS);
+ if ((lvds & LVDS_PORT_EN) &&
+ (lvds & LVDS_PIPEB_SELECT) == (pipe << 30)) {
+ if ((lvds & LVDS_CLKB_POWER_MASK) ==
+ LVDS_CLKB_POWER_UP)
+ p2 = 7;
+ else
+ p2 = 14;
+ } else {
+ switch ((dpll >> 24) & 0x3) {
+ case 0:
+ p2 = 10;
+ break;
+ case 1:
+ p2 = 5;
+ break;
+ default:
+ p2 = 1;
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "p2 out of range\n");
+ break;
+ }
+ }
+ if (IS_IGD(pI830))
+ i = (dpll >> DPLL_FPA01_P1_POST_DIV_SHIFT_IGD) &
+ 0x1ff;
+ else
+ i = (dpll >> DPLL_FPA01_P1_POST_DIV_SHIFT) &
+ 0xff;
+ switch (i) {
+ case 1:
+ p1 = 1;
+ break;
+ case 2:
+ p1 = 2;
+ break;
+ case 4:
+ p1 = 3;
+ break;
+ case 8:
+ p1 = 4;
+ break;
+ case 16:
+ p1 = 5;
+ break;
+ case 32:
+ p1 = 6;
+ break;
+ case 64:
+ p1 = 7;
+ break;
+ case 128:
+ p1 = 8;
+ break;
+ case 256:
+ if (IS_IGD(pI830)) {
+ p1 = 9;
+ break;
+ } /* fallback */
+ default:
+ p1 = 1;
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "p1 out of range\n");
+ break;
+ }
+
+ switch ((dpll >> 13) & 0x3) {
+ case 0:
+ ref = 96000;
+ break;
+ case 3:
+ ref = 100000;
+ break;
+ default:
+ ref = 0;
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "ref out of range\n");
+ break;
+ }
+ } else {
+ uint32_t lvds = INREG(LVDS);
+ if (IS_I85X(pI830) &&
+ (lvds & LVDS_PORT_EN) &&
+ (lvds & LVDS_PIPEB_SELECT) == (pipe << 30)) {
+ if ((lvds & LVDS_CLKB_POWER_MASK) ==
+ LVDS_CLKB_POWER_UP)
+ p2 = 7;
+ else
+ p2 = 14;
+ switch ((dpll >> 16) & 0x3f) {
+ case 0x01:
+ p1 = 1;
+ break;
+ case 0x02:
+ p1 = 2;
+ break;
+ case 0x04:
+ p1 = 3;
+ break;
+ case 0x08:
+ p1 = 4;
+ break;
+ case 0x10:
+ p1 = 5;
+ break;
+ case 0x20:
+ p1 = 6;
+ break;
+ default:
+ p1 = 1;
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "LVDS P1 0x%x invalid encoding\n",
+ (dpll >> 16) & 0x3f);
+ break;
+ }
+ } else {
+ if (dpll & (1 << 23))
+ p2 = 4;
+ else
+ p2 = 2;
+ if (dpll & PLL_P1_DIVIDE_BY_TWO)
+ p1 = 2;
+ else
+ p1 = ((dpll >> 16) & 0x3f) + 2;
+ }
+
+ switch ((dpll >> 13) & 0x3) {
+ case 0:
+ ref = 48000;
+ break;
+ case 3:
+ ref = 66000;
+ break;
+ default:
+ ref = 0;
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "ref out of range\n");
+ break;
+ }
+ }
+ if (IS_I965G(pI830)) {
+ phase = (dpll >> 9) & 0xf;
+ switch (phase) {
+ case 6:
+ break;
+ default:
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "SDVO phase shift %d out of range -- probobly not "
+ "an issue.\n", phase);
+ break;
+ }
+ }
+ switch ((dpll >> 8) & 1) {
case 0:
- p2 = 10;
- break;
- case 1:
- p2 = 5;
- break;
+ break;
default:
- p2 = 1;
- xf86DrvMsg (pScrn->scrnIndex, X_WARNING, "p2 out of range\n");
- break;
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "fp select out of range\n");
+ break;
}
- }
- if (IS_IGD(pI830))
- i = (dpll >> DPLL_FPA01_P1_POST_DIV_SHIFT_IGD) & 0x1ff;
- else
- i = (dpll >> DPLL_FPA01_P1_POST_DIV_SHIFT) & 0xff;
- switch (i) {
- case 1:
- p1 = 1; break;
- case 2:
- p1 = 2; break;
- case 4:
- p1 = 3; break;
- case 8:
- p1 = 4; break;
- case 16:
- p1 = 5; break;
- case 32:
- p1 = 6; break;
- case 64:
- p1 = 7; break;
- case 128:
- p1 = 8; break;
- case 256:
+ m1 = ((fp >> 8) & 0x3f);
if (IS_IGD(pI830)) {
- p1 = 9;
- break;
- } /* fallback */
- default:
- p1 = 1;
- xf86DrvMsg (pScrn->scrnIndex, X_WARNING, "p1 out of range\n");
- break;
- }
-
- switch ((dpll >> 13) & 0x3) {
- case 0:
- ref = 96000;
- break;
- case 3:
- ref = 100000;
- break;
- default:
- ref = 0;
- xf86DrvMsg (pScrn->scrnIndex, X_WARNING, "ref out of range\n");
- break;
- }
- }
- else
- {
- uint32_t lvds = INREG(LVDS);
- if (IS_I85X (pI830) &&
- (lvds & LVDS_PORT_EN) &&
- (lvds & LVDS_PIPEB_SELECT) == (pipe << 30))
- {
- if ((lvds & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP)
- p2 = 7;
- else
- p2 = 14;
- switch ((dpll >> 16) & 0x3f) {
- case 0x01: p1 = 1; break;
- case 0x02: p1 = 2; break;
- case 0x04: p1 = 3; break;
- case 0x08: p1 = 4; break;
- case 0x10: p1 = 5; break;
- case 0x20: p1 = 6; break;
- default:
- p1 = 1;
- xf86DrvMsg (pScrn->scrnIndex, X_WARNING, "LVDS P1 0x%x invalid encoding\n",
- (dpll >> 16) & 0x3f);
- break;
+ n = ffs((fp & FP_N_IGD_DIV_MASK) >> FP_N_DIV_SHIFT) - 1;
+ m2 = (fp & FP_M2_IGD_DIV_MASK) >> FP_M2_DIV_SHIFT;
+ m = m2 + 2;
+ dot = (ref * m) / n / (p1 * p2);
+ } else {
+ n = ((fp >> 16) & 0x3f);
+ m2 = ((fp >> 0) & 0x3f);
+ m = 5 * (m1 + 2) + (m2 + 2);
+ dot =
+ (ref * (5 * (m1 + 2) + (m2 + 2)) / (n + 2)) / (p1 *
+ p2);
}
- }
- else
- {
- if (dpll & (1 << 23))
- p2 = 4;
- else
- p2 = 2;
- if (dpll & PLL_P1_DIVIDE_BY_TWO)
- p1 = 2;
- else
- p1 = ((dpll >> 16) & 0x3f) + 2;
- }
- switch ((dpll >> 13) & 0x3) {
- case 0:
- ref = 48000;
- break;
- case 3:
- ref = 66000;
- break;
- default:
- ref = 0;
- xf86DrvMsg (pScrn->scrnIndex, X_WARNING, "ref out of range\n");
- break;
- }
- }
- if (IS_I965G(pI830)) {
- phase = (dpll >> 9) & 0xf;
- switch (phase) {
- case 6:
- break;
- default:
- xf86DrvMsg (pScrn->scrnIndex, X_INFO,
- "SDVO phase shift %d out of range -- probobly not "
- "an issue.\n", phase);
- break;
- }
- }
- switch ((dpll >> 8) & 1) {
- case 0:
- break;
- default:
- xf86DrvMsg (pScrn->scrnIndex, X_WARNING,
- "fp select out of range\n");
- break;
- }
- m1 = ((fp >> 8) & 0x3f);
- if (IS_IGD(pI830)) {
- n = ffs((fp & FP_N_IGD_DIV_MASK) >> FP_N_DIV_SHIFT) - 1;
- m2 = (fp & FP_M2_IGD_DIV_MASK) >> FP_M2_DIV_SHIFT;
- m = m2 + 2;
- dot = (ref * m) / n / (p1 * p2);
- } else {
- n = ((fp >> 16) & 0x3f);
- m2 = ((fp >> 0) & 0x3f);
- m = 5 * (m1 + 2) + (m2 + 2);
- dot = (ref * (5 * (m1 + 2) + (m2 + 2)) / (n + 2)) / (p1 * p2);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "pipe %s dot %d n %d m1 %d m2 %d p1 %d p2 %d\n",
+ pipe == 0 ? "A" : "B", dot, n, m1, m2, p1, p2);
}
-
- xf86DrvMsg (pScrn->scrnIndex, X_INFO, "pipe %s dot %d n %d m1 %d m2 %d p1 %d p2 %d\n",
- pipe == 0 ? "A" : "B", dot, n, m1, m2, p1, p2);
- }
- xf86DrvMsg (pScrn->scrnIndex, X_INFO, "DumpRegsEnd\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DumpRegsEnd\n");
}
diff --git a/src/i830_debug.h b/src/i830_debug.h
index 6ccd29a2..73d6ea31 100644
--- a/src/i830_debug.h
+++ b/src/i830_debug.h
@@ -27,5 +27,4 @@
void i830TakeRegSnapshot(ScrnInfoPtr pScrn);
void i830CompareRegsToSnapshot(ScrnInfoPtr pScrn, char *where);
-void i830DumpRegs (ScrnInfoPtr pScrn);
-
+void i830DumpRegs(ScrnInfoPtr pScrn);
diff --git a/src/i830_display.h b/src/i830_display.h
index dbbed9dc..d9b56e9c 100644
--- a/src/i830_display.h
+++ b/src/i830_display.h
@@ -33,10 +33,10 @@ void i830WaitForVblank(ScrnInfoPtr pScrn);
void i830DescribeOutputConfiguration(ScrnInfoPtr pScrn);
void i830_set_new_crtc_bo(ScrnInfoPtr pScrn);
-xf86CrtcPtr i830GetLoadDetectPipe(xf86OutputPtr output, DisplayModePtr mode, int *dpms_mode);
+xf86CrtcPtr i830GetLoadDetectPipe(xf86OutputPtr output, DisplayModePtr mode,
+ int *dpms_mode);
void i830ReleaseLoadDetectPipe(xf86OutputPtr output, int dpms_mode);
void i830_crtc_init(ScrnInfoPtr pScrn, int pipe);
DisplayModePtr i830_crtc_mode_get(ScrnInfoPtr pScrn, xf86CrtcPtr crtc);
-void i830_output_prepare (xf86OutputPtr output);
-void i830_output_commit (xf86OutputPtr output);
-
+void i830_output_prepare(xf86OutputPtr output);
+void i830_output_commit(xf86OutputPtr output);
diff --git a/src/i830_dri.c b/src/i830_dri.c
index 1cf90d5d..b9d82b8c 100644
--- a/src/i830_dri.c
+++ b/src/i830_dri.c
@@ -74,88 +74,87 @@ extern XF86ModuleData dri2ModuleData;
#endif
typedef struct {
- PixmapPtr pPixmap;
- unsigned int attachment;
+ PixmapPtr pPixmap;
+ unsigned int attachment;
} I830DRI2BufferPrivateRec, *I830DRI2BufferPrivatePtr;
#ifndef USE_DRI2_1_1_0
static DRI2BufferPtr
I830DRI2CreateBuffers(DrawablePtr pDraw, unsigned int *attachments, int count)
{
- ScreenPtr pScreen = pDraw->pScreen;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- DRI2BufferPtr buffers;
- dri_bo *bo;
- int i;
- I830DRI2BufferPrivatePtr privates;
- PixmapPtr pPixmap, pDepthPixmap;
-
- buffers = xcalloc(count, sizeof *buffers);
- if (buffers == NULL)
- return NULL;
- privates = xcalloc(count, sizeof *privates);
- if (privates == NULL) {
- xfree(buffers);
- return NULL;
- }
-
- pDepthPixmap = NULL;
- for (i = 0; i < count; i++) {
- if (attachments[i] == DRI2BufferFrontLeft) {
- pPixmap = get_drawable_pixmap(pDraw);
- pPixmap->refcnt++;
- } else if (attachments[i] == DRI2BufferStencil && pDepthPixmap) {
- pPixmap = pDepthPixmap;
- pPixmap->refcnt++;
- } else {
- unsigned int hint = 0;
-
- switch (attachments[i]) {
- case DRI2BufferDepth:
- if (SUPPORTS_YTILING(pI830))
- hint = INTEL_CREATE_PIXMAP_TILING_Y;
- else
- hint = INTEL_CREATE_PIXMAP_TILING_X;
- break;
- case DRI2BufferFakeFrontLeft:
- case DRI2BufferFakeFrontRight:
- case DRI2BufferBackLeft:
- case DRI2BufferBackRight:
- hint = INTEL_CREATE_PIXMAP_TILING_X;
- break;
- }
-
- if (!pI830->tiling)
- hint = 0;
-
- pPixmap = (*pScreen->CreatePixmap)(pScreen,
- pDraw->width,
- pDraw->height,
- pDraw->depth,
- hint);
-
+ ScreenPtr pScreen = pDraw->pScreen;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ DRI2BufferPtr buffers;
+ dri_bo *bo;
+ int i;
+ I830DRI2BufferPrivatePtr privates;
+ PixmapPtr pPixmap, pDepthPixmap;
+
+ buffers = xcalloc(count, sizeof *buffers);
+ if (buffers == NULL)
+ return NULL;
+ privates = xcalloc(count, sizeof *privates);
+ if (privates == NULL) {
+ xfree(buffers);
+ return NULL;
}
- if (attachments[i] == DRI2BufferDepth)
- pDepthPixmap = pPixmap;
-
- buffers[i].attachment = attachments[i];
- buffers[i].pitch = pPixmap->devKind;
- buffers[i].cpp = pPixmap->drawable.bitsPerPixel / 8;
- buffers[i].driverPrivate = &privates[i];
- buffers[i].flags = 0; /* not tiled */
- privates[i].pPixmap = pPixmap;
- privates[i].attachment = attachments[i];
+ pDepthPixmap = NULL;
+ for (i = 0; i < count; i++) {
+ if (attachments[i] == DRI2BufferFrontLeft) {
+ pPixmap = get_drawable_pixmap(pDraw);
+ pPixmap->refcnt++;
+ } else if (attachments[i] == DRI2BufferStencil && pDepthPixmap) {
+ pPixmap = pDepthPixmap;
+ pPixmap->refcnt++;
+ } else {
+ unsigned int hint = 0;
+
+ switch (attachments[i]) {
+ case DRI2BufferDepth:
+ if (SUPPORTS_YTILING(pI830))
+ hint = INTEL_CREATE_PIXMAP_TILING_Y;
+ else
+ hint = INTEL_CREATE_PIXMAP_TILING_X;
+ break;
+ case DRI2BufferFakeFrontLeft:
+ case DRI2BufferFakeFrontRight:
+ case DRI2BufferBackLeft:
+ case DRI2BufferBackRight:
+ hint = INTEL_CREATE_PIXMAP_TILING_X;
+ break;
+ }
+
+ if (!pI830->tiling)
+ hint = 0;
+
+ pPixmap = (*pScreen->CreatePixmap) (pScreen,
+ pDraw->width,
+ pDraw->height,
+ pDraw->depth, hint);
+
+ }
+
+ if (attachments[i] == DRI2BufferDepth)
+ pDepthPixmap = pPixmap;
+
+ buffers[i].attachment = attachments[i];
+ buffers[i].pitch = pPixmap->devKind;
+ buffers[i].cpp = pPixmap->drawable.bitsPerPixel / 8;
+ buffers[i].driverPrivate = &privates[i];
+ buffers[i].flags = 0; /* not tiled */
+ privates[i].pPixmap = pPixmap;
+ privates[i].attachment = attachments[i];
+
+ bo = i830_get_pixmap_bo(pPixmap);
+ if (dri_bo_flink(bo, &buffers[i].name) != 0) {
+ /* failed to name buffer */
+ }
- bo = i830_get_pixmap_bo (pPixmap);
- if (dri_bo_flink(bo, &buffers[i].name) != 0) {
- /* failed to name buffer */
}
- }
-
- return buffers;
+ return buffers;
}
#else
@@ -164,72 +163,72 @@ static DRI2Buffer2Ptr
I830DRI2CreateBuffer(DrawablePtr pDraw, unsigned int attachment,
unsigned int format)
{
- ScreenPtr pScreen = pDraw->pScreen;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- DRI2Buffer2Ptr buffer;
- dri_bo *bo;
- I830DRI2BufferPrivatePtr privates;
- PixmapPtr pPixmap;
-
- buffer = xcalloc(1, sizeof *buffer);
- if (buffer == NULL)
- return NULL;
- privates = xcalloc(1, sizeof *privates);
- if (privates == NULL) {
- xfree(buffer);
- return NULL;
- }
-
- if (attachment == DRI2BufferFrontLeft) {
- pPixmap = get_drawable_pixmap(pDraw);
- pPixmap->refcnt++;
- } else {
- unsigned int hint = 0;
-
- switch (attachment) {
- case DRI2BufferDepth:
- case DRI2BufferDepthStencil:
- if (SUPPORTS_YTILING(pI830))
- hint = INTEL_CREATE_PIXMAP_TILING_Y;
- else
- hint = INTEL_CREATE_PIXMAP_TILING_X;
- break;
- case DRI2BufferFakeFrontLeft:
- case DRI2BufferFakeFrontRight:
- case DRI2BufferBackLeft:
- case DRI2BufferBackRight:
- hint = INTEL_CREATE_PIXMAP_TILING_X;
- break;
+ ScreenPtr pScreen = pDraw->pScreen;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ DRI2Buffer2Ptr buffer;
+ dri_bo *bo;
+ I830DRI2BufferPrivatePtr privates;
+ PixmapPtr pPixmap;
+
+ buffer = xcalloc(1, sizeof *buffer);
+ if (buffer == NULL)
+ return NULL;
+ privates = xcalloc(1, sizeof *privates);
+ if (privates == NULL) {
+ xfree(buffer);
+ return NULL;
}
- if (!pI830->tiling)
- hint = 0;
-
- pPixmap = (*pScreen->CreatePixmap)(pScreen,
- pDraw->width,
- pDraw->height,
- (format != 0)?format:pDraw->depth,
- hint);
-
- }
-
+ if (attachment == DRI2BufferFrontLeft) {
+ pPixmap = get_drawable_pixmap(pDraw);
+ pPixmap->refcnt++;
+ } else {
+ unsigned int hint = 0;
+
+ switch (attachment) {
+ case DRI2BufferDepth:
+ case DRI2BufferDepthStencil:
+ if (SUPPORTS_YTILING(pI830))
+ hint = INTEL_CREATE_PIXMAP_TILING_Y;
+ else
+ hint = INTEL_CREATE_PIXMAP_TILING_X;
+ break;
+ case DRI2BufferFakeFrontLeft:
+ case DRI2BufferFakeFrontRight:
+ case DRI2BufferBackLeft:
+ case DRI2BufferBackRight:
+ hint = INTEL_CREATE_PIXMAP_TILING_X;
+ break;
+ }
+
+ if (!pI830->tiling)
+ hint = 0;
+
+ pPixmap = (*pScreen->CreatePixmap) (pScreen,
+ pDraw->width,
+ pDraw->height,
+ (format !=
+ 0) ? format : pDraw->depth,
+ hint);
- buffer->attachment = attachment;
- buffer->pitch = pPixmap->devKind;
- buffer->cpp = pPixmap->drawable.bitsPerPixel / 8;
- buffer->driverPrivate = privates;
- buffer->format = format;
- buffer->flags = 0; /* not tiled */
- privates->pPixmap = pPixmap;
- privates->attachment = attachment;
+ }
- bo = i830_get_pixmap_bo (pPixmap);
- if (dri_bo_flink(bo, &buffer->name) != 0) {
- /* failed to name buffer */
- }
+ buffer->attachment = attachment;
+ buffer->pitch = pPixmap->devKind;
+ buffer->cpp = pPixmap->drawable.bitsPerPixel / 8;
+ buffer->driverPrivate = privates;
+ buffer->format = format;
+ buffer->flags = 0; /* not tiled */
+ privates->pPixmap = pPixmap;
+ privates->attachment = attachment;
+
+ bo = i830_get_pixmap_bo(pPixmap);
+ if (dri_bo_flink(bo, &buffer->name) != 0) {
+ /* failed to name buffer */
+ }
- return buffer;
+ return buffer;
}
#endif
@@ -239,37 +238,34 @@ I830DRI2CreateBuffer(DrawablePtr pDraw, unsigned int attachment,
static void
I830DRI2DestroyBuffers(DrawablePtr pDraw, DRI2BufferPtr buffers, int count)
{
- ScreenPtr pScreen = pDraw->pScreen;
- I830DRI2BufferPrivatePtr private;
- int i;
-
- for (i = 0; i < count; i++)
- {
- private = buffers[i].driverPrivate;
- (*pScreen->DestroyPixmap)(private->pPixmap);
- }
-
- if (buffers)
- {
- xfree(buffers[0].driverPrivate);
- xfree(buffers);
- }
+ ScreenPtr pScreen = pDraw->pScreen;
+ I830DRI2BufferPrivatePtr private;
+ int i;
+
+ for (i = 0; i < count; i++) {
+ private = buffers[i].driverPrivate;
+ (*pScreen->DestroyPixmap) (private->pPixmap);
+ }
+
+ if (buffers) {
+ xfree(buffers[0].driverPrivate);
+ xfree(buffers);
+ }
}
#else
-static void
-I830DRI2DestroyBuffer(DrawablePtr pDraw, DRI2Buffer2Ptr buffer)
+static void I830DRI2DestroyBuffer(DrawablePtr pDraw, DRI2Buffer2Ptr buffer)
{
- if (buffer) {
- I830DRI2BufferPrivatePtr private = buffer->driverPrivate;
- ScreenPtr pScreen = pDraw->pScreen;
+ if (buffer) {
+ I830DRI2BufferPrivatePtr private = buffer->driverPrivate;
+ ScreenPtr pScreen = pDraw->pScreen;
- (*pScreen->DestroyPixmap)(private->pPixmap);
+ (*pScreen->DestroyPixmap) (private->pPixmap);
- xfree(private);
- xfree(buffer);
- }
+ xfree(private);
+ xfree(buffer);
+ }
}
#endif
@@ -278,164 +274,169 @@ static void
I830DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
DRI2BufferPtr pDstBuffer, DRI2BufferPtr pSrcBuffer)
{
- I830DRI2BufferPrivatePtr srcPrivate = pSrcBuffer->driverPrivate;
- I830DRI2BufferPrivatePtr dstPrivate = pDstBuffer->driverPrivate;
- ScreenPtr pScreen = pDraw->pScreen;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- DrawablePtr src = (srcPrivate->attachment == DRI2BufferFrontLeft)
- ? pDraw : &srcPrivate->pPixmap->drawable;
- DrawablePtr dst = (dstPrivate->attachment == DRI2BufferFrontLeft)
- ? pDraw : &dstPrivate->pPixmap->drawable;
- RegionPtr pCopyClip;
- GCPtr pGC;
-
- pGC = GetScratchGC(pDraw->depth, pScreen);
- pCopyClip = REGION_CREATE(pScreen, NULL, 0);
- REGION_COPY(pScreen, pCopyClip, pRegion);
- (*pGC->funcs->ChangeClip) (pGC, CT_REGION, pCopyClip, 0);
- ValidateGC(dst, pGC);
-
- /* Wait for the scanline to be outside the region to be copied */
- if (pixmap_is_scanout(get_drawable_pixmap(dst)) && pI830->swapbuffers_wait) {
- BoxPtr box;
- BoxRec crtcbox;
- int y1, y2;
- int pipe = -1, event, load_scan_lines_pipe;
- xf86CrtcPtr crtc;
-
- box = REGION_EXTENTS(unused, pGC->pCompositeClip);
- crtc = i830_covering_crtc(pScrn, box, NULL, &crtcbox);
-
- /* Make sure the CRTC is valid and this is the real front buffer */
- if (crtc != NULL && !crtc->rotatedData) {
- pipe = i830_crtc_to_pipe(crtc);
-
- if (pipe == 0) {
- event = MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
- load_scan_lines_pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEA;
- } else {
- event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
- load_scan_lines_pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEB;
- }
-
- /* Make sure we don't wait for a scanline that will never occur */
- y1 = (crtcbox.y1 <= box->y1) ? box->y1 - crtcbox.y1 : 0;
- y2 = (box->y2 <= crtcbox.y2) ?
- box->y2 - crtcbox.y1 : crtcbox.y2 - crtcbox.y1;
-
- BEGIN_BATCH(5);
- /* The documentation says that the LOAD_SCAN_LINES command
- * always comes in pairs. Don't ask me why. */
- OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | load_scan_lines_pipe);
- OUT_BATCH((y1 << 16) | y2);
- OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | load_scan_lines_pipe);
- OUT_BATCH((y1 << 16) | y2);
- OUT_BATCH(MI_WAIT_FOR_EVENT | event);
- ADVANCE_BATCH();
+ I830DRI2BufferPrivatePtr srcPrivate = pSrcBuffer->driverPrivate;
+ I830DRI2BufferPrivatePtr dstPrivate = pDstBuffer->driverPrivate;
+ ScreenPtr pScreen = pDraw->pScreen;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ DrawablePtr src = (srcPrivate->attachment == DRI2BufferFrontLeft)
+ ? pDraw : &srcPrivate->pPixmap->drawable;
+ DrawablePtr dst = (dstPrivate->attachment == DRI2BufferFrontLeft)
+ ? pDraw : &dstPrivate->pPixmap->drawable;
+ RegionPtr pCopyClip;
+ GCPtr pGC;
+
+ pGC = GetScratchGC(pDraw->depth, pScreen);
+ pCopyClip = REGION_CREATE(pScreen, NULL, 0);
+ REGION_COPY(pScreen, pCopyClip, pRegion);
+ (*pGC->funcs->ChangeClip) (pGC, CT_REGION, pCopyClip, 0);
+ ValidateGC(dst, pGC);
+
+ /* Wait for the scanline to be outside the region to be copied */
+ if (pixmap_is_scanout(get_drawable_pixmap(dst))
+ && pI830->swapbuffers_wait) {
+ BoxPtr box;
+ BoxRec crtcbox;
+ int y1, y2;
+ int pipe = -1, event, load_scan_lines_pipe;
+ xf86CrtcPtr crtc;
+
+ box = REGION_EXTENTS(unused, pGC->pCompositeClip);
+ crtc = i830_covering_crtc(pScrn, box, NULL, &crtcbox);
+
+ /* Make sure the CRTC is valid and this is the real front buffer */
+ if (crtc != NULL && !crtc->rotatedData) {
+ pipe = i830_crtc_to_pipe(crtc);
+
+ if (pipe == 0) {
+ event = MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
+ load_scan_lines_pipe =
+ MI_LOAD_SCAN_LINES_DISPLAY_PIPEA;
+ } else {
+ event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
+ load_scan_lines_pipe =
+ MI_LOAD_SCAN_LINES_DISPLAY_PIPEB;
+ }
+
+ /* Make sure we don't wait for a scanline that will never occur */
+ y1 = (crtcbox.y1 <= box->y1) ? box->y1 - crtcbox.y1 : 0;
+ y2 = (box->y2 <= crtcbox.y2) ?
+ box->y2 - crtcbox.y1 : crtcbox.y2 - crtcbox.y1;
+
+ BEGIN_BATCH(5);
+ /* The documentation says that the LOAD_SCAN_LINES command
+ * always comes in pairs. Don't ask me why. */
+ OUT_BATCH(MI_LOAD_SCAN_LINES_INCL |
+ load_scan_lines_pipe);
+ OUT_BATCH((y1 << 16) | y2);
+ OUT_BATCH(MI_LOAD_SCAN_LINES_INCL |
+ load_scan_lines_pipe);
+ OUT_BATCH((y1 << 16) | y2);
+ OUT_BATCH(MI_WAIT_FOR_EVENT | event);
+ ADVANCE_BATCH();
+ }
}
- }
-
- (*pGC->ops->CopyArea)(src, dst,
- pGC, 0, 0, pDraw->width, pDraw->height, 0, 0);
- FreeScratchGC(pGC);
-
- /* Emit a flush of the rendering cache, or on the 965 and beyond
- * rendering results may not hit the framebuffer until significantly
- * later.
- */
- I830EmitFlush(pScrn);
- pI830->need_mi_flush = FALSE;
-
- /* We can't rely on getting into the block handler before the DRI
- * client gets to run again so flush now. */
- intel_batch_flush(pScrn, TRUE);
+
+ (*pGC->ops->CopyArea) (src, dst,
+ pGC, 0, 0, pDraw->width, pDraw->height, 0, 0);
+ FreeScratchGC(pGC);
+
+ /* Emit a flush of the rendering cache, or on the 965 and beyond
+ * rendering results may not hit the framebuffer until significantly
+ * later.
+ */
+ I830EmitFlush(pScrn);
+ pI830->need_mi_flush = FALSE;
+
+ /* We can't rely on getting into the block handler before the DRI
+ * client gets to run again so flush now. */
+ intel_batch_flush(pScrn, TRUE);
#if ALWAYS_SYNC
- I830Sync(pScrn);
+ I830Sync(pScrn);
#endif
- drmCommandNone(pI830->drmSubFD, DRM_I915_GEM_THROTTLE);
+ drmCommandNone(pI830->drmSubFD, DRM_I915_GEM_THROTTLE);
}
Bool I830DRI2ScreenInit(ScreenPtr pScreen)
{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- DRI2InfoRec info;
- char *p;
- int i;
- struct stat sbuf;
- dev_t d;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ DRI2InfoRec info;
+ char *p;
+ int i;
+ struct stat sbuf;
+ dev_t d;
#ifdef USE_DRI2_1_1_0
- int dri2_major = 1;
- int dri2_minor = 0;
+ int dri2_major = 1;
+ int dri2_minor = 0;
#endif
#ifdef USE_DRI2_1_1_0
- if (xf86LoaderCheckSymbol("DRI2Version")) {
- DRI2Version(& dri2_major, & dri2_minor);
- }
-
- if (dri2_minor < 1) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "DRI2 requires DRI2 module version 1.1.0 or later\n");
- return FALSE;
- }
+ if (xf86LoaderCheckSymbol("DRI2Version")) {
+ DRI2Version(&dri2_major, &dri2_minor);
+ }
+
+ if (dri2_minor < 1) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "DRI2 requires DRI2 module version 1.1.0 or later\n");
+ return FALSE;
+ }
#endif
- info.fd = pI830->drmSubFD;
+ info.fd = pI830->drmSubFD;
- /* The whole drmOpen thing is a fiasco and we need to find a way
- * back to just using open(2). For now, however, lets just make
- * things worse with even more ad hoc directory walking code to
- * discover the device file name. */
+ /* The whole drmOpen thing is a fiasco and we need to find a way
+ * back to just using open(2). For now, however, lets just make
+ * things worse with even more ad hoc directory walking code to
+ * discover the device file name. */
- fstat(info.fd, &sbuf);
- d = sbuf.st_rdev;
+ fstat(info.fd, &sbuf);
+ d = sbuf.st_rdev;
- p = pI830->deviceName;
- for (i = 0; i < DRM_MAX_MINOR; i++) {
- sprintf(p, DRM_DEV_NAME, DRM_DIR_NAME, i);
- if (stat(p, &sbuf) == 0 && sbuf.st_rdev == d)
- break;
- }
- if (i == DRM_MAX_MINOR) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "DRI2: failed to open drm device\n");
- return FALSE;
- }
+ p = pI830->deviceName;
+ for (i = 0; i < DRM_MAX_MINOR; i++) {
+ sprintf(p, DRM_DEV_NAME, DRM_DIR_NAME, i);
+ if (stat(p, &sbuf) == 0 && sbuf.st_rdev == d)
+ break;
+ }
+ if (i == DRM_MAX_MINOR) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "DRI2: failed to open drm device\n");
+ return FALSE;
+ }
- info.driverName = IS_I965G(pI830) ? "i965" : "i915";
- info.deviceName = p;
+ info.driverName = IS_I965G(pI830) ? "i965" : "i915";
+ info.deviceName = p;
#if DRI2INFOREC_VERSION >= 3
- info.version = 3;
- info.CreateBuffer = I830DRI2CreateBuffer;
- info.DestroyBuffer = I830DRI2DestroyBuffer;
+ info.version = 3;
+ info.CreateBuffer = I830DRI2CreateBuffer;
+ info.DestroyBuffer = I830DRI2DestroyBuffer;
#else
# ifdef USE_DRI2_1_1_0
- info.version = 2;
- info.CreateBuffers = NULL;
- info.DestroyBuffers = NULL;
- info.CreateBuffer = I830DRI2CreateBuffer;
- info.DestroyBuffer = I830DRI2DestroyBuffer;
+ info.version = 2;
+ info.CreateBuffers = NULL;
+ info.DestroyBuffers = NULL;
+ info.CreateBuffer = I830DRI2CreateBuffer;
+ info.DestroyBuffer = I830DRI2DestroyBuffer;
# else
- info.version = 1;
- info.CreateBuffers = I830DRI2CreateBuffers;
- info.DestroyBuffers = I830DRI2DestroyBuffers;
+ info.version = 1;
+ info.CreateBuffers = I830DRI2CreateBuffers;
+ info.DestroyBuffers = I830DRI2DestroyBuffers;
# endif
#endif
- info.CopyRegion = I830DRI2CopyRegion;
+ info.CopyRegion = I830DRI2CopyRegion;
- return DRI2ScreenInit(pScreen, &info);
+ return DRI2ScreenInit(pScreen, &info);
}
void I830DRI2CloseScreen(ScreenPtr pScreen)
{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
- DRI2CloseScreen(pScreen);
- pI830->directRenderingType = DRI_NONE;
+ DRI2CloseScreen(pScreen);
+ pI830->directRenderingType = DRI_NONE;
}
diff --git a/src/i830_dri.h b/src/i830_dri.h
index bedbcbe2..9802356c 100644
--- a/src/i830_dri.h
+++ b/src/i830_dri.h
@@ -14,48 +14,48 @@
#define I830_REG_SIZE 0x80000
typedef struct _I830DRIRec {
- drm_handle_t regs;
- drmSize regsSize;
+ drm_handle_t regs;
+ drmSize regsSize;
- drmSize unused1; /* backbufferSize */
- drm_handle_t unused2; /* backbuffer */
+ drmSize unused1; /* backbufferSize */
+ drm_handle_t unused2; /* backbuffer */
- drmSize unused3; /* depthbufferSize */
- drm_handle_t unused4; /* depthbuffer */
+ drmSize unused3; /* depthbufferSize */
+ drm_handle_t unused4; /* depthbuffer */
- drmSize unused5; /* rotatedSize /*/
- drm_handle_t unused6; /* rotatedbuffer */
+ drmSize unused5; /* rotatedSize / */
+ drm_handle_t unused6; /* rotatedbuffer */
- drm_handle_t unused7; /* textures */
- int unused8; /* textureSize */
+ drm_handle_t unused7; /* textures */
+ int unused8; /* textureSize */
- drm_handle_t unused9; /* agp_buffers */
- drmSize unused10; /* agp_buf_size */
+ drm_handle_t unused9; /* agp_buffers */
+ drmSize unused10; /* agp_buf_size */
- int deviceID;
- int width;
- int height;
- int mem;
- int cpp;
- int bitsPerPixel;
+ int deviceID;
+ int width;
+ int height;
+ int mem;
+ int cpp;
+ int bitsPerPixel;
- int unused11[8]; /* was front/back/depth/rotated offset/pitch */
+ int unused11[8]; /* was front/back/depth/rotated offset/pitch */
- int unused12; /* logTextureGranularity */
- int unused13; /* textureOffset */
+ int unused12; /* logTextureGranularity */
+ int unused13; /* textureOffset */
- int irq;
- int sarea_priv_offset;
+ int irq;
+ int sarea_priv_offset;
} I830DRIRec, *I830DRIPtr;
typedef struct {
- /* Nothing here yet */
- int dummy;
+ /* Nothing here yet */
+ int dummy;
} I830ConfigPrivRec, *I830ConfigPrivPtr;
typedef struct {
- /* Nothing here yet */
- int dummy;
+ /* Nothing here yet */
+ int dummy;
} I830DRIContextRec, *I830DRIContextPtr;
#endif
diff --git a/src/i830_driver.c b/src/i830_driver.c
index 165036d1..b36450b1 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -201,124 +201,127 @@ void
I830DPRINTF(const char *filename, int line, const char *function,
const char *fmt, ...)
{
- va_list ap;
-
- ErrorF("\n##############################################\n"
- "*** In function %s, on line %d, in file %s ***\n",
- function, line, filename);
- va_start(ap, fmt);
- VErrorF(fmt, ap);
- va_end(ap);
- ErrorF("##############################################\n\n");
+ va_list ap;
+
+ ErrorF("\n##############################################\n"
+ "*** In function %s, on line %d, in file %s ***\n",
+ function, line, filename);
+ va_start(ap, fmt);
+ VErrorF(fmt, ap);
+ va_end(ap);
+ ErrorF("##############################################\n\n");
}
#endif /* #ifdef I830DEBUG */
/* Export I830 options to i830 driver where necessary */
-const OptionInfoRec *
-I830AvailableOptions(int chipid, int busid)
+const OptionInfoRec *I830AvailableOptions(int chipid, int busid)
{
- int i;
+ int i;
- for (i = 0; I830PciChipsets[i].PCIid > 0; i++) {
- if (chipid == I830PciChipsets[i].PCIid)
- return I830Options;
- }
- return NULL;
+ for (i = 0; I830PciChipsets[i].PCIid > 0; i++) {
+ if (chipid == I830PciChipsets[i].PCIid)
+ return I830Options;
+ }
+ return NULL;
}
-static Bool
-I830GetRec(ScrnInfoPtr pScrn)
+static Bool I830GetRec(ScrnInfoPtr pScrn)
{
- I830Ptr pI830;
+ I830Ptr pI830;
- if (pScrn->driverPrivate)
- return TRUE;
- pI830 = pScrn->driverPrivate = xnfcalloc(sizeof(I830Rec), 1);
- return TRUE;
+ if (pScrn->driverPrivate)
+ return TRUE;
+ pI830 = pScrn->driverPrivate = xnfcalloc(sizeof(I830Rec), 1);
+ return TRUE;
}
-static void
-I830FreeRec(ScrnInfoPtr pScrn)
+static void I830FreeRec(ScrnInfoPtr pScrn)
{
- I830Ptr pI830;
+ I830Ptr pI830;
- if (!pScrn)
- return;
- if (!pScrn->driverPrivate)
- return;
+ if (!pScrn)
+ return;
+ if (!pScrn->driverPrivate)
+ return;
- pI830 = I830PTR(pScrn);
+ pI830 = I830PTR(pScrn);
- xfree(pScrn->driverPrivate);
- pScrn->driverPrivate = NULL;
+ xfree(pScrn->driverPrivate);
+ pScrn->driverPrivate = NULL;
}
static void
I830LoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
LOCO * colors, VisualPtr pVisual)
{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- int i,j, index;
- int p;
- uint16_t lut_r[256], lut_g[256], lut_b[256];
-
- DPRINTF(PFX, "I830LoadPalette: numColors: %d\n", numColors);
-
- for(p = 0; p < xf86_config->num_crtc; p++) {
- xf86CrtcPtr crtc = xf86_config->crtc[p];
- I830CrtcPrivatePtr intel_crtc = crtc->driver_private;
-
- /* Initialize to the old lookup table values. */
- for (i = 0; i < 256; i++) {
- lut_r[i] = intel_crtc->lut_r[i] << 8;
- lut_g[i] = intel_crtc->lut_g[i] << 8;
- lut_b[i] = intel_crtc->lut_b[i] << 8;
- }
-
- switch(pScrn->depth) {
- case 15:
- for (i = 0; i < numColors; i++) {
- index = indices[i];
- for (j = 0; j < 8; j++) {
- lut_r[index * 8 + j] = colors[index].red << 8;
- lut_g[index * 8 + j] = colors[index].green << 8;
- lut_b[index * 8 + j] = colors[index].blue << 8;
- }
- }
- break;
- case 16:
- for (i = 0; i < numColors; i++) {
- index = indices[i];
-
- if (index <= 31) {
- for (j = 0; j < 8; j++) {
- lut_r[index * 8 + j] = colors[index].red << 8;
- lut_b[index * 8 + j] = colors[index].blue << 8;
- }
- }
-
- for (j = 0; j < 4; j++) {
- lut_g[index * 4 + j] = colors[index].green << 8;
- }
- }
- break;
- default:
- for (i = 0; i < numColors; i++) {
- index = indices[i];
- lut_r[index] = colors[index].red << 8;
- lut_g[index] = colors[index].green << 8;
- lut_b[index] = colors[index].blue << 8;
- }
- break;
- }
-
- /* Make the change through RandR */
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ int i, j, index;
+ int p;
+ uint16_t lut_r[256], lut_g[256], lut_b[256];
+
+ DPRINTF(PFX, "I830LoadPalette: numColors: %d\n", numColors);
+
+ for (p = 0; p < xf86_config->num_crtc; p++) {
+ xf86CrtcPtr crtc = xf86_config->crtc[p];
+ I830CrtcPrivatePtr intel_crtc = crtc->driver_private;
+
+ /* Initialize to the old lookup table values. */
+ for (i = 0; i < 256; i++) {
+ lut_r[i] = intel_crtc->lut_r[i] << 8;
+ lut_g[i] = intel_crtc->lut_g[i] << 8;
+ lut_b[i] = intel_crtc->lut_b[i] << 8;
+ }
+
+ switch (pScrn->depth) {
+ case 15:
+ for (i = 0; i < numColors; i++) {
+ index = indices[i];
+ for (j = 0; j < 8; j++) {
+ lut_r[index * 8 + j] =
+ colors[index].red << 8;
+ lut_g[index * 8 + j] =
+ colors[index].green << 8;
+ lut_b[index * 8 + j] =
+ colors[index].blue << 8;
+ }
+ }
+ break;
+ case 16:
+ for (i = 0; i < numColors; i++) {
+ index = indices[i];
+
+ if (index <= 31) {
+ for (j = 0; j < 8; j++) {
+ lut_r[index * 8 + j] =
+ colors[index].red << 8;
+ lut_b[index * 8 + j] =
+ colors[index].blue << 8;
+ }
+ }
+
+ for (j = 0; j < 4; j++) {
+ lut_g[index * 4 + j] =
+ colors[index].green << 8;
+ }
+ }
+ break;
+ default:
+ for (i = 0; i < numColors; i++) {
+ index = indices[i];
+ lut_r[index] = colors[index].red << 8;
+ lut_g[index] = colors[index].green << 8;
+ lut_b[index] = colors[index].blue << 8;
+ }
+ break;
+ }
+
+ /* Make the change through RandR */
#ifdef RANDR_12_INTERFACE
- RRCrtcGammaSet(crtc->randr_crtc, lut_r, lut_g, lut_b);
+ RRCrtcGammaSet(crtc->randr_crtc, lut_r, lut_g, lut_b);
#else
- crtc->funcs->gamma_set(crtc, lut_r, lut_g, lut_b, 256);
+ crtc->funcs->gamma_set(crtc, lut_r, lut_g, lut_b, 256);
#endif
- }
+ }
}
/**
@@ -327,140 +330,137 @@ I830LoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
* have already been created, but the first EnterVT happens before
* CreateScreenResources.
*/
-static Bool
-i830CreateScreenResources(ScreenPtr pScreen)
+static Bool i830CreateScreenResources(ScreenPtr pScreen)
{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
- pScreen->CreateScreenResources = pI830->CreateScreenResources;
- if (!(*pScreen->CreateScreenResources)(pScreen))
- return FALSE;
+ pScreen->CreateScreenResources = pI830->CreateScreenResources;
+ if (!(*pScreen->CreateScreenResources) (pScreen))
+ return FALSE;
- i830_uxa_create_screen_resources(pScreen);
+ i830_uxa_create_screen_resources(pScreen);
- return TRUE;
+ return TRUE;
}
-static void
-PreInitCleanup(ScrnInfoPtr pScrn)
+static void PreInitCleanup(ScrnInfoPtr pScrn)
{
- I830FreeRec(pScrn);
+ I830FreeRec(pScrn);
}
/*
* Adjust *width to allow for tiling if possible
*/
-Bool
-i830_tiled_width(I830Ptr i830, int *width, int cpp)
+Bool i830_tiled_width(I830Ptr i830, int *width, int cpp)
{
- Bool tiled = FALSE;
-
- /*
- * Adjust the display width to allow for front buffer tiling if possible
- */
- if (i830->tiling) {
- if (IS_I965G(i830)) {
- int tile_pixels = 512 / cpp;
- *width = (*width + tile_pixels - 1) &
- ~(tile_pixels - 1);
- tiled = TRUE;
- } else {
- /* Good pitches to allow tiling. Don't care about pitches < 1024
- * pixels.
- */
- static const int pitches[] = {
- 1024,
- 2048,
- 4096,
- 8192,
- 0
- };
- int i;
-
- for (i = 0; pitches[i] != 0; i++) {
- if (pitches[i] >= *width) {
- *width = pitches[i];
- tiled = TRUE;
- break;
+ Bool tiled = FALSE;
+
+ /*
+ * Adjust the display width to allow for front buffer tiling if possible
+ */
+ if (i830->tiling) {
+ if (IS_I965G(i830)) {
+ int tile_pixels = 512 / cpp;
+ *width = (*width + tile_pixels - 1) &
+ ~(tile_pixels - 1);
+ tiled = TRUE;
+ } else {
+ /* Good pitches to allow tiling. Don't care about pitches < 1024
+ * pixels.
+ */
+ static const int pitches[] = {
+ 1024,
+ 2048,
+ 4096,
+ 8192,
+ 0
+ };
+ int i;
+
+ for (i = 0; pitches[i] != 0; i++) {
+ if (pitches[i] >= *width) {
+ *width = pitches[i];
+ tiled = TRUE;
+ break;
+ }
+ }
}
- }
}
- }
- return tiled;
+ return tiled;
}
/*
* Pad to accelerator requirement
*/
-int
-i830_pad_drawable_width(int width, int cpp)
+int i830_pad_drawable_width(int width, int cpp)
{
- return (width + 63) & ~63;
+ return (width + 63) & ~63;
}
-static Bool
-i830_xf86crtc_resize (ScrnInfoPtr scrn, int width, int height)
+static Bool i830_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
{
#ifdef DRI2
- I830Ptr i830 = I830PTR(scrn);
- int old_width = scrn->displayWidth;
+ I830Ptr i830 = I830PTR(scrn);
+ int old_width = scrn->displayWidth;
#endif
- int old_x = scrn->virtualX;
- int old_y = scrn->virtualY;
+ int old_x = scrn->virtualX;
+ int old_y = scrn->virtualY;
- if (old_x == width && old_y == height)
- return TRUE;
+ if (old_x == width && old_y == height)
+ return TRUE;
- scrn->virtualX = width;
- scrn->virtualY = height;
+ scrn->virtualX = width;
+ scrn->virtualY = height;
#ifdef DRI2
- if (i830->front_buffer)
- {
- i830_memory *new_front, *old_front;
- Bool tiled;
- ScreenPtr screen = screenInfo.screens[scrn->scrnIndex];
-
- scrn->displayWidth = i830_pad_drawable_width(width, i830->cpp);
- tiled = i830_tiled_width(i830, &scrn->displayWidth, i830->cpp);
- xf86DrvMsg(scrn->scrnIndex, X_INFO, "Allocate new frame buffer %dx%d stride %d\n",
- width, height, scrn->displayWidth);
- I830Sync(scrn);
- i830WaitForVblank(scrn);
- new_front = i830_allocate_framebuffer(scrn);
- if (!new_front) {
- scrn->virtualX = old_x;
- scrn->virtualY = old_y;
- scrn->displayWidth = old_width;
- return FALSE;
+ if (i830->front_buffer) {
+ i830_memory *new_front, *old_front;
+ Bool tiled;
+ ScreenPtr screen = screenInfo.screens[scrn->scrnIndex];
+
+ scrn->displayWidth = i830_pad_drawable_width(width, i830->cpp);
+ tiled = i830_tiled_width(i830, &scrn->displayWidth, i830->cpp);
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "Allocate new frame buffer %dx%d stride %d\n", width,
+ height, scrn->displayWidth);
+ I830Sync(scrn);
+ i830WaitForVblank(scrn);
+ new_front = i830_allocate_framebuffer(scrn);
+ if (!new_front) {
+ scrn->virtualX = old_x;
+ scrn->virtualY = old_y;
+ scrn->displayWidth = old_width;
+ return FALSE;
+ }
+ old_front = i830->front_buffer;
+ i830->front_buffer = new_front;
+ i830_set_pixmap_bo(screen->GetScreenPixmap(screen),
+ new_front->bo);
+ scrn->fbOffset = i830->front_buffer->offset;
+
+ screen->ModifyPixmapHeader(screen->GetScreenPixmap(screen),
+ width, height, -1, -1,
+ scrn->displayWidth * i830->cpp,
+ NULL);
+
+ /* ick. xf86EnableDisableFBAccess smashes the screen pixmap devPrivate,
+ * so update the value it uses
+ */
+ scrn->pixmapPrivate.ptr = NULL;
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "New front buffer at 0x%lx\n",
+ i830->front_buffer->offset);
+ i830_set_new_crtc_bo(scrn);
+ I830Sync(scrn);
+ i830WaitForVblank(scrn);
+ i830_free_memory(scrn, old_front);
}
- old_front = i830->front_buffer;
- i830->front_buffer = new_front;
- i830_set_pixmap_bo(screen->GetScreenPixmap(screen),
- new_front->bo);
- scrn->fbOffset = i830->front_buffer->offset;
-
- screen->ModifyPixmapHeader(screen->GetScreenPixmap(screen),
- width, height, -1, -1, scrn->displayWidth * i830->cpp,
- NULL);
-
- /* ick. xf86EnableDisableFBAccess smashes the screen pixmap devPrivate,
- * so update the value it uses
- */
- scrn->pixmapPrivate.ptr = NULL;
- xf86DrvMsg(scrn->scrnIndex, X_INFO, "New front buffer at 0x%lx\n",
- i830->front_buffer->offset);
- i830_set_new_crtc_bo(scrn);
- I830Sync(scrn);
- i830WaitForVblank(scrn);
- i830_free_memory(scrn, old_front);
- }
#endif
- return TRUE;
+ return TRUE;
}
static const xf86CrtcConfigFuncsRec i830_xf86crtc_config_funcs = {
- i830_xf86crtc_resize
+ i830_xf86crtc_resize
};
/*
@@ -469,325 +469,326 @@ static const xf86CrtcConfigFuncsRec i830_xf86crtc_config_funcs = {
*/
static Bool i830_kernel_mode_enabled(ScrnInfoPtr pScrn)
{
- struct pci_device *PciInfo;
- EntityInfoPtr pEnt;
- char *busIdString;
- int ret;
+ struct pci_device *PciInfo;
+ EntityInfoPtr pEnt;
+ char *busIdString;
+ int ret;
- pEnt = xf86GetEntityInfo(pScrn->entityList[0]);
- PciInfo = xf86GetPciInfoForEntity(pEnt->index);
+ pEnt = xf86GetEntityInfo(pScrn->entityList[0]);
+ PciInfo = xf86GetPciInfoForEntity(pEnt->index);
- if (!xf86LoaderCheckSymbol("DRICreatePCIBusID"))
- return FALSE;
+ if (!xf86LoaderCheckSymbol("DRICreatePCIBusID"))
+ return FALSE;
- busIdString = DRICreatePCIBusID(PciInfo);
-
- ret = drmCheckModesettingSupported(busIdString);
- if (ret) {
- if (xf86LoadKernelModule("i915"))
- ret = drmCheckModesettingSupported(busIdString);
- }
- /* Be nice to the user and load fbcon too */
- if (!ret)
- (void) xf86LoadKernelModule("fbcon");
- xfree(busIdString);
- if (ret)
- return FALSE;
+ busIdString = DRICreatePCIBusID(PciInfo);
- return TRUE;
+ ret = drmCheckModesettingSupported(busIdString);
+ if (ret) {
+ if (xf86LoadKernelModule("i915"))
+ ret = drmCheckModesettingSupported(busIdString);
+ }
+ /* Be nice to the user and load fbcon too */
+ if (!ret)
+ (void)xf86LoadKernelModule("fbcon");
+ xfree(busIdString);
+ if (ret)
+ return FALSE;
+
+ return TRUE;
}
-static void
-i830_detect_chipset(ScrnInfoPtr pScrn)
+static void i830_detect_chipset(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- MessageType from = X_PROBED;
- const char *chipname;
- uint32_t capid;
-
- switch (DEVICE_ID(pI830->PciInfo)) {
- case PCI_CHIP_I830_M:
- chipname = "830M";
- break;
- case PCI_CHIP_845_G:
- chipname = "845G";
- break;
- case PCI_CHIP_I855_GM:
- /* Check capid register to find the chipset variant */
- pci_device_cfg_read_u32 (pI830->PciInfo, &capid, I85X_CAPID);
- pI830->variant = (capid >> I85X_VARIANT_SHIFT) & I85X_VARIANT_MASK;
- switch (pI830->variant) {
- case I855_GM:
- chipname = "855GM";
- break;
- case I855_GME:
- chipname = "855GME";
- break;
- case I852_GM:
- chipname = "852GM";
- break;
- case I852_GME:
- chipname = "852GME";
- break;
+ I830Ptr pI830 = I830PTR(pScrn);
+ MessageType from = X_PROBED;
+ const char *chipname;
+ uint32_t capid;
+
+ switch (DEVICE_ID(pI830->PciInfo)) {
+ case PCI_CHIP_I830_M:
+ chipname = "830M";
+ break;
+ case PCI_CHIP_845_G:
+ chipname = "845G";
+ break;
+ case PCI_CHIP_I855_GM:
+ /* Check capid register to find the chipset variant */
+ pci_device_cfg_read_u32(pI830->PciInfo, &capid, I85X_CAPID);
+ pI830->variant =
+ (capid >> I85X_VARIANT_SHIFT) & I85X_VARIANT_MASK;
+ switch (pI830->variant) {
+ case I855_GM:
+ chipname = "855GM";
+ break;
+ case I855_GME:
+ chipname = "855GME";
+ break;
+ case I852_GM:
+ chipname = "852GM";
+ break;
+ case I852_GME:
+ chipname = "852GME";
+ break;
+ default:
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Unknown 852GM/855GM variant: 0x%x)\n",
+ pI830->variant);
+ chipname = "852GM/855GM (unknown variant)";
+ break;
+ }
+ break;
+ case PCI_CHIP_I865_G:
+ chipname = "865G";
+ break;
+ case PCI_CHIP_I915_G:
+ chipname = "915G";
+ break;
+ case PCI_CHIP_E7221_G:
+ chipname = "E7221 (i915)";
+ break;
+ case PCI_CHIP_I915_GM:
+ chipname = "915GM";
+ break;
+ case PCI_CHIP_I945_G:
+ chipname = "945G";
+ break;
+ case PCI_CHIP_I945_GM:
+ chipname = "945GM";
+ break;
+ case PCI_CHIP_I945_GME:
+ chipname = "945GME";
+ break;
+ case PCI_CHIP_IGD_GM:
+ chipname = "Pineview GM";
+ break;
+ case PCI_CHIP_IGD_G:
+ chipname = "Pineview G";
+ break;
+ case PCI_CHIP_I965_G:
+ chipname = "965G";
+ break;
+ case PCI_CHIP_G35_G:
+ chipname = "G35";
+ break;
+ case PCI_CHIP_I965_Q:
+ chipname = "965Q";
+ break;
+ case PCI_CHIP_I946_GZ:
+ chipname = "946GZ";
+ break;
+ case PCI_CHIP_I965_GM:
+ chipname = "965GM";
+ break;
+ case PCI_CHIP_I965_GME:
+ chipname = "965GME/GLE";
+ break;
+ case PCI_CHIP_G33_G:
+ chipname = "G33";
+ break;
+ case PCI_CHIP_Q35_G:
+ chipname = "Q35";
+ break;
+ case PCI_CHIP_Q33_G:
+ chipname = "Q33";
+ break;
+ case PCI_CHIP_GM45_GM:
+ chipname = "GM45";
+ break;
+ case PCI_CHIP_IGD_E_G:
+ chipname = "4 Series";
+ break;
+ case PCI_CHIP_G45_G:
+ chipname = "G45/G43";
+ break;
+ case PCI_CHIP_Q45_G:
+ chipname = "Q45/Q43";
+ break;
+ case PCI_CHIP_G41_G:
+ chipname = "G41";
+ break;
+ case PCI_CHIP_B43_G:
+ chipname = "B43";
+ break;
+ case PCI_CHIP_IGDNG_D_G:
+ chipname = "Clarkdale";
+ break;
+ case PCI_CHIP_IGDNG_M_G:
+ chipname = "Arrandale";
+ break;
default:
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Unknown 852GM/855GM variant: 0x%x)\n", pI830->variant);
- chipname = "852GM/855GM (unknown variant)";
- break;
+ chipname = "unknown chipset";
+ break;
}
- break;
- case PCI_CHIP_I865_G:
- chipname = "865G";
- break;
- case PCI_CHIP_I915_G:
- chipname = "915G";
- break;
- case PCI_CHIP_E7221_G:
- chipname = "E7221 (i915)";
- break;
- case PCI_CHIP_I915_GM:
- chipname = "915GM";
- break;
- case PCI_CHIP_I945_G:
- chipname = "945G";
- break;
- case PCI_CHIP_I945_GM:
- chipname = "945GM";
- break;
- case PCI_CHIP_I945_GME:
- chipname = "945GME";
- break;
- case PCI_CHIP_IGD_GM:
- chipname = "Pineview GM";
- break;
- case PCI_CHIP_IGD_G:
- chipname = "Pineview G";
- break;
- case PCI_CHIP_I965_G:
- chipname = "965G";
- break;
- case PCI_CHIP_G35_G:
- chipname = "G35";
- break;
- case PCI_CHIP_I965_Q:
- chipname = "965Q";
- break;
- case PCI_CHIP_I946_GZ:
- chipname = "946GZ";
- break;
- case PCI_CHIP_I965_GM:
- chipname = "965GM";
- break;
- case PCI_CHIP_I965_GME:
- chipname = "965GME/GLE";
- break;
- case PCI_CHIP_G33_G:
- chipname = "G33";
- break;
- case PCI_CHIP_Q35_G:
- chipname = "Q35";
- break;
- case PCI_CHIP_Q33_G:
- chipname = "Q33";
- break;
- case PCI_CHIP_GM45_GM:
- chipname = "GM45";
- break;
- case PCI_CHIP_IGD_E_G:
- chipname = "4 Series";
- break;
- case PCI_CHIP_G45_G:
- chipname = "G45/G43";
- break;
- case PCI_CHIP_Q45_G:
- chipname = "Q45/Q43";
- break;
- case PCI_CHIP_G41_G:
- chipname = "G41";
- break;
- case PCI_CHIP_B43_G:
- chipname = "B43";
- break;
- case PCI_CHIP_IGDNG_D_G:
- chipname = "Clarkdale";
- break;
- case PCI_CHIP_IGDNG_M_G:
- chipname = "Arrandale";
- break;
- default:
- chipname = "unknown chipset";
- break;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Integrated Graphics Chipset: Intel(R) %s\n", chipname);
-
- /* Set the Chipset and ChipRev, allowing config file entries to override. */
- if (pI830->pEnt->device->chipset && *pI830->pEnt->device->chipset) {
- pScrn->chipset = pI830->pEnt->device->chipset;
- from = X_CONFIG;
- } else if (pI830->pEnt->device->chipID >= 0) {
- pScrn->chipset = (char *)xf86TokenToString(I830Chipsets,
- pI830->pEnt->device->chipID);
- from = X_CONFIG;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipID override: 0x%04X\n",
- pI830->pEnt->device->chipID);
- DEVICE_ID(pI830->PciInfo) = pI830->pEnt->device->chipID;
- } else {
- from = X_PROBED;
- pScrn->chipset = (char *)xf86TokenToString(I830Chipsets,
- DEVICE_ID(pI830->PciInfo));
- }
-
- if (pI830->pEnt->device->chipRev >= 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipRev override: %d\n",
- pI830->pEnt->device->chipRev);
- }
-
- xf86DrvMsg(pScrn->scrnIndex, from, "Chipset: \"%s\"\n",
- (pScrn->chipset != NULL) ? pScrn->chipset : "Unknown i8xx");
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Integrated Graphics Chipset: Intel(R) %s\n", chipname);
+
+ /* Set the Chipset and ChipRev, allowing config file entries to override. */
+ if (pI830->pEnt->device->chipset && *pI830->pEnt->device->chipset) {
+ pScrn->chipset = pI830->pEnt->device->chipset;
+ from = X_CONFIG;
+ } else if (pI830->pEnt->device->chipID >= 0) {
+ pScrn->chipset = (char *)xf86TokenToString(I830Chipsets,
+ pI830->pEnt->device->
+ chipID);
+ from = X_CONFIG;
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ "ChipID override: 0x%04X\n",
+ pI830->pEnt->device->chipID);
+ DEVICE_ID(pI830->PciInfo) = pI830->pEnt->device->chipID;
+ } else {
+ from = X_PROBED;
+ pScrn->chipset = (char *)xf86TokenToString(I830Chipsets,
+ DEVICE_ID(pI830->
+ PciInfo));
+ }
+
+ if (pI830->pEnt->device->chipRev >= 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipRev override: %d\n",
+ pI830->pEnt->device->chipRev);
+ }
+
+ xf86DrvMsg(pScrn->scrnIndex, from, "Chipset: \"%s\"\n",
+ (pScrn->chipset != NULL) ? pScrn->chipset : "Unknown i8xx");
}
-static Bool
-I830GetEarlyOptions(ScrnInfoPtr pScrn)
+static Bool I830GetEarlyOptions(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- /* Process the options */
- xf86CollectOptions(pScrn, NULL);
- if (!(pI830->Options = xalloc(sizeof(I830Options))))
- return FALSE;
- memcpy(pI830->Options, I830Options, sizeof(I830Options));
- xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, pI830->Options);
+ /* Process the options */
+ xf86CollectOptions(pScrn, NULL);
+ if (!(pI830->Options = xalloc(sizeof(I830Options))))
+ return FALSE;
+ memcpy(pI830->Options, I830Options, sizeof(I830Options));
+ xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, pI830->Options);
- pI830->fallback_debug = xf86ReturnOptValBool(pI830->Options,
- OPTION_FALLBACKDEBUG, FALSE);
+ pI830->fallback_debug = xf86ReturnOptValBool(pI830->Options,
+ OPTION_FALLBACKDEBUG,
+ FALSE);
- return TRUE;
+ return TRUE;
}
-static void
-i830_check_dri_option(ScrnInfoPtr pScrn)
+static void i830_check_dri_option(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- pI830->directRenderingType = DRI_NONE;
- if (!xf86ReturnOptValBool(pI830->Options, OPTION_DRI, TRUE))
- pI830->directRenderingType = DRI_DISABLED;
-
- if (pScrn->depth != 16 && pScrn->depth != 24) {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "DRI is disabled because it "
- "runs only at depths 16 and 24.\n");
- pI830->directRenderingType = DRI_DISABLED;
- }
+ I830Ptr pI830 = I830PTR(pScrn);
+ pI830->directRenderingType = DRI_NONE;
+ if (!xf86ReturnOptValBool(pI830->Options, OPTION_DRI, TRUE))
+ pI830->directRenderingType = DRI_DISABLED;
+
+ if (pScrn->depth != 16 && pScrn->depth != 24) {
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ "DRI is disabled because it "
+ "runs only at depths 16 and 24.\n");
+ pI830->directRenderingType = DRI_DISABLED;
+ }
}
-static Bool
-i830_open_drm_master(ScrnInfoPtr scrn)
+static Bool i830_open_drm_master(ScrnInfoPtr scrn)
{
- I830Ptr i830 = I830PTR(scrn);
- struct pci_device *dev = i830->PciInfo;
- char *busid;
- drmSetVersion sv;
- struct drm_i915_getparam gp;
- int err, has_gem;
-
- /* We wish we had asprintf, but all we get is XNFprintf. */
- busid = XNFprintf("pci:%04x:%02x:%02x.%d",
- dev->domain, dev->bus, dev->dev, dev->func);
-
- i830->drmSubFD = drmOpen("i915", busid);
- if (i830->drmSubFD == -1) {
+ I830Ptr i830 = I830PTR(scrn);
+ struct pci_device *dev = i830->PciInfo;
+ char *busid;
+ drmSetVersion sv;
+ struct drm_i915_getparam gp;
+ int err, has_gem;
+
+ /* We wish we had asprintf, but all we get is XNFprintf. */
+ busid = XNFprintf("pci:%04x:%02x:%02x.%d",
+ dev->domain, dev->bus, dev->dev, dev->func);
+
+ i830->drmSubFD = drmOpen("i915", busid);
+ if (i830->drmSubFD == -1) {
+ xfree(busid);
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "[drm] Failed to open DRM device for %s: %s\n",
+ busid, strerror(errno));
+ return FALSE;
+ }
+
xfree(busid);
- xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "[drm] Failed to open DRM device for %s: %s\n", busid,
- strerror(errno));
- return FALSE;
- }
-
- xfree(busid);
-
- /* Check that what we opened was a master or a master-capable FD,
- * by setting the version of the interface we'll use to talk to it.
- * (see DRIOpenDRMMaster() in DRI1)
- */
- sv.drm_di_major = 1;
- sv.drm_di_minor = 1;
- sv.drm_dd_major = -1;
- sv.drm_dd_minor = -1;
- err = drmSetInterfaceVersion(i830->drmSubFD, &sv);
- if (err != 0) {
- xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "[drm] failed to set drm interface version.\n");
- drmClose(i830->drmSubFD);
- i830->drmSubFD = -1;
- return FALSE;
- }
-
- has_gem = FALSE;
- gp.param = I915_PARAM_HAS_GEM;
- gp.value = &has_gem;
- (void)drmCommandWriteRead(i830->drmSubFD, DRM_I915_GETPARAM,
- &gp, sizeof(gp));
- if (!has_gem) {
- xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "[drm] Failed to detect GEM. Kernel 2.6.28 required.\n");
- drmClose(i830->drmSubFD);
- i830->drmSubFD = -1;
- return FALSE;
- }
- return TRUE;
+ /* Check that what we opened was a master or a master-capable FD,
+ * by setting the version of the interface we'll use to talk to it.
+ * (see DRIOpenDRMMaster() in DRI1)
+ */
+ sv.drm_di_major = 1;
+ sv.drm_di_minor = 1;
+ sv.drm_dd_major = -1;
+ sv.drm_dd_minor = -1;
+ err = drmSetInterfaceVersion(i830->drmSubFD, &sv);
+ if (err != 0) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "[drm] failed to set drm interface version.\n");
+ drmClose(i830->drmSubFD);
+ i830->drmSubFD = -1;
+ return FALSE;
+ }
+
+ has_gem = FALSE;
+ gp.param = I915_PARAM_HAS_GEM;
+ gp.value = &has_gem;
+ (void)drmCommandWriteRead(i830->drmSubFD, DRM_I915_GETPARAM,
+ &gp, sizeof(gp));
+ if (!has_gem) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "[drm] Failed to detect GEM. Kernel 2.6.28 required.\n");
+ drmClose(i830->drmSubFD);
+ i830->drmSubFD = -1;
+ return FALSE;
+ }
+
+ return TRUE;
}
-static void
-i830_close_drm_master(ScrnInfoPtr scrn)
+static void i830_close_drm_master(ScrnInfoPtr scrn)
{
- I830Ptr i830 = I830PTR(scrn);
- if (i830 && i830->drmSubFD > 0) {
- drmClose(i830->drmSubFD);
- i830->drmSubFD = -1;
- }
+ I830Ptr i830 = I830PTR(scrn);
+ if (i830 && i830->drmSubFD > 0) {
+ drmClose(i830->drmSubFD);
+ i830->drmSubFD = -1;
+ }
}
-static Bool
-I830DrmModeInit(ScrnInfoPtr pScrn)
+static Bool I830DrmModeInit(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- if (drmmode_pre_init(pScrn, pI830->drmSubFD, pI830->cpp) == FALSE) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Kernel modesetting setup failed\n");
- PreInitCleanup(pScrn);
- return FALSE;
- }
+ if (drmmode_pre_init(pScrn, pI830->drmSubFD, pI830->cpp) == FALSE) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Kernel modesetting setup failed\n");
+ PreInitCleanup(pScrn);
+ return FALSE;
+ }
- i830_init_bufmgr(pScrn);
+ i830_init_bufmgr(pScrn);
- return TRUE;
+ return TRUE;
}
-static void
-I830XvInit(ScrnInfoPtr pScrn)
+static void I830XvInit(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- MessageType from = X_PROBED;
-
- pI830->XvPreferOverlay = xf86ReturnOptValBool(pI830->Options, OPTION_PREFER_OVERLAY, FALSE);
-
- if (xf86GetOptValInteger(pI830->Options, OPTION_VIDEO_KEY,
- &(pI830->colorKey))) {
- from = X_CONFIG;
- } else if (xf86GetOptValInteger(pI830->Options, OPTION_COLOR_KEY,
- &(pI830->colorKey))) {
- from = X_CONFIG;
- } else {
- pI830->colorKey =
- (1 << pScrn->offset.red) | (1 << pScrn->offset.green) |
- (((pScrn->mask.blue >> pScrn->offset.blue) - 1) <<
- pScrn->offset.blue);
- from = X_DEFAULT;
- }
- xf86DrvMsg(pScrn->scrnIndex, from, "video overlay key set to 0x%x\n",
- pI830->colorKey);
+ I830Ptr pI830 = I830PTR(pScrn);
+ MessageType from = X_PROBED;
+
+ pI830->XvPreferOverlay =
+ xf86ReturnOptValBool(pI830->Options, OPTION_PREFER_OVERLAY, FALSE);
+
+ if (xf86GetOptValInteger(pI830->Options, OPTION_VIDEO_KEY,
+ &(pI830->colorKey))) {
+ from = X_CONFIG;
+ } else if (xf86GetOptValInteger(pI830->Options, OPTION_COLOR_KEY,
+ &(pI830->colorKey))) {
+ from = X_CONFIG;
+ } else {
+ pI830->colorKey =
+ (1 << pScrn->offset.red) | (1 << pScrn->offset.green) |
+ (((pScrn->mask.blue >> pScrn->offset.blue) - 1) <<
+ pScrn->offset.blue);
+ from = X_DEFAULT;
+ }
+ xf86DrvMsg(pScrn->scrnIndex, from, "video overlay key set to 0x%x\n",
+ pI830->colorKey);
}
/**
@@ -803,123 +804,123 @@ I830XvInit(ScrnInfoPtr pScrn)
* As a result, we want to set up that server initialization once rather
* that doing it per generation.
*/
-static Bool
-I830PreInit(ScrnInfoPtr pScrn, int flags)
+static Bool I830PreInit(ScrnInfoPtr pScrn, int flags)
{
- I830Ptr pI830;
- rgb defaultWeight = { 0, 0, 0 };
- EntityInfoPtr pEnt;
- int flags24;
- Gamma zeros = { 0.0, 0.0, 0.0 };
- int drm_mode_setting;
-
- if (pScrn->numEntities != 1)
- return FALSE;
-
- drm_mode_setting = i830_kernel_mode_enabled(pScrn);
- if (!drm_mode_setting) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "No kernel modesetting driver detected.\n");
- return FALSE;
- }
+ I830Ptr pI830;
+ rgb defaultWeight = { 0, 0, 0 };
+ EntityInfoPtr pEnt;
+ int flags24;
+ Gamma zeros = { 0.0, 0.0, 0.0 };
+ int drm_mode_setting;
+
+ if (pScrn->numEntities != 1)
+ return FALSE;
+
+ drm_mode_setting = i830_kernel_mode_enabled(pScrn);
+ if (!drm_mode_setting) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "No kernel modesetting driver detected.\n");
+ return FALSE;
+ }
- pEnt = xf86GetEntityInfo(pScrn->entityList[0]);
+ pEnt = xf86GetEntityInfo(pScrn->entityList[0]);
- if (flags & PROBE_DETECT)
- return TRUE;
+ if (flags & PROBE_DETECT)
+ return TRUE;
- /* Allocate driverPrivate */
- if (!I830GetRec(pScrn))
- return FALSE;
+ /* Allocate driverPrivate */
+ if (!I830GetRec(pScrn))
+ return FALSE;
- pI830 = I830PTR(pScrn);
- pI830->pEnt = pEnt;
+ pI830 = I830PTR(pScrn);
+ pI830->pEnt = pEnt;
- pScrn->displayWidth = 640; /* default it */
+ pScrn->displayWidth = 640; /* default it */
- if (pI830->pEnt->location.type != BUS_PCI)
- return FALSE;
+ if (pI830->pEnt->location.type != BUS_PCI)
+ return FALSE;
- pI830->PciInfo = xf86GetPciInfoForEntity(pI830->pEnt->index);
+ pI830->PciInfo = xf86GetPciInfoForEntity(pI830->pEnt->index);
- if (!i830_open_drm_master(pScrn))
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to become DRM master.\n");
+ if (!i830_open_drm_master(pScrn))
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to become DRM master.\n");
- pScrn->monitor = pScrn->confScreen->monitor;
- pScrn->progClock = TRUE;
- pScrn->rgbBits = 8;
+ pScrn->monitor = pScrn->confScreen->monitor;
+ pScrn->progClock = TRUE;
+ pScrn->rgbBits = 8;
- flags24 = Support32bppFb | PreferConvert24to32 | SupportConvert24to32;
+ flags24 = Support32bppFb | PreferConvert24to32 | SupportConvert24to32;
- if (!xf86SetDepthBpp(pScrn, 0, 0, 0, flags24))
- return FALSE;
+ if (!xf86SetDepthBpp(pScrn, 0, 0, 0, flags24))
+ return FALSE;
- switch (pScrn->depth) {
- case 8:
- case 15:
- case 16:
- case 24:
- break;
- default:
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Given depth (%d) is not supported by I830 driver\n",
- pScrn->depth);
- return FALSE;
- }
- xf86PrintDepthBpp(pScrn);
+ switch (pScrn->depth) {
+ case 8:
+ case 15:
+ case 16:
+ case 24:
+ break;
+ default:
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Given depth (%d) is not supported by I830 driver\n",
+ pScrn->depth);
+ return FALSE;
+ }
+ xf86PrintDepthBpp(pScrn);
- if (!xf86SetWeight(pScrn, defaultWeight, defaultWeight))
- return FALSE;
- if (!xf86SetDefaultVisual(pScrn, -1))
- return FALSE;
+ if (!xf86SetWeight(pScrn, defaultWeight, defaultWeight))
+ return FALSE;
+ if (!xf86SetDefaultVisual(pScrn, -1))
+ return FALSE;
- pI830->cpp = pScrn->bitsPerPixel / 8;
+ pI830->cpp = pScrn->bitsPerPixel / 8;
- if (!I830GetEarlyOptions(pScrn))
- return FALSE;
+ if (!I830GetEarlyOptions(pScrn))
+ return FALSE;
- i830_detect_chipset(pScrn);
+ i830_detect_chipset(pScrn);
- i830_check_dri_option(pScrn);
+ i830_check_dri_option(pScrn);
- I830XvInit(pScrn);
+ I830XvInit(pScrn);
- if (!I830DrmModeInit(pScrn))
- return FALSE;
+ if (!I830DrmModeInit(pScrn))
+ return FALSE;
- if (!xf86SetGamma(pScrn, zeros)) {
- PreInitCleanup(pScrn);
- return FALSE;
- }
+ if (!xf86SetGamma(pScrn, zeros)) {
+ PreInitCleanup(pScrn);
+ return FALSE;
+ }
- if (pScrn->modes == NULL) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No modes.\n");
- PreInitCleanup(pScrn);
- return FALSE;
- }
- pScrn->currentMode = pScrn->modes;
+ if (pScrn->modes == NULL) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No modes.\n");
+ PreInitCleanup(pScrn);
+ return FALSE;
+ }
+ pScrn->currentMode = pScrn->modes;
- /* Set display resolution */
- xf86SetDpi(pScrn, 0, 0);
+ /* Set display resolution */
+ xf86SetDpi(pScrn, 0, 0);
- /* Load the required sub modules */
- if (!xf86LoadSubModule(pScrn, "fb")) {
- PreInitCleanup(pScrn);
- return FALSE;
- }
+ /* Load the required sub modules */
+ if (!xf86LoadSubModule(pScrn, "fb")) {
+ PreInitCleanup(pScrn);
+ return FALSE;
+ }
- /* Load the dri2 module if requested. */
- if (xf86ReturnOptValBool(pI830->Options, OPTION_DRI, FALSE) &&
- pI830->directRenderingType != DRI_DISABLED) {
- xf86LoadSubModule(pScrn, "dri2");
- }
+ /* Load the dri2 module if requested. */
+ if (xf86ReturnOptValBool(pI830->Options, OPTION_DRI, FALSE) &&
+ pI830->directRenderingType != DRI_DISABLED) {
+ xf86LoadSubModule(pScrn, "dri2");
+ }
- return TRUE;
+ return TRUE;
}
enum pipe {
- PIPE_A = 0,
- PIPE_B,
+ PIPE_A = 0,
+ PIPE_B,
};
/**
@@ -929,133 +930,129 @@ enum pipe {
* function is also responsible for marking the state as clobbered for DRI
* clients.
*/
-void
-IntelEmitInvarientState(ScrnInfoPtr pScrn)
+void IntelEmitInvarientState(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
-
- /* If we've emitted our state since the last clobber by another client,
- * skip it.
- */
- if (pI830->last_3d != LAST_3D_OTHER)
- return;
-
- if (!IS_I965G(pI830))
- {
- if (IS_I9XX(pI830))
- I915EmitInvarientState(pScrn);
- else
- I830EmitInvarientState(pScrn);
- }
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ /* If we've emitted our state since the last clobber by another client,
+ * skip it.
+ */
+ if (pI830->last_3d != LAST_3D_OTHER)
+ return;
+
+ if (!IS_I965G(pI830)) {
+ if (IS_I9XX(pI830))
+ I915EmitInvarientState(pScrn);
+ else
+ I830EmitInvarientState(pScrn);
+ }
}
static void
-I830BlockHandler(int i,
- pointer blockData, pointer pTimeout, pointer pReadmask)
+I830BlockHandler(int i, pointer blockData, pointer pTimeout, pointer pReadmask)
{
- ScreenPtr pScreen = screenInfo.screens[i];
- ScrnInfoPtr pScrn = xf86Screens[i];
- I830Ptr pI830 = I830PTR(pScrn);
-
- pScreen->BlockHandler = pI830->BlockHandler;
-
- (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask);
-
- pI830->BlockHandler = pScreen->BlockHandler;
- pScreen->BlockHandler = I830BlockHandler;
-
- if (pScrn->vtSema) {
- Bool flushed = FALSE;
- /* Emit a flush of the rendering cache, or on the 965 and beyond
- * rendering results may not hit the framebuffer until significantly
- * later.
- */
- if (pI830->need_mi_flush || pI830->batch_used)
- {
- flushed = TRUE;
- I830EmitFlush(pScrn);
- }
+ ScreenPtr pScreen = screenInfo.screens[i];
+ ScrnInfoPtr pScrn = xf86Screens[i];
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ pScreen->BlockHandler = pI830->BlockHandler;
+
+ (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask);
+
+ pI830->BlockHandler = pScreen->BlockHandler;
+ pScreen->BlockHandler = I830BlockHandler;
+
+ if (pScrn->vtSema) {
+ Bool flushed = FALSE;
+ /* Emit a flush of the rendering cache, or on the 965 and beyond
+ * rendering results may not hit the framebuffer until significantly
+ * later.
+ */
+ if (pI830->need_mi_flush || pI830->batch_used) {
+ flushed = TRUE;
+ I830EmitFlush(pScrn);
+ }
- /* Flush the batch, so that any rendering is executed in a timely
- * fashion.
- */
- intel_batch_flush(pScrn, flushed);
- drmCommandNone(pI830->drmSubFD, DRM_I915_GEM_THROTTLE);
+ /* Flush the batch, so that any rendering is executed in a timely
+ * fashion.
+ */
+ intel_batch_flush(pScrn, flushed);
+ drmCommandNone(pI830->drmSubFD, DRM_I915_GEM_THROTTLE);
- pI830->need_mi_flush = FALSE;
- }
+ pI830->need_mi_flush = FALSE;
+ }
- i830_uxa_block_handler (pScreen);
+ i830_uxa_block_handler(pScreen);
- I830VideoBlockHandler(i, blockData, pTimeout, pReadmask);
+ I830VideoBlockHandler(i, blockData, pTimeout, pReadmask);
}
-static void
-i830_fixup_mtrrs(ScrnInfoPtr pScrn)
+static void i830_fixup_mtrrs(ScrnInfoPtr pScrn)
{
#ifdef HAS_MTRR_SUPPORT
- I830Ptr pI830 = I830PTR(pScrn);
- int fd;
- struct mtrr_gentry gentry;
- struct mtrr_sentry sentry;
-
- if ( ( fd = open ("/proc/mtrr", O_RDONLY, 0) ) != -1 ) {
- for (gentry.regnum = 0; ioctl (fd, MTRRIOC_GET_ENTRY, &gentry) == 0;
- ++gentry.regnum) {
-
- if (gentry.size < 1) {
- /* DISABLED */
- continue;
- }
-
- /* Check the MTRR range is one we like and if not - remove it.
- * The Xserver common layer will then setup the right range
- * for us.
- */
- if (gentry.base == pI830->LinearAddr &&
- gentry.size < pI830->FbMapSize) {
-
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Removing bad MTRR range (base 0x%lx, size 0x%x)\n",
- gentry.base, gentry.size);
-
- sentry.base = gentry.base;
- sentry.size = gentry.size;
- sentry.type = gentry.type;
-
- if (ioctl (fd, MTRRIOC_DEL_ENTRY, &sentry) == -1) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Failed to remove bad MTRR range\n");
+ I830Ptr pI830 = I830PTR(pScrn);
+ int fd;
+ struct mtrr_gentry gentry;
+ struct mtrr_sentry sentry;
+
+ if ((fd = open("/proc/mtrr", O_RDONLY, 0)) != -1) {
+ for (gentry.regnum = 0;
+ ioctl(fd, MTRRIOC_GET_ENTRY, &gentry) == 0;
+ ++gentry.regnum) {
+
+ if (gentry.size < 1) {
+ /* DISABLED */
+ continue;
+ }
+
+ /* Check the MTRR range is one we like and if not - remove it.
+ * The Xserver common layer will then setup the right range
+ * for us.
+ */
+ if (gentry.base == pI830->LinearAddr &&
+ gentry.size < pI830->FbMapSize) {
+
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Removing bad MTRR range (base 0x%lx, size 0x%x)\n",
+ gentry.base, gentry.size);
+
+ sentry.base = gentry.base;
+ sentry.size = gentry.size;
+ sentry.type = gentry.type;
+
+ if (ioctl(fd, MTRRIOC_DEL_ENTRY, &sentry) == -1) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to remove bad MTRR range\n");
+ }
+ }
}
- }
+ close(fd);
}
- close(fd);
- }
#endif
}
-static Bool
-i830_try_memory_allocation(ScrnInfoPtr pScrn)
+static Bool i830_try_memory_allocation(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- Bool tiled = pI830->tiling;
+ I830Ptr pI830 = I830PTR(pScrn);
+ Bool tiled = pI830->tiling;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Attempting memory allocation with %stiled buffers.\n",
- tiled ? "" : "un");
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Attempting memory allocation with %stiled buffers.\n",
+ tiled ? "" : "un");
- if (!i830_allocate_2d_memory(pScrn))
- goto failed;
+ if (!i830_allocate_2d_memory(pScrn))
+ goto failed;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%siled allocation successful.\n",
- tiled ? "T" : "Unt");
- return TRUE;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%siled allocation successful.\n",
+ tiled ? "T" : "Unt");
+ return TRUE;
failed:
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%siled allocation failed.\n",
- tiled ? "T" : "Unt");
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%siled allocation failed.\n",
+ tiled ? "T" : "Unt");
+ return FALSE;
}
+
/*
* Try to allocate memory in several ways:
* 1) If direct rendering is enabled, try to allocate enough memory for tiled
@@ -1065,498 +1062,501 @@ failed:
* 3) And if all else fails, disable DRI and try just 2D allocations.
* 4) Give up and fail ScreenInit.
*/
-static Bool
-i830_memory_init(ScrnInfoPtr pScrn)
+static Bool i830_memory_init(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int savedDisplayWidth = pScrn->displayWidth;
- Bool tiled = FALSE;
-
- tiled = i830_tiled_width(pI830, &pScrn->displayWidth, pI830->cpp);
- /* Set up our video memory allocator for the chosen videoRam */
- if (!i830_allocator_init(pScrn, pScrn->videoRam * KB(1))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Couldn't initialize video memory allocator\n");
- PreInitCleanup(pScrn);
- return FALSE;
- }
-
- xf86DrvMsg(pScrn->scrnIndex,
- pI830->pEnt->device->videoRam ? X_CONFIG : X_DEFAULT,
- "VideoRam: %d KB\n", pScrn->videoRam);
+ I830Ptr pI830 = I830PTR(pScrn);
+ int savedDisplayWidth = pScrn->displayWidth;
+ Bool tiled = FALSE;
+
+ tiled = i830_tiled_width(pI830, &pScrn->displayWidth, pI830->cpp);
+ /* Set up our video memory allocator for the chosen videoRam */
+ if (!i830_allocator_init(pScrn, pScrn->videoRam * KB(1))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Couldn't initialize video memory allocator\n");
+ PreInitCleanup(pScrn);
+ return FALSE;
+ }
- /* Tiled first if we got a good displayWidth */
- if (tiled) {
- if (i830_try_memory_allocation(pScrn))
- return TRUE;
- else {
- i830_reset_allocations(pScrn);
- pI830->tiling = FALSE;
+ xf86DrvMsg(pScrn->scrnIndex,
+ pI830->pEnt->device->videoRam ? X_CONFIG : X_DEFAULT,
+ "VideoRam: %d KB\n", pScrn->videoRam);
+
+ /* Tiled first if we got a good displayWidth */
+ if (tiled) {
+ if (i830_try_memory_allocation(pScrn))
+ return TRUE;
+ else {
+ i830_reset_allocations(pScrn);
+ pI830->tiling = FALSE;
+ }
}
- }
- /* If tiling fails we have to disable FBC */
- pScrn->displayWidth = savedDisplayWidth;
+ /* If tiling fails we have to disable FBC */
+ pScrn->displayWidth = savedDisplayWidth;
- if (i830_try_memory_allocation(pScrn))
- return TRUE;
+ if (i830_try_memory_allocation(pScrn))
+ return TRUE;
- return FALSE;
+ return FALSE;
}
-void
-i830_init_bufmgr(ScrnInfoPtr pScrn)
+void i830_init_bufmgr(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int batch_size;
+ I830Ptr pI830 = I830PTR(pScrn);
+ int batch_size;
- if (pI830->bufmgr)
- return;
+ if (pI830->bufmgr)
+ return;
- batch_size = 4096 * 4;
+ batch_size = 4096 * 4;
- /* The 865 has issues with larger-than-page-sized batch buffers. */
- if (IS_I865G(pI830))
- batch_size = 4096;
+ /* The 865 has issues with larger-than-page-sized batch buffers. */
+ if (IS_I865G(pI830))
+ batch_size = 4096;
- pI830->bufmgr = intel_bufmgr_gem_init(pI830->drmSubFD, batch_size);
- intel_bufmgr_gem_enable_reuse(pI830->bufmgr);
+ pI830->bufmgr = intel_bufmgr_gem_init(pI830->drmSubFD, batch_size);
+ intel_bufmgr_gem_enable_reuse(pI830->bufmgr);
}
Bool i830_crtc_on(xf86CrtcPtr crtc)
{
- ScrnInfoPtr pScrn = crtc->scrn;
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- int i, active_outputs = 0;
-
- /* Kernel manages CRTC status based out output config */
- for (i = 0; i < xf86_config->num_output; i++) {
- xf86OutputPtr output = xf86_config->output[i];
- if (output->crtc == crtc &&
- drmmode_output_dpms_status(output) == DPMSModeOn)
- active_outputs++;
- }
-
- if (active_outputs)
- return TRUE;
- return FALSE;
+ ScrnInfoPtr pScrn = crtc->scrn;
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ int i, active_outputs = 0;
+
+ /* Kernel manages CRTC status based out output config */
+ for (i = 0; i < xf86_config->num_output; i++) {
+ xf86OutputPtr output = xf86_config->output[i];
+ if (output->crtc == crtc &&
+ drmmode_output_dpms_status(output) == DPMSModeOn)
+ active_outputs++;
+ }
+
+ if (active_outputs)
+ return TRUE;
+ return FALSE;
}
int i830_crtc_to_pipe(xf86CrtcPtr crtc)
{
- ScrnInfoPtr pScrn = crtc->scrn;
- I830Ptr pI830 = I830PTR(pScrn);
+ ScrnInfoPtr pScrn = crtc->scrn;
+ I830Ptr pI830 = I830PTR(pScrn);
- return drmmode_get_pipe_from_crtc_id(pI830->bufmgr, crtc) ;
+ return drmmode_get_pipe_from_crtc_id(pI830->bufmgr, crtc);
}
static Bool
I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];;
- I830Ptr pI830 = I830PTR(pScrn);;
- VisualPtr visual;
- MessageType from;
- struct pci_device *const device = pI830->PciInfo;
- int fb_bar = IS_I9XX(pI830) ? 2 : 0;
-
- pScrn->displayWidth = i830_pad_drawable_width(pScrn->virtualX, pI830->cpp);
-
- /*
- * The "VideoRam" config file parameter specifies the maximum amount of
- * memory that will be used/allocated. When not present, we allow the
- * driver to allocate as much memory as it wishes to satisfy its
- * allocations, but if agpgart support isn't available, it gets limited
- * to the amount of pre-allocated ("stolen") memory.
- *
- * Note that in using this value for allocator initialization, we're
- * limiting aperture allocation to the VideoRam option, rather than limiting
- * actual memory allocation, so alignment and things will cause less than
- * VideoRam to be actually used.
- */
- if (pI830->pEnt->device->videoRam == 0) {
- from = X_DEFAULT;
- pScrn->videoRam = pI830->FbMapSize / KB(1);
- } else {
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];;
+ I830Ptr pI830 = I830PTR(pScrn);;
+ VisualPtr visual;
+ MessageType from;
+ struct pci_device *const device = pI830->PciInfo;
+ int fb_bar = IS_I9XX(pI830) ? 2 : 0;
+
+ pScrn->displayWidth =
+ i830_pad_drawable_width(pScrn->virtualX, pI830->cpp);
+
+ /*
+ * The "VideoRam" config file parameter specifies the maximum amount of
+ * memory that will be used/allocated. When not present, we allow the
+ * driver to allocate as much memory as it wishes to satisfy its
+ * allocations, but if agpgart support isn't available, it gets limited
+ * to the amount of pre-allocated ("stolen") memory.
+ *
+ * Note that in using this value for allocator initialization, we're
+ * limiting aperture allocation to the VideoRam option, rather than limiting
+ * actual memory allocation, so alignment and things will cause less than
+ * VideoRam to be actually used.
+ */
+ if (pI830->pEnt->device->videoRam == 0) {
+ from = X_DEFAULT;
+ pScrn->videoRam = pI830->FbMapSize / KB(1);
+ } else {
#if 0
- from = X_CONFIG;
- pScrn->videoRam = pI830->pEnt->device->videoRam;
+ from = X_CONFIG;
+ pScrn->videoRam = pI830->pEnt->device->videoRam;
#else
- /* Disable VideoRam configuration, at least for now. Previously,
- * VideoRam was necessary to avoid overly low limits on allocated
- * memory, so users created larger, yet still small, fixed allocation
- * limits in their config files. Now, the driver wants to allocate more,
- * and the old intention of the VideoRam lines that had been entered is
- * obsolete.
- */
- from = X_DEFAULT;
- pScrn->videoRam = pI830->FbMapSize / KB(1);
-
- if (pScrn->videoRam != pI830->pEnt->device->videoRam) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "VideoRam configuration found, which is no longer "
- "recommended.\n");
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Continuing with default %dkB VideoRam instead of %d "
- "kB.\n",
- pScrn->videoRam, pI830->pEnt->device->videoRam);
- }
+ /* Disable VideoRam configuration, at least for now. Previously,
+ * VideoRam was necessary to avoid overly low limits on allocated
+ * memory, so users created larger, yet still small, fixed allocation
+ * limits in their config files. Now, the driver wants to allocate more,
+ * and the old intention of the VideoRam lines that had been entered is
+ * obsolete.
+ */
+ from = X_DEFAULT;
+ pScrn->videoRam = pI830->FbMapSize / KB(1);
+
+ if (pScrn->videoRam != pI830->pEnt->device->videoRam) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "VideoRam configuration found, which is no longer "
+ "recommended.\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Continuing with default %dkB VideoRam instead of %d "
+ "kB.\n",
+ pScrn->videoRam,
+ pI830->pEnt->device->videoRam);
+ }
#endif
- }
+ }
- pScrn->videoRam = device->regions[fb_bar].size / 1024;
+ pScrn->videoRam = device->regions[fb_bar].size / 1024;
#ifdef DRI2
- if (pI830->directRenderingType == DRI_NONE && I830DRI2ScreenInit(pScreen))
- pI830->directRenderingType = DRI_DRI2;
+ if (pI830->directRenderingType == DRI_NONE
+ && I830DRI2ScreenInit(pScreen))
+ pI830->directRenderingType = DRI_DRI2;
#endif
- /* Enable tiling by default */
- pI830->tiling = TRUE;
-
- /* Allow user override if they set a value */
- if (xf86IsOptionSet(pI830->Options, OPTION_TILING)) {
- if (xf86ReturnOptValBool(pI830->Options, OPTION_TILING, FALSE))
- pI830->tiling = TRUE;
- else
- pI830->tiling = FALSE;
- }
-
- /* SwapBuffers delays to avoid tearing */
- pI830->swapbuffers_wait = TRUE;
-
- /* Allow user override if they set a value */
- if (xf86IsOptionSet(pI830->Options, OPTION_SWAPBUFFERS_WAIT)) {
- if (xf86ReturnOptValBool(pI830->Options, OPTION_SWAPBUFFERS_WAIT, FALSE))
- pI830->swapbuffers_wait = TRUE;
- else
- pI830->swapbuffers_wait = FALSE;
- }
-
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Tiling %sabled\n", pI830->tiling ?
- "en" : "dis");
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "SwapBuffers wait %sabled\n",
- pI830->swapbuffers_wait ? "en" : "dis");
-
- pI830->last_3d = LAST_3D_OTHER;
- pI830->overlayOn = FALSE;
-
- /*
- * Set this so that the overlay allocation is factored in when
- * appropriate.
- */
- pI830->XvEnabled = TRUE;
-
- if (!i830_memory_init(pScrn)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Couldn't allocate video memory\n");
- return FALSE;
- }
-
- i830_fixup_mtrrs(pScrn);
-
- miClearVisualTypes();
- if (!miSetVisualTypes(pScrn->depth,
- miGetDefaultVisualMask(pScrn->depth),
- pScrn->rgbBits, pScrn->defaultVisual))
- return FALSE;
- if (!miSetPixmapDepths())
- return FALSE;
-
- DPRINTF(PFX, "assert( if(!I830EnterVT(scrnIndex, 0)) )\n");
-
- if (pScrn->virtualX > pScrn->displayWidth)
- pScrn->displayWidth = pScrn->virtualX;
-
- /* If the front buffer is not a BO, we need to
- * set the initial framebuffer pixmap to point at
- * it
- */
- pScrn->fbOffset = pI830->front_buffer->offset;
-
- DPRINTF(PFX, "assert( if(!fbScreenInit(pScreen, ...) )\n");
- if (!fbScreenInit(pScreen, NULL,
- pScrn->virtualX, pScrn->virtualY,
- pScrn->xDpi, pScrn->yDpi,
- pScrn->displayWidth, pScrn->bitsPerPixel))
- return FALSE;
-
- if (pScrn->bitsPerPixel > 8) {
- /* Fixup RGB ordering */
- visual = pScreen->visuals + pScreen->numVisuals;
- while (--visual >= pScreen->visuals) {
- if ((visual->class | DynamicClass) == DirectColor) {
- visual->offsetRed = pScrn->offset.red;
- visual->offsetGreen = pScrn->offset.green;
- visual->offsetBlue = pScrn->offset.blue;
- visual->redMask = pScrn->mask.red;
- visual->greenMask = pScrn->mask.green;
- visual->blueMask = pScrn->mask.blue;
- }
- }
- }
-
- fbPictureInit(pScreen, NULL, 0);
-
- xf86SetBlackWhitePixels(pScreen);
-
- if (!I830AccelInit(pScreen)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Hardware acceleration initialization failed\n");
- return FALSE;
- }
-
- if (IS_I965G(pI830))
- pI830->batch_flush_notify = i965_batch_flush_notify;
- else if (IS_I9XX(pI830))
- pI830->batch_flush_notify = i915_batch_flush_notify;
- else
- pI830->batch_flush_notify = i830_batch_flush_notify;
-
- miInitializeBackingStore(pScreen);
- xf86SetBackingStore(pScreen);
- xf86SetSilkenMouse(pScreen);
- miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
-
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Initializing HW Cursor\n");
-
- if (!xf86_cursors_init (pScreen, I810_CURSOR_X, I810_CURSOR_Y,
- (HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
- HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
- HARDWARE_CURSOR_INVERT_MASK |
- HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK |
- HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
- HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
- HARDWARE_CURSOR_UPDATE_UNHIDDEN |
- HARDWARE_CURSOR_ARGB))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Hardware cursor initialization failed\n");
- }
-
- /* Must force it before EnterVT, so we are in control of VT and
- * later memory should be bound when allocating, e.g rotate_mem */
- pScrn->vtSema = TRUE;
-
- if (!I830EnterVT(scrnIndex, 0))
- return FALSE;
-
- pI830->BlockHandler = pScreen->BlockHandler;
- pScreen->BlockHandler = I830BlockHandler;
-
- pScreen->SaveScreen = xf86SaveScreen;
- pI830->CloseScreen = pScreen->CloseScreen;
- pScreen->CloseScreen = I830CloseScreen;
- pI830->CreateScreenResources = pScreen->CreateScreenResources;
- pScreen->CreateScreenResources = i830CreateScreenResources;
-
- if (!xf86CrtcScreenInit (pScreen))
- return FALSE;
-
- DPRINTF(PFX, "assert( if(!miCreateDefColormap(pScreen)) )\n");
- if (!miCreateDefColormap(pScreen))
- return FALSE;
-
- DPRINTF(PFX, "assert( if(!xf86HandleColormaps(pScreen, ...)) )\n");
- if (!xf86HandleColormaps(pScreen, 256, 8, I830LoadPalette, NULL,
- CMAP_RELOAD_ON_MODE_SWITCH |
- CMAP_PALETTED_TRUECOLOR)) {
- return FALSE;
- }
-
- xf86DPMSInit(pScreen, xf86DPMSSet, 0);
+ /* Enable tiling by default */
+ pI830->tiling = TRUE;
+
+ /* Allow user override if they set a value */
+ if (xf86IsOptionSet(pI830->Options, OPTION_TILING)) {
+ if (xf86ReturnOptValBool(pI830->Options, OPTION_TILING, FALSE))
+ pI830->tiling = TRUE;
+ else
+ pI830->tiling = FALSE;
+ }
+
+ /* SwapBuffers delays to avoid tearing */
+ pI830->swapbuffers_wait = TRUE;
+
+ /* Allow user override if they set a value */
+ if (xf86IsOptionSet(pI830->Options, OPTION_SWAPBUFFERS_WAIT)) {
+ if (xf86ReturnOptValBool
+ (pI830->Options, OPTION_SWAPBUFFERS_WAIT, FALSE))
+ pI830->swapbuffers_wait = TRUE;
+ else
+ pI830->swapbuffers_wait = FALSE;
+ }
+
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Tiling %sabled\n",
+ pI830->tiling ? "en" : "dis");
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "SwapBuffers wait %sabled\n",
+ pI830->swapbuffers_wait ? "en" : "dis");
+
+ pI830->last_3d = LAST_3D_OTHER;
+ pI830->overlayOn = FALSE;
+
+ /*
+ * Set this so that the overlay allocation is factored in when
+ * appropriate.
+ */
+ pI830->XvEnabled = TRUE;
+
+ if (!i830_memory_init(pScrn)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Couldn't allocate video memory\n");
+ return FALSE;
+ }
+
+ i830_fixup_mtrrs(pScrn);
+
+ miClearVisualTypes();
+ if (!miSetVisualTypes(pScrn->depth,
+ miGetDefaultVisualMask(pScrn->depth),
+ pScrn->rgbBits, pScrn->defaultVisual))
+ return FALSE;
+ if (!miSetPixmapDepths())
+ return FALSE;
+
+ DPRINTF(PFX, "assert( if(!I830EnterVT(scrnIndex, 0)) )\n");
+
+ if (pScrn->virtualX > pScrn->displayWidth)
+ pScrn->displayWidth = pScrn->virtualX;
+
+ /* If the front buffer is not a BO, we need to
+ * set the initial framebuffer pixmap to point at
+ * it
+ */
+ pScrn->fbOffset = pI830->front_buffer->offset;
+
+ DPRINTF(PFX, "assert( if(!fbScreenInit(pScreen, ...) )\n");
+ if (!fbScreenInit(pScreen, NULL,
+ pScrn->virtualX, pScrn->virtualY,
+ pScrn->xDpi, pScrn->yDpi,
+ pScrn->displayWidth, pScrn->bitsPerPixel))
+ return FALSE;
+
+ if (pScrn->bitsPerPixel > 8) {
+ /* Fixup RGB ordering */
+ visual = pScreen->visuals + pScreen->numVisuals;
+ while (--visual >= pScreen->visuals) {
+ if ((visual->class | DynamicClass) == DirectColor) {
+ visual->offsetRed = pScrn->offset.red;
+ visual->offsetGreen = pScrn->offset.green;
+ visual->offsetBlue = pScrn->offset.blue;
+ visual->redMask = pScrn->mask.red;
+ visual->greenMask = pScrn->mask.green;
+ visual->blueMask = pScrn->mask.blue;
+ }
+ }
+ }
+
+ fbPictureInit(pScreen, NULL, 0);
+
+ xf86SetBlackWhitePixels(pScreen);
+
+ if (!I830AccelInit(pScreen)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Hardware acceleration initialization failed\n");
+ return FALSE;
+ }
+
+ if (IS_I965G(pI830))
+ pI830->batch_flush_notify = i965_batch_flush_notify;
+ else if (IS_I9XX(pI830))
+ pI830->batch_flush_notify = i915_batch_flush_notify;
+ else
+ pI830->batch_flush_notify = i830_batch_flush_notify;
+
+ miInitializeBackingStore(pScreen);
+ xf86SetBackingStore(pScreen);
+ xf86SetSilkenMouse(pScreen);
+ miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
+
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Initializing HW Cursor\n");
+
+ if (!xf86_cursors_init(pScreen, I810_CURSOR_X, I810_CURSOR_Y,
+ (HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
+ HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
+ HARDWARE_CURSOR_INVERT_MASK |
+ HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK |
+ HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
+ HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
+ HARDWARE_CURSOR_UPDATE_UNHIDDEN |
+ HARDWARE_CURSOR_ARGB))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Hardware cursor initialization failed\n");
+ }
+
+ /* Must force it before EnterVT, so we are in control of VT and
+ * later memory should be bound when allocating, e.g rotate_mem */
+ pScrn->vtSema = TRUE;
+
+ if (!I830EnterVT(scrnIndex, 0))
+ return FALSE;
+
+ pI830->BlockHandler = pScreen->BlockHandler;
+ pScreen->BlockHandler = I830BlockHandler;
+
+ pScreen->SaveScreen = xf86SaveScreen;
+ pI830->CloseScreen = pScreen->CloseScreen;
+ pScreen->CloseScreen = I830CloseScreen;
+ pI830->CreateScreenResources = pScreen->CreateScreenResources;
+ pScreen->CreateScreenResources = i830CreateScreenResources;
+
+ if (!xf86CrtcScreenInit(pScreen))
+ return FALSE;
+
+ DPRINTF(PFX, "assert( if(!miCreateDefColormap(pScreen)) )\n");
+ if (!miCreateDefColormap(pScreen))
+ return FALSE;
+
+ DPRINTF(PFX, "assert( if(!xf86HandleColormaps(pScreen, ...)) )\n");
+ if (!xf86HandleColormaps(pScreen, 256, 8, I830LoadPalette, NULL,
+ CMAP_RELOAD_ON_MODE_SWITCH |
+ CMAP_PALETTED_TRUECOLOR)) {
+ return FALSE;
+ }
+
+ xf86DPMSInit(pScreen, xf86DPMSSet, 0);
#ifdef INTEL_XVMC
- pI830->XvMCEnabled = FALSE;
- from = ((pI830->directRenderingType == DRI_DRI2) &&
- xf86GetOptValBool(pI830->Options, OPTION_XVMC,
- &pI830->XvMCEnabled) ? X_CONFIG : X_DEFAULT);
- xf86DrvMsg(pScrn->scrnIndex, from, "Intel XvMC decoder %sabled\n",
- pI830->XvMCEnabled ? "en" : "dis");
+ pI830->XvMCEnabled = FALSE;
+ from = ((pI830->directRenderingType == DRI_DRI2) &&
+ xf86GetOptValBool(pI830->Options, OPTION_XVMC,
+ &pI830->XvMCEnabled) ? X_CONFIG : X_DEFAULT);
+ xf86DrvMsg(pScrn->scrnIndex, from, "Intel XvMC decoder %sabled\n",
+ pI830->XvMCEnabled ? "en" : "dis");
#endif
- /* Init video */
- if (pI830->XvEnabled)
- I830InitVideo(pScreen);
+ /* Init video */
+ if (pI830->XvEnabled)
+ I830InitVideo(pScreen);
- /* Setup 3D engine, needed for rotation too */
- IntelEmitInvarientState(pScrn);
+ /* Setup 3D engine, needed for rotation too */
+ IntelEmitInvarientState(pScrn);
#if defined(DRI2)
- switch (pI830->directRenderingType) {
- case DRI_DRI2:
- pI830->directRenderingOpen = TRUE;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering: DRI2 Enabled\n");
- break;
- case DRI_DISABLED:
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering: Disabled\n");
- break;
- case DRI_NONE:
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering: Failed\n");
- break;
- }
+ switch (pI830->directRenderingType) {
+ case DRI_DRI2:
+ pI830->directRenderingOpen = TRUE;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "direct rendering: DRI2 Enabled\n");
+ break;
+ case DRI_DISABLED:
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "direct rendering: Disabled\n");
+ break;
+ case DRI_NONE:
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "direct rendering: Failed\n");
+ break;
+ }
#else
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering: Not available\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "direct rendering: Not available\n");
#endif
- if (serverGeneration == 1)
- xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options);
+ if (serverGeneration == 1)
+ xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options);
- pI830->suspended = FALSE;
+ pI830->suspended = FALSE;
- return TRUE;
+ return TRUE;
}
-static void
-i830AdjustFrame(int scrnIndex, int x, int y, int flags)
+static void i830AdjustFrame(int scrnIndex, int x, int y, int flags)
{
}
-static void
-I830FreeScreen(int scrnIndex, int flags)
+static void I830FreeScreen(int scrnIndex, int flags)
{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
#ifdef INTEL_XVMC
- I830Ptr pI830 = I830PTR(pScrn);
- if (pI830 && pI830->XvMCEnabled)
- intel_xvmc_finish(xf86Screens[scrnIndex]);
+ I830Ptr pI830 = I830PTR(pScrn);
+ if (pI830 && pI830->XvMCEnabled)
+ intel_xvmc_finish(xf86Screens[scrnIndex]);
#endif
- i830_close_drm_master(pScrn);
+ i830_close_drm_master(pScrn);
- I830FreeRec(xf86Screens[scrnIndex]);
- if (xf86LoaderCheckSymbol("vgaHWFreeHWRec"))
- vgaHWFreeHWRec(xf86Screens[scrnIndex]);
+ I830FreeRec(xf86Screens[scrnIndex]);
+ if (xf86LoaderCheckSymbol("vgaHWFreeHWRec"))
+ vgaHWFreeHWRec(xf86Screens[scrnIndex]);
}
-static void
-I830LeaveVT(int scrnIndex, int flags)
+static void I830LeaveVT(int scrnIndex, int flags)
{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- I830Ptr pI830 = I830PTR(pScrn);
- int ret;
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ I830Ptr pI830 = I830PTR(pScrn);
+ int ret;
- DPRINTF(PFX, "Leave VT\n");
+ DPRINTF(PFX, "Leave VT\n");
- xf86RotateFreeShadow(pScrn);
+ xf86RotateFreeShadow(pScrn);
- xf86_hide_cursors (pScrn);
+ xf86_hide_cursors(pScrn);
- I830Sync(pScrn);
+ I830Sync(pScrn);
- intel_batch_teardown(pScrn);
+ intel_batch_teardown(pScrn);
- if (IS_I965G(pI830))
- gen4_render_state_cleanup(pScrn);
+ if (IS_I965G(pI830))
+ gen4_render_state_cleanup(pScrn);
- ret = drmDropMaster(pI830->drmSubFD);
- if (ret)
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "drmDropMaster failed: %s\n", strerror(errno));
+ ret = drmDropMaster(pI830->drmSubFD);
+ if (ret)
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "drmDropMaster failed: %s\n", strerror(errno));
}
/*
* This gets called when gaining control of the VT, and from ScreenInit().
*/
-static Bool
-I830EnterVT(int scrnIndex, int flags)
+static Bool I830EnterVT(int scrnIndex, int flags)
{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- I830Ptr pI830 = I830PTR(pScrn);
- int ret;
-
- DPRINTF(PFX, "Enter VT\n");
-
- ret = drmSetMaster(pI830->drmSubFD);
- if (ret) {
- if (errno == EINVAL) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "drmSetMaster failed: 2.6.29 or newer kernel required for "
- "multi-server DRI\n");
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "drmSetMaster failed: %s\n", strerror(errno));
- }
- }
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ I830Ptr pI830 = I830PTR(pScrn);
+ int ret;
+
+ DPRINTF(PFX, "Enter VT\n");
+
+ ret = drmSetMaster(pI830->drmSubFD);
+ if (ret) {
+ if (errno == EINVAL) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "drmSetMaster failed: 2.6.29 or newer kernel required for "
+ "multi-server DRI\n");
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "drmSetMaster failed: %s\n",
+ strerror(errno));
+ }
+ }
- if (!i830_bind_all_memory(pScrn))
- return FALSE;
+ if (!i830_bind_all_memory(pScrn))
+ return FALSE;
- i830_describe_allocations(pScrn, 1, "");
+ i830_describe_allocations(pScrn, 1, "");
- intel_batch_init(pScrn);
+ intel_batch_init(pScrn);
- if (IS_I965G(pI830))
- gen4_render_state_init(pScrn);
+ if (IS_I965G(pI830))
+ gen4_render_state_init(pScrn);
- if (!xf86SetDesiredModes (pScrn))
- return FALSE;
+ if (!xf86SetDesiredModes(pScrn))
+ return FALSE;
- /* Mark 3D state as being clobbered and setup the basics */
- pI830->last_3d = LAST_3D_OTHER;
- IntelEmitInvarientState(pScrn);
+ /* Mark 3D state as being clobbered and setup the basics */
+ pI830->last_3d = LAST_3D_OTHER;
+ IntelEmitInvarientState(pScrn);
- return TRUE;
+ return TRUE;
}
-static Bool
-I830SwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
+static Bool I830SwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- return xf86SetSingleMode (pScrn, mode, RR_Rotate_0);
+ return xf86SetSingleMode(pScrn, mode, RR_Rotate_0);
}
-static Bool
-I830CloseScreen(int scrnIndex, ScreenPtr pScreen)
+static Bool I830CloseScreen(int scrnIndex, ScreenPtr pScreen)
{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- I830Ptr pI830 = I830PTR(pScrn);
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ I830Ptr pI830 = I830PTR(pScrn);
- if (pScrn->vtSema == TRUE) {
- I830LeaveVT(scrnIndex, 0);
- }
+ if (pScrn->vtSema == TRUE) {
+ I830LeaveVT(scrnIndex, 0);
+ }
- if (pI830->uxa_driver) {
- uxa_driver_fini (pScreen);
- xfree (pI830->uxa_driver);
- pI830->uxa_driver = NULL;
- }
- if (pI830->front_buffer) {
- i830_set_pixmap_bo(pScreen->GetScreenPixmap(pScreen), NULL);
- i830_free_memory(pScrn, pI830->front_buffer);
- pI830->front_buffer = NULL;
- }
+ if (pI830->uxa_driver) {
+ uxa_driver_fini(pScreen);
+ xfree(pI830->uxa_driver);
+ pI830->uxa_driver = NULL;
+ }
+ if (pI830->front_buffer) {
+ i830_set_pixmap_bo(pScreen->GetScreenPixmap(pScreen), NULL);
+ i830_free_memory(pScrn, pI830->front_buffer);
+ pI830->front_buffer = NULL;
+ }
- xf86_cursors_fini (pScreen);
+ xf86_cursors_fini(pScreen);
- i830_allocator_fini(pScrn);
+ i830_allocator_fini(pScrn);
- i965_free_video(pScrn);
+ i965_free_video(pScrn);
- pScreen->CloseScreen = pI830->CloseScreen;
- (*pScreen->CloseScreen) (scrnIndex, pScreen);
+ pScreen->CloseScreen = pI830->CloseScreen;
+ (*pScreen->CloseScreen) (scrnIndex, pScreen);
- if (pI830->directRenderingOpen && pI830->directRenderingType == DRI_DRI2) {
- pI830->directRenderingOpen = FALSE;
- I830DRI2CloseScreen(pScreen);
- }
+ if (pI830->directRenderingOpen
+ && pI830->directRenderingType == DRI_DRI2) {
+ pI830->directRenderingOpen = FALSE;
+ I830DRI2CloseScreen(pScreen);
+ }
- xf86GARTCloseScreen(scrnIndex);
+ xf86GARTCloseScreen(scrnIndex);
- pScrn->vtSema = FALSE;
- return TRUE;
+ pScrn->vtSema = FALSE;
+ return TRUE;
}
static ModeStatus
I830ValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
{
- if (mode->Flags & V_INTERLACE) {
- if (verbose) {
- xf86DrvMsg(scrnIndex, X_PROBED,
- "Removing interlaced mode \"%s\"\n", mode->name);
- }
- return MODE_BAD;
- }
- return MODE_OK;
+ if (mode->Flags & V_INTERLACE) {
+ if (verbose) {
+ xf86DrvMsg(scrnIndex, X_PROBED,
+ "Removing interlaced mode \"%s\"\n",
+ mode->name);
+ }
+ return MODE_BAD;
+ }
+ return MODE_OK;
}
#ifndef SUSPEND_SLEEP
@@ -1571,88 +1571,86 @@ I830ValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
* DoApmEvent() in common/xf86PM.c, including if we want to see events other
* than suspend/resume.
*/
-static Bool
-I830PMEvent(int scrnIndex, pmEvent event, Bool undo)
+static Bool I830PMEvent(int scrnIndex, pmEvent event, Bool undo)
{
- ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
- I830Ptr pI830 = I830PTR(pScrn);
-
- DPRINTF(PFX, "Enter VT, event %d, undo: %s\n", event, BOOLTOSTRING(undo));
-
- switch(event) {
- case XF86_APM_SYS_SUSPEND:
- case XF86_APM_CRITICAL_SUSPEND: /*do we want to delay a critical suspend?*/
- case XF86_APM_USER_SUSPEND:
- case XF86_APM_SYS_STANDBY:
- case XF86_APM_USER_STANDBY:
- if (!undo && !pI830->suspended) {
- pScrn->LeaveVT(scrnIndex, 0);
- pI830->suspended = TRUE;
- sleep(SUSPEND_SLEEP);
- } else if (undo && pI830->suspended) {
- sleep(RESUME_SLEEP);
- pScrn->EnterVT(scrnIndex, 0);
- pI830->suspended = FALSE;
- }
- break;
- case XF86_APM_STANDBY_RESUME:
- case XF86_APM_NORMAL_RESUME:
- case XF86_APM_CRITICAL_RESUME:
- if (pI830->suspended) {
- sleep(RESUME_SLEEP);
- pScrn->EnterVT(scrnIndex, 0);
- pI830->suspended = FALSE;
- /*
- * Turn the screen saver off when resuming. This seems to be
- * needed to stop xscreensaver kicking in (when used).
- *
- * XXX DoApmEvent() should probably call this just like
- * xf86VTSwitch() does. Maybe do it here only in 4.2
- * compatibility mode.
- */
- SaveScreens(SCREEN_SAVER_FORCER, ScreenSaverReset);
- }
- break;
- /* This is currently used for ACPI */
- case XF86_APM_CAPABILITY_CHANGED:
- ErrorF("I830PMEvent: Capability change\n");
-
- SaveScreens(SCREEN_SAVER_FORCER, ScreenSaverReset);
-
- break;
- default:
- ErrorF("I830PMEvent: received APM event %d\n", event);
- }
- return TRUE;
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ DPRINTF(PFX, "Enter VT, event %d, undo: %s\n", event,
+ BOOLTOSTRING(undo));
+
+ switch (event) {
+ case XF86_APM_SYS_SUSPEND:
+ case XF86_APM_CRITICAL_SUSPEND: /*do we want to delay a critical suspend? */
+ case XF86_APM_USER_SUSPEND:
+ case XF86_APM_SYS_STANDBY:
+ case XF86_APM_USER_STANDBY:
+ if (!undo && !pI830->suspended) {
+ pScrn->LeaveVT(scrnIndex, 0);
+ pI830->suspended = TRUE;
+ sleep(SUSPEND_SLEEP);
+ } else if (undo && pI830->suspended) {
+ sleep(RESUME_SLEEP);
+ pScrn->EnterVT(scrnIndex, 0);
+ pI830->suspended = FALSE;
+ }
+ break;
+ case XF86_APM_STANDBY_RESUME:
+ case XF86_APM_NORMAL_RESUME:
+ case XF86_APM_CRITICAL_RESUME:
+ if (pI830->suspended) {
+ sleep(RESUME_SLEEP);
+ pScrn->EnterVT(scrnIndex, 0);
+ pI830->suspended = FALSE;
+ /*
+ * Turn the screen saver off when resuming. This seems to be
+ * needed to stop xscreensaver kicking in (when used).
+ *
+ * XXX DoApmEvent() should probably call this just like
+ * xf86VTSwitch() does. Maybe do it here only in 4.2
+ * compatibility mode.
+ */
+ SaveScreens(SCREEN_SAVER_FORCER, ScreenSaverReset);
+ }
+ break;
+ /* This is currently used for ACPI */
+ case XF86_APM_CAPABILITY_CHANGED:
+ ErrorF("I830PMEvent: Capability change\n");
+
+ SaveScreens(SCREEN_SAVER_FORCER, ScreenSaverReset);
+
+ break;
+ default:
+ ErrorF("I830PMEvent: received APM event %d\n", event);
+ }
+ return TRUE;
}
-xf86CrtcPtr
-i830_pipe_to_crtc(ScrnInfoPtr pScrn, int pipe)
+xf86CrtcPtr i830_pipe_to_crtc(ScrnInfoPtr pScrn, int pipe)
{
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (pScrn);
- int c;
-
- for (c = 0; c < config->num_crtc; c++) {
- xf86CrtcPtr crtc = config->crtc[c];
- I830CrtcPrivatePtr intel_crtc = crtc->driver_private;
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ int c;
- if (intel_crtc->pipe == pipe)
- return crtc;
- }
+ for (c = 0; c < config->num_crtc; c++) {
+ xf86CrtcPtr crtc = config->crtc[c];
+ I830CrtcPrivatePtr intel_crtc = crtc->driver_private;
- return NULL;
-}
+ if (intel_crtc->pipe == pipe)
+ return crtc;
+ }
-void
-I830InitpScrn(ScrnInfoPtr pScrn)
+ return NULL;
+}
+
+void I830InitpScrn(ScrnInfoPtr pScrn)
{
- pScrn->PreInit = I830PreInit;
- pScrn->ScreenInit = I830ScreenInit;
- pScrn->SwitchMode = I830SwitchMode;
- pScrn->AdjustFrame = i830AdjustFrame;
- pScrn->EnterVT = I830EnterVT;
- pScrn->LeaveVT = I830LeaveVT;
- pScrn->FreeScreen = I830FreeScreen;
- pScrn->ValidMode = I830ValidMode;
- pScrn->PMEvent = I830PMEvent;
+ pScrn->PreInit = I830PreInit;
+ pScrn->ScreenInit = I830ScreenInit;
+ pScrn->SwitchMode = I830SwitchMode;
+ pScrn->AdjustFrame = i830AdjustFrame;
+ pScrn->EnterVT = I830EnterVT;
+ pScrn->LeaveVT = I830LeaveVT;
+ pScrn->FreeScreen = I830FreeScreen;
+ pScrn->ValidMode = I830ValidMode;
+ pScrn->PMEvent = I830PMEvent;
}
diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index 3aa1c987..896cd94b 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -37,141 +37,141 @@ struct intel_xvmc_driver *xvmc_driver;
/* set global current driver for xvmc */
static Bool intel_xvmc_set_driver(struct intel_xvmc_driver *d)
{
- if (xvmc_driver) {
- ErrorF("XvMC driver already set!\n");
- return FALSE;
- } else
- xvmc_driver = d;
- return TRUE;
+ if (xvmc_driver) {
+ ErrorF("XvMC driver already set!\n");
+ return FALSE;
+ } else
+ xvmc_driver = d;
+ return TRUE;
}
/* check chip type and load xvmc driver */
/* This must be first called! */
Bool intel_xvmc_probe(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- Bool ret = FALSE;
-
- if (!pI830->XvMCEnabled)
- return FALSE;
-
- /* Needs KMS support. */
- if (IS_I915G(pI830) || IS_I915GM(pI830))
- return FALSE;
-
- if (IS_I9XX(pI830)) {
- if (IS_I915(pI830))
- ret = intel_xvmc_set_driver(&i915_xvmc_driver);
- else if (IS_G4X(pI830) || IS_IGDNG(pI830))
- ret = intel_xvmc_set_driver(&vld_xvmc_driver);
- else
- ret = intel_xvmc_set_driver(&i965_xvmc_driver);
- } else {
- ErrorF("Your chipset doesn't support XvMC.\n");
- return FALSE;
- }
- return TRUE;
+ I830Ptr pI830 = I830PTR(pScrn);
+ Bool ret = FALSE;
+
+ if (!pI830->XvMCEnabled)
+ return FALSE;
+
+ /* Needs KMS support. */
+ if (IS_I915G(pI830) || IS_I915GM(pI830))
+ return FALSE;
+
+ if (IS_I9XX(pI830)) {
+ if (IS_I915(pI830))
+ ret = intel_xvmc_set_driver(&i915_xvmc_driver);
+ else if (IS_G4X(pI830) || IS_IGDNG(pI830))
+ ret = intel_xvmc_set_driver(&vld_xvmc_driver);
+ else
+ ret = intel_xvmc_set_driver(&i965_xvmc_driver);
+ } else {
+ ErrorF("Your chipset doesn't support XvMC.\n");
+ return FALSE;
+ }
+ return TRUE;
}
void intel_xvmc_finish(ScrnInfoPtr pScrn)
{
- if (!xvmc_driver)
- return;
- (*xvmc_driver->fini)(pScrn);
+ if (!xvmc_driver)
+ return;
+ (*xvmc_driver->fini) (pScrn);
}
Bool intel_xvmc_driver_init(ScreenPtr pScreen, XF86VideoAdaptorPtr xv_adaptor)
{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- struct drm_i915_setparam sp;
- int ret;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ struct drm_i915_setparam sp;
+ int ret;
+
+ if (!xvmc_driver) {
+ ErrorF("Failed to probe XvMC driver.\n");
+ return FALSE;
+ }
+
+ if (!(*xvmc_driver->init) (pScrn, xv_adaptor)) {
+ ErrorF("XvMC driver initialize failed.\n");
+ return FALSE;
+ }
+
+ /* Currently XvMC uses batchbuffer */
+ sp.param = I915_SETPARAM_ALLOW_BATCHBUFFER;
+ sp.value = 1;
+ ret = drmCommandWrite(pI830->drmSubFD, DRM_I915_SETPARAM,
+ &sp, sizeof(sp));
+ if (ret == 0)
+ return TRUE;
- if (!xvmc_driver) {
- ErrorF("Failed to probe XvMC driver.\n");
return FALSE;
- }
-
- if (!(*xvmc_driver->init)(pScrn, xv_adaptor)) {
- ErrorF("XvMC driver initialize failed.\n");
- return FALSE;
- }
-
- /* Currently XvMC uses batchbuffer */
- sp.param = I915_SETPARAM_ALLOW_BATCHBUFFER;
- sp.value = 1;
- ret = drmCommandWrite(pI830->drmSubFD, DRM_I915_SETPARAM,
- &sp, sizeof(sp));
- if (ret == 0)
- return TRUE;
-
- return FALSE;
}
Bool intel_xvmc_screen_init(ScreenPtr pScreen)
{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- char buf[64];
-
- if (!xvmc_driver)
- return FALSE;
-
- if (xf86XvMCScreenInit(pScreen, 1, &xvmc_driver->adaptor)) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "[XvMC] %s driver initialized.\n",
- xvmc_driver->name);
- } else {
- intel_xvmc_finish(pScrn);
- pI830->XvMCEnabled = FALSE;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "[XvMC] Failed to initialize XvMC.\n");
- return FALSE;
- }
-
- sprintf(buf, "pci:%04x:%02x:%02x.%d",
- pI830->PciInfo->domain,
- pI830->PciInfo->bus,
- pI830->PciInfo->dev,
- pI830->PciInfo->func);
-
- xf86XvMCRegisterDRInfo(pScreen, INTEL_XVMC_LIBNAME,
- buf,
- INTEL_XVMC_MAJOR, INTEL_XVMC_MINOR, INTEL_XVMC_PATCHLEVEL);
- return TRUE;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ char buf[64];
+
+ if (!xvmc_driver)
+ return FALSE;
+
+ if (xf86XvMCScreenInit(pScreen, 1, &xvmc_driver->adaptor)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "[XvMC] %s driver initialized.\n",
+ xvmc_driver->name);
+ } else {
+ intel_xvmc_finish(pScrn);
+ pI830->XvMCEnabled = FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "[XvMC] Failed to initialize XvMC.\n");
+ return FALSE;
+ }
+
+ sprintf(buf, "pci:%04x:%02x:%02x.%d",
+ pI830->PciInfo->domain,
+ pI830->PciInfo->bus, pI830->PciInfo->dev, pI830->PciInfo->func);
+
+ xf86XvMCRegisterDRInfo(pScreen, INTEL_XVMC_LIBNAME,
+ buf,
+ INTEL_XVMC_MAJOR, INTEL_XVMC_MINOR,
+ INTEL_XVMC_PATCHLEVEL);
+ return TRUE;
}
Bool intel_xvmc_init_batch(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int size = KB(64);
-
- if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC] batch buffer",
- &(xvmc_driver->batch), size,
- ALIGN_BOTH_ENDS))
- return FALSE;
-
- if (drmAddMap(pI830->drmSubFD,
- (drm_handle_t)(xvmc_driver->batch->offset+pI830->LinearAddr),
- xvmc_driver->batch->size, DRM_AGP, 0,
- &xvmc_driver->batch_handle) < 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] drmAddMap(batchbuffer_handle) failed!\n");
- return FALSE;
- }
- return TRUE;
+ I830Ptr pI830 = I830PTR(pScrn);
+ int size = KB(64);
+
+ if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC] batch buffer",
+ &(xvmc_driver->batch), size,
+ ALIGN_BOTH_ENDS))
+ return FALSE;
+
+ if (drmAddMap(pI830->drmSubFD,
+ (drm_handle_t) (xvmc_driver->batch->offset +
+ pI830->LinearAddr),
+ xvmc_driver->batch->size, DRM_AGP, 0,
+ &xvmc_driver->batch_handle) < 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[drm] drmAddMap(batchbuffer_handle) failed!\n");
+ return FALSE;
+ }
+ return TRUE;
}
void intel_xvmc_fini_batch(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
-
- if (xvmc_driver->batch_handle) {
- drmRmMap(pI830->drmSubFD, xvmc_driver->batch_handle);
- xvmc_driver->batch_handle = 0;
- }
- if (xvmc_driver->batch) {
- i830_free_xvmc_buffer(pScrn, xvmc_driver->batch);
- xvmc_driver->batch = NULL;
- }
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ if (xvmc_driver->batch_handle) {
+ drmRmMap(pI830->drmSubFD, xvmc_driver->batch_handle);
+ xvmc_driver->batch_handle = 0;
+ }
+ if (xvmc_driver->batch) {
+ i830_free_xvmc_buffer(pScrn, xvmc_driver->batch);
+ xvmc_driver->batch = NULL;
+ }
}
diff --git a/src/i830_hwmc.h b/src/i830_hwmc.h
index 7db6a86a..0b512b4e 100644
--- a/src/i830_hwmc.h
+++ b/src/i830_hwmc.h
@@ -49,52 +49,51 @@
/* supported surface types */
enum {
- SURFACE_TYPE_MPEG2_MPML = FOURCC_XVMC, /* mpeg2 MP@ML */
- SURFACE_TYPE_MPEG1_MPML, /* mpeg1 MP@ML */
- SURFACE_TYPE_MAX
+ SURFACE_TYPE_MPEG2_MPML = FOURCC_XVMC, /* mpeg2 MP@ML */
+ SURFACE_TYPE_MPEG1_MPML, /* mpeg1 MP@ML */
+ SURFACE_TYPE_MAX
};
/* common header for context private */
-struct hwmc_buffer
-{
- drm_handle_t handle;
- unsigned long offset;
- unsigned long size;
- unsigned long bus_addr;
+struct hwmc_buffer {
+ drm_handle_t handle;
+ unsigned long offset;
+ unsigned long size;
+ unsigned long bus_addr;
};
struct _intel_xvmc_common {
- unsigned int type;
- struct hwmc_buffer batchbuffer;
- unsigned int kernel_exec_fencing:1;
+ unsigned int type;
+ struct hwmc_buffer batchbuffer;
+ unsigned int kernel_exec_fencing:1;
};
/* Intel private XvMC command to DDX driver */
struct intel_xvmc_command {
- unsigned int command;
- unsigned int ctxNo;
- unsigned int srfNo;
- unsigned int subPicNo;
- unsigned int flags;
- unsigned int real_id;
- uint32_t handle;
- unsigned int pad[5];
+ unsigned int command;
+ unsigned int ctxNo;
+ unsigned int srfNo;
+ unsigned int subPicNo;
+ unsigned int flags;
+ unsigned int real_id;
+ uint32_t handle;
+ unsigned int pad[5];
};
#ifdef _INTEL_XVMC_SERVER_
#include <xf86xvmc.h>
struct intel_xvmc_driver {
- char *name;
- XF86MCAdaptorPtr adaptor;
- unsigned int flag;
- i830_memory *batch;
- drm_handle_t batch_handle;
+ char *name;
+ XF86MCAdaptorPtr adaptor;
+ unsigned int flag;
+ i830_memory *batch;
+ drm_handle_t batch_handle;
- /* more items for xvmv surface manage? */
- Bool (*init)(ScrnInfoPtr, XF86VideoAdaptorPtr);
- void (*fini)(ScrnInfoPtr);
- void* devPrivate;
+ /* more items for xvmv surface manage? */
+ Bool(*init) (ScrnInfoPtr, XF86VideoAdaptorPtr);
+ void (*fini) (ScrnInfoPtr);
+ void *devPrivate;
};
extern struct intel_xvmc_driver *xvmc_driver;
@@ -106,7 +105,7 @@ extern Bool intel_xvmc_probe(ScrnInfoPtr);
extern Bool intel_xvmc_driver_init(ScreenPtr, XF86VideoAdaptorPtr);
extern Bool intel_xvmc_screen_init(ScreenPtr);
extern void intel_xvmc_finish(ScrnInfoPtr);
-extern int intel_xvmc_put_image_size(ScrnInfoPtr);
+extern int intel_xvmc_put_image_size(ScrnInfoPtr);
extern Bool intel_xvmc_init_batch(ScrnInfoPtr);
extern void intel_xvmc_fini_batch(ScrnInfoPtr);
#endif
diff --git a/src/i830_memory.c b/src/i830_memory.c
index 33b1e31b..83fee898 100644
--- a/src/i830_memory.c
+++ b/src/i830_memory.c
@@ -94,29 +94,27 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
/**
* Returns the fence size for a tiled area of the given size.
*/
-unsigned long
-i830_get_fence_size(I830Ptr pI830, unsigned long size)
+unsigned long i830_get_fence_size(I830Ptr pI830, unsigned long size)
{
- unsigned long i;
- unsigned long start;
-
- if (IS_I965G(pI830)) {
- /* The 965 can have fences at any page boundary. */
- return ALIGN(size, GTT_PAGE_SIZE);
- } else {
- /* Align the size to a power of two greater than the smallest fence
- * size.
- */
- if (IS_I9XX(pI830))
- start = MB(1);
- else
- start = KB(512);
+ unsigned long i;
+ unsigned long start;
+
+ if (IS_I965G(pI830)) {
+ /* The 965 can have fences at any page boundary. */
+ return ALIGN(size, GTT_PAGE_SIZE);
+ } else {
+ /* Align the size to a power of two greater than the smallest fence
+ * size.
+ */
+ if (IS_I9XX(pI830))
+ start = MB(1);
+ else
+ start = KB(512);
- for (i = start; i < size; i <<= 1)
- ;
+ for (i = start; i < size; i <<= 1) ;
- return i;
- }
+ return i;
+ }
}
/**
@@ -126,119 +124,115 @@ i830_get_fence_size(I830Ptr pI830, unsigned long size)
unsigned long
i830_get_fence_pitch(I830Ptr pI830, unsigned long pitch, int format)
{
- unsigned long i;
- unsigned long tile_width = (format == I915_TILING_Y) ? 128 : 512;
+ unsigned long i;
+ unsigned long tile_width = (format == I915_TILING_Y) ? 128 : 512;
- if (format == TILE_NONE)
- return pitch;
+ if (format == TILE_NONE)
+ return pitch;
- /* 965 is flexible */
- if (IS_I965G(pI830))
- return ROUND_TO(pitch, tile_width);
+ /* 965 is flexible */
+ if (IS_I965G(pI830))
+ return ROUND_TO(pitch, tile_width);
- /* Pre-965 needs power of two tile width */
- for (i = tile_width; i < pitch; i <<= 1)
- ;
+ /* Pre-965 needs power of two tile width */
+ for (i = tile_width; i < pitch; i <<= 1) ;
- return i;
+ return i;
}
/**
* On some chips, pitch width has to be a power of two tile width, so
* calculate that here.
*/
-static unsigned long
-i830_get_fence_alignment(I830Ptr pI830, unsigned long size)
+static unsigned long i830_get_fence_alignment(I830Ptr pI830, unsigned long size)
{
- if (IS_I965G(pI830))
- return 4096;
- else
- return i830_get_fence_size(pI830, size);
+ if (IS_I965G(pI830))
+ return 4096;
+ else
+ return i830_get_fence_size(pI830, size);
}
static Bool
i830_check_display_stride(ScrnInfoPtr pScrn, int stride, Bool tiling)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int limit = KB(32);
+ I830Ptr pI830 = I830PTR(pScrn);
+ int limit = KB(32);
- /* 8xx spec has always 8K limit, but tests show larger limit in
- non-tiling mode, which makes large monitor work. */
- if ((IS_845G(pI830) || IS_I85X(pI830)) && tiling)
- limit = KB(8);
+ /* 8xx spec has always 8K limit, but tests show larger limit in
+ non-tiling mode, which makes large monitor work. */
+ if ((IS_845G(pI830) || IS_I85X(pI830)) && tiling)
+ limit = KB(8);
- if (IS_I915(pI830) && tiling)
- limit = KB(8);
+ if (IS_I915(pI830) && tiling)
+ limit = KB(8);
- if (IS_I965G(pI830) && tiling)
- limit = KB(16);
+ if (IS_I965G(pI830) && tiling)
+ limit = KB(16);
- if (stride <= limit)
- return TRUE;
- else
- return FALSE;
+ if (stride <= limit)
+ return TRUE;
+ else
+ return FALSE;
}
-void
-i830_free_memory(ScrnInfoPtr pScrn, i830_memory *mem)
+void i830_free_memory(ScrnInfoPtr pScrn, i830_memory * mem)
{
- if (mem == NULL)
- return;
-
- if (mem->bo != NULL) {
- I830Ptr pI830 = I830PTR(pScrn);
- dri_bo_unreference (mem->bo);
- if (pI830->bo_list == mem) {
- pI830->bo_list = mem->next;
- if (mem->next)
- mem->next->prev = NULL;
- } else {
- if (mem->prev)
+ if (mem == NULL)
+ return;
+
+ if (mem->bo != NULL) {
+ I830Ptr pI830 = I830PTR(pScrn);
+ dri_bo_unreference(mem->bo);
+ if (pI830->bo_list == mem) {
+ pI830->bo_list = mem->next;
+ if (mem->next)
+ mem->next->prev = NULL;
+ } else {
+ if (mem->prev)
+ mem->prev->next = mem->next;
+ if (mem->next)
+ mem->next->prev = mem->prev;
+ }
+ xfree(mem->name);
+ xfree(mem);
+ return;
+ }
+ /* Disconnect from the list of allocations */
+ if (mem->prev != NULL)
mem->prev->next = mem->next;
- if (mem->next)
+ if (mem->next != NULL)
mem->next->prev = mem->prev;
- }
+
xfree(mem->name);
xfree(mem);
- return;
- }
- /* Disconnect from the list of allocations */
- if (mem->prev != NULL)
- mem->prev->next = mem->next;
- if (mem->next != NULL)
- mem->next->prev = mem->prev;
-
- xfree(mem->name);
- xfree(mem);
}
/* Resets the state of the aperture allocator, freeing all memory that had
* been allocated.
*/
-void
-i830_reset_allocations(ScrnInfoPtr pScrn)
+void i830_reset_allocations(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int p;
+ I830Ptr pI830 = I830PTR(pScrn);
+ int p;
- /* While there is any memory between the start and end markers, free it. */
- while (pI830->memory_list->next->next != NULL) {
- i830_memory *mem = pI830->memory_list->next;
+ /* While there is any memory between the start and end markers, free it. */
+ while (pI830->memory_list->next->next != NULL) {
+ i830_memory *mem = pI830->memory_list->next;
- i830_free_memory(pScrn, mem);
- }
+ i830_free_memory(pScrn, mem);
+ }
- /* Free any allocations in buffer objects */
- while (pI830->bo_list != NULL)
- i830_free_memory(pScrn, pI830->bo_list);
+ /* Free any allocations in buffer objects */
+ while (pI830->bo_list != NULL)
+ i830_free_memory(pScrn, pI830->bo_list);
- /* Null out the pointers for all the allocations we just freed. This is
- * kind of gross, but at least it's just one place now.
- */
- for (p = 0; p < 2; p++)
- pI830->cursor_mem_argb[p] = NULL;
+ /* Null out the pointers for all the allocations we just freed. This is
+ * kind of gross, but at least it's just one place now.
+ */
+ for (p = 0; p < 2; p++)
+ pI830->cursor_mem_argb[p] = NULL;
- pI830->front_buffer = NULL;
+ pI830->front_buffer = NULL;
}
/**
@@ -250,138 +244,137 @@ i830_reset_allocations(ScrnInfoPtr pScrn)
* static allocations. Some of these exist because of the need for physical
* addresses to reference.
*/
-Bool
-i830_allocator_init(ScrnInfoPtr pScrn, unsigned long size)
+Bool i830_allocator_init(ScrnInfoPtr pScrn, unsigned long size)
{
- I830Ptr pI830 = I830PTR(pScrn);
- i830_memory *start, *end;
-
- start = xcalloc(1, sizeof(*start));
- if (start == NULL)
- return FALSE;
- start->name = xstrdup("start marker");
- if (start->name == NULL) {
- xfree(start);
- return FALSE;
- }
- end = xcalloc(1, sizeof(*end));
- if (end == NULL) {
- xfree(start->name);
- xfree(start);
- return FALSE;
- }
- end->name = xstrdup("end marker");
- if (end->name == NULL) {
- xfree(start->name);
- xfree(start);
- xfree(end);
- return FALSE;
- }
-
- start->offset = 0;
- start->end = start->offset;
- start->size = 0;
- start->next = end;
- end->offset = size;
- end->end = end->offset;
- end->size = 0;
- end->prev = start;
-
- pI830->memory_list = start;
-
- return TRUE;
+ I830Ptr pI830 = I830PTR(pScrn);
+ i830_memory *start, *end;
+
+ start = xcalloc(1, sizeof(*start));
+ if (start == NULL)
+ return FALSE;
+ start->name = xstrdup("start marker");
+ if (start->name == NULL) {
+ xfree(start);
+ return FALSE;
+ }
+ end = xcalloc(1, sizeof(*end));
+ if (end == NULL) {
+ xfree(start->name);
+ xfree(start);
+ return FALSE;
+ }
+ end->name = xstrdup("end marker");
+ if (end->name == NULL) {
+ xfree(start->name);
+ xfree(start);
+ xfree(end);
+ return FALSE;
+ }
+
+ start->offset = 0;
+ start->end = start->offset;
+ start->size = 0;
+ start->next = end;
+ end->offset = size;
+ end->end = end->offset;
+ end->size = 0;
+ end->prev = start;
+
+ pI830->memory_list = start;
+
+ return TRUE;
}
-void
-i830_allocator_fini(ScrnInfoPtr pScrn)
+void i830_allocator_fini(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- /* Free most of the allocations */
- i830_reset_allocations(pScrn);
+ /* Free most of the allocations */
+ i830_reset_allocations(pScrn);
- /* Free the start/end markers */
- free(pI830->memory_list->next);
- free(pI830->memory_list);
- pI830->memory_list = NULL;
+ /* Free the start/end markers */
+ free(pI830->memory_list->next);
+ free(pI830->memory_list);
+ pI830->memory_list = NULL;
}
-static i830_memory *
-i830_allocate_memory_bo(ScrnInfoPtr pScrn, const char *name,
- unsigned long size, unsigned long pitch,
- unsigned long align, int flags,
- enum tile_format tile_format)
+static i830_memory *i830_allocate_memory_bo(ScrnInfoPtr pScrn, const char *name,
+ unsigned long size,
+ unsigned long pitch,
+ unsigned long align, int flags,
+ enum tile_format tile_format)
{
- I830Ptr pI830 = I830PTR(pScrn);
- i830_memory *mem;
- uint32_t bo_tiling_mode = I915_TILING_NONE;
- int ret;
+ I830Ptr pI830 = I830PTR(pScrn);
+ i830_memory *mem;
+ uint32_t bo_tiling_mode = I915_TILING_NONE;
+ int ret;
- assert((flags & NEED_PHYSICAL_ADDR) == 0);
+ assert((flags & NEED_PHYSICAL_ADDR) == 0);
- /* Only allocate page-sized increments. */
- size = ALIGN(size, GTT_PAGE_SIZE);
- align = i830_get_fence_alignment(pI830, size);
+ /* Only allocate page-sized increments. */
+ size = ALIGN(size, GTT_PAGE_SIZE);
+ align = i830_get_fence_alignment(pI830, size);
- mem = xcalloc(1, sizeof(*mem));
- if (mem == NULL)
- return NULL;
+ mem = xcalloc(1, sizeof(*mem));
+ if (mem == NULL)
+ return NULL;
- mem->name = xstrdup(name);
- if (mem->name == NULL) {
- xfree(mem);
- return NULL;
- }
+ mem->name = xstrdup(name);
+ if (mem->name == NULL) {
+ xfree(mem);
+ return NULL;
+ }
- mem->bo = dri_bo_alloc (pI830->bufmgr, name, size, align);
+ mem->bo = dri_bo_alloc(pI830->bufmgr, name, size, align);
- if (!mem->bo) {
- xfree(mem->name);
- xfree(mem);
- return NULL;
- }
-
- /* Give buffer obviously wrong offset/end until it's pinned. */
- mem->offset = -1;
- mem->end = -1;
- mem->size = size;
- mem->alignment = align;
- mem->tiling = tile_format;
- mem->pitch = pitch;
-
- switch (tile_format) {
- case TILE_XMAJOR:
- bo_tiling_mode = I915_TILING_X;
- break;
- case TILE_YMAJOR:
- bo_tiling_mode = I915_TILING_Y;
- break;
- case TILE_NONE:
- default:
- bo_tiling_mode = I915_TILING_NONE;
- break;
- }
-
- ret = drm_intel_bo_set_tiling(mem->bo, &bo_tiling_mode, pitch);
- if (ret != 0 || (bo_tiling_mode == I915_TILING_NONE && tile_format != TILE_NONE)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Failed to set tiling on %s: %s\n",
- mem->name,
- ret == 0 ? "rejected by kernel" : strerror(errno));
- mem->tiling = TILE_NONE;
- }
-
- if (flags & DISABLE_REUSE)
- drm_intel_bo_disable_reuse(mem->bo);
-
- /* Insert new allocation into the list */
- mem->prev = NULL;
- mem->next = pI830->bo_list;
- if (pI830->bo_list != NULL)
- pI830->bo_list->prev = mem;
- pI830->bo_list = mem;
-
- return mem;
+ if (!mem->bo) {
+ xfree(mem->name);
+ xfree(mem);
+ return NULL;
+ }
+
+ /* Give buffer obviously wrong offset/end until it's pinned. */
+ mem->offset = -1;
+ mem->end = -1;
+ mem->size = size;
+ mem->alignment = align;
+ mem->tiling = tile_format;
+ mem->pitch = pitch;
+
+ switch (tile_format) {
+ case TILE_XMAJOR:
+ bo_tiling_mode = I915_TILING_X;
+ break;
+ case TILE_YMAJOR:
+ bo_tiling_mode = I915_TILING_Y;
+ break;
+ case TILE_NONE:
+ default:
+ bo_tiling_mode = I915_TILING_NONE;
+ break;
+ }
+
+ ret = drm_intel_bo_set_tiling(mem->bo, &bo_tiling_mode, pitch);
+ if (ret != 0
+ || (bo_tiling_mode == I915_TILING_NONE
+ && tile_format != TILE_NONE)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to set tiling on %s: %s\n", mem->name,
+ ret == 0 ? "rejected by kernel" : strerror(errno));
+ mem->tiling = TILE_NONE;
+ }
+
+ if (flags & DISABLE_REUSE)
+ drm_intel_bo_disable_reuse(mem->bo);
+
+ /* Insert new allocation into the list */
+ mem->prev = NULL;
+ mem->next = pI830->bo_list;
+ if (pI830->bo_list != NULL)
+ pI830->bo_list->prev = mem;
+ pI830->bo_list = mem;
+
+ return mem;
}
/* Allocates video memory at the given size, pitch, alignment and tile format.
@@ -402,127 +395,125 @@ i830_allocate_memory_bo(ScrnInfoPtr pScrn, const char *name,
* the entire Screen lifetime. This means not using buffer objects, which
* get their offsets chosen at each EnterVT time.
*/
-i830_memory *
-i830_allocate_memory(ScrnInfoPtr pScrn, const char *name,
- unsigned long size, unsigned long pitch,
- unsigned long alignment, int flags,
- enum tile_format tile_format)
+i830_memory *i830_allocate_memory(ScrnInfoPtr pScrn, const char *name,
+ unsigned long size, unsigned long pitch,
+ unsigned long alignment, int flags,
+ enum tile_format tile_format)
{
- i830_memory *mem;
- I830Ptr pI830 = I830PTR(pScrn);
-
- /* Manage tile alignment and size constraints */
- if (tile_format != TILE_NONE) {
- /* Only allocate page-sized increments. */
- size = ALIGN(size, GTT_PAGE_SIZE);
+ i830_memory *mem;
+ I830Ptr pI830 = I830PTR(pScrn);
- /* Check for maximum tiled region size */
- if (IS_I9XX(pI830)) {
- if (size > MB(128))
- return NULL;
- } else {
- if (size > MB(64))
- return NULL;
+ /* Manage tile alignment and size constraints */
+ if (tile_format != TILE_NONE) {
+ /* Only allocate page-sized increments. */
+ size = ALIGN(size, GTT_PAGE_SIZE);
+
+ /* Check for maximum tiled region size */
+ if (IS_I9XX(pI830)) {
+ if (size > MB(128))
+ return NULL;
+ } else {
+ if (size > MB(64))
+ return NULL;
+ }
+
+ /* round to size necessary for the fence register to work */
+ size = i830_get_fence_size(pI830, size);
+ alignment = i830_get_fence_alignment(pI830, size);
}
- /* round to size necessary for the fence register to work */
- size = i830_get_fence_size(pI830, size);
- alignment = i830_get_fence_alignment(pI830, size);
- }
-
- return i830_allocate_memory_bo(pScrn, name, size,
- pitch, alignment, flags, tile_format);
+ return i830_allocate_memory_bo(pScrn, name, size,
+ pitch, alignment, flags, tile_format);
- return mem;
+ return mem;
}
void
i830_describe_allocations(ScrnInfoPtr pScrn, int verbosity, const char *prefix)
{
- I830Ptr pI830 = I830PTR(pScrn);
- i830_memory *mem;
+ I830Ptr pI830 = I830PTR(pScrn);
+ i830_memory *mem;
- if (pI830->memory_list == NULL) {
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity,
- "%sMemory allocator not initialized\n", prefix);
- return;
- }
+ if (pI830->memory_list == NULL) {
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity,
+ "%sMemory allocator not initialized\n", prefix);
+ return;
+ }
- if (pI830->memory_list->next->next == NULL) {
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity,
- "%sNo memory allocations\n", prefix);
- return;
- }
+ if (pI830->memory_list->next->next == NULL) {
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity,
+ "%sNo memory allocations\n", prefix);
+ return;
+ }
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity,
- "%sFixed memory allocation layout:\n", prefix);
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity,
+ "%sFixed memory allocation layout:\n", prefix);
- for (mem = pI830->memory_list->next; mem->next != NULL; mem = mem->next) {
- char phys_suffix[32] = "";
- char *tile_suffix = "";
+ for (mem = pI830->memory_list->next; mem->next != NULL; mem = mem->next) {
+ char phys_suffix[32] = "";
+ char *tile_suffix = "";
- if (mem->tiling == TILE_XMAJOR)
- tile_suffix = " X tiled";
- else if (mem->tiling == TILE_YMAJOR)
- tile_suffix = " Y tiled";
+ if (mem->tiling == TILE_XMAJOR)
+ tile_suffix = " X tiled";
+ else if (mem->tiling == TILE_YMAJOR)
+ tile_suffix = " Y tiled";
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity,
+ "%s0x%08lx-0x%08lx: %s (%ld kB%s)%s\n", prefix,
+ mem->offset, mem->end - 1, mem->name,
+ mem->size / 1024, phys_suffix, tile_suffix);
+ }
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity,
- "%s0x%08lx-0x%08lx: %s (%ld kB%s)%s\n", prefix,
- mem->offset, mem->end - 1, mem->name,
- mem->size / 1024, phys_suffix, tile_suffix);
- }
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity,
- "%s0x%08lx: end of aperture\n",
- prefix, pI830->FbMapSize);
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity,
- "%sBO memory allocation layout:\n", prefix);
- for (mem = pI830->bo_list; mem != NULL; mem = mem->next) {
- char *tile_suffix = "";
-
- if (mem->tiling == TILE_XMAJOR)
- tile_suffix = " X tiled";
- else if (mem->tiling == TILE_YMAJOR)
- tile_suffix = " Y tiled";
+ "%s0x%08lx: end of aperture\n",
+ prefix, pI830->FbMapSize);
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity,
- "%sunpinned : %s (%ld kB)%s\n", prefix,
- mem->name, mem->size / 1024, tile_suffix);
- }
+ "%sBO memory allocation layout:\n", prefix);
+ for (mem = pI830->bo_list; mem != NULL; mem = mem->next) {
+ char *tile_suffix = "";
+
+ if (mem->tiling == TILE_XMAJOR)
+ tile_suffix = " X tiled";
+ else if (mem->tiling == TILE_YMAJOR)
+ tile_suffix = " Y tiled";
+
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, verbosity,
+ "%sunpinned : %s (%ld kB)%s\n", prefix,
+ mem->name, mem->size / 1024, tile_suffix);
+ }
}
-static Bool
-IsTileable(ScrnInfoPtr pScrn, int pitch)
+static Bool IsTileable(ScrnInfoPtr pScrn, int pitch)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- if (IS_I965G(pI830)) {
- if (pitch / 512 * 512 == pitch && pitch <= KB(128))
- return TRUE;
- else
- return FALSE;
- }
-
- /*
- * Allow tiling for pitches that are a power of 2 multiple of 128 bytes,
- * up to 64 * 128 (= 8192) bytes.
- */
- switch (pitch) {
- case 128:
- case 256:
- if (IS_I945G(pI830) || IS_I945GM(pI830) || IS_G33CLASS(pI830))
- return TRUE;
- else
- return FALSE;
- case 512:
- case KB(1):
- case KB(2):
- case KB(4):
- case KB(8):
- return TRUE;
- default:
- return FALSE;
- }
+ if (IS_I965G(pI830)) {
+ if (pitch / 512 * 512 == pitch && pitch <= KB(128))
+ return TRUE;
+ else
+ return FALSE;
+ }
+
+ /*
+ * Allow tiling for pitches that are a power of 2 multiple of 128 bytes,
+ * up to 64 * 128 (= 8192) bytes.
+ */
+ switch (pitch) {
+ case 128:
+ case 256:
+ if (IS_I945G(pI830) || IS_I945GM(pI830) || IS_G33CLASS(pI830))
+ return TRUE;
+ else
+ return FALSE;
+ case 512:
+ case KB(1):
+ case KB(2):
+ case KB(4):
+ case KB(8):
+ return TRUE;
+ default:
+ return FALSE;
+ }
}
/**
@@ -531,117 +522,112 @@ IsTileable(ScrnInfoPtr pScrn, int pitch)
* Used once for each X screen, so once with RandR 1.2 and twice with classic
* dualhead.
*/
-i830_memory *
-i830_allocate_framebuffer(ScrnInfoPtr pScrn)
+i830_memory *i830_allocate_framebuffer(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- unsigned int pitch = pScrn->displayWidth * pI830->cpp;
- unsigned long minspace;
- int align;
- long size, fb_height;
- int flags;
- i830_memory *front_buffer = NULL;
- enum tile_format tile_format = TILE_NONE;
-
- flags = ALLOW_SHARING|DISABLE_REUSE;
-
- /* We'll allocate the fb such that the root window will fit regardless of
- * rotation.
- */
- fb_height = pScrn->virtualY;
-
- /* Calculate how much framebuffer memory to allocate. For the
- * initial allocation, calculate a reasonable minimum. This is
- * enough for the virtual screen size.
- */
- minspace = pitch * pScrn->virtualY;
-
- size = ROUND_TO_PAGE(pitch * fb_height);
-
- if (pI830->tiling)
- tile_format = TILE_XMAJOR;
-
- if (!IsTileable(pScrn, pitch))
- tile_format = TILE_NONE;
-
- if (!i830_check_display_stride(pScrn, pitch, tile_format != TILE_NONE)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Front buffer stride %d kB "
- "exceed display limit\n", pitch/1024);
- return NULL;
- }
-
- /* Attempt to allocate it tiled first if we have page flipping on. */
- if (tile_format != TILE_NONE) {
- /* XXX: probably not the case on 965 */
- if (IS_I9XX(pI830))
- align = MB(1);
- else
- align = KB(512);
- } else
- align = KB(64);
- front_buffer = i830_allocate_memory(pScrn, "front buffer", size,
- pitch, align, flags,
- tile_format);
-
- if (front_buffer == NULL) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Failed to allocate framebuffer.\n");
- return NULL;
- }
-
- i830_set_max_gtt_map_size(pScrn);
-
- return front_buffer;
+ I830Ptr pI830 = I830PTR(pScrn);
+ unsigned int pitch = pScrn->displayWidth * pI830->cpp;
+ unsigned long minspace;
+ int align;
+ long size, fb_height;
+ int flags;
+ i830_memory *front_buffer = NULL;
+ enum tile_format tile_format = TILE_NONE;
+
+ flags = ALLOW_SHARING | DISABLE_REUSE;
+
+ /* We'll allocate the fb such that the root window will fit regardless of
+ * rotation.
+ */
+ fb_height = pScrn->virtualY;
+
+ /* Calculate how much framebuffer memory to allocate. For the
+ * initial allocation, calculate a reasonable minimum. This is
+ * enough for the virtual screen size.
+ */
+ minspace = pitch * pScrn->virtualY;
+
+ size = ROUND_TO_PAGE(pitch * fb_height);
+
+ if (pI830->tiling)
+ tile_format = TILE_XMAJOR;
+
+ if (!IsTileable(pScrn, pitch))
+ tile_format = TILE_NONE;
+
+ if (!i830_check_display_stride(pScrn, pitch, tile_format != TILE_NONE)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Front buffer stride %d kB "
+ "exceed display limit\n", pitch / 1024);
+ return NULL;
+ }
+
+ /* Attempt to allocate it tiled first if we have page flipping on. */
+ if (tile_format != TILE_NONE) {
+ /* XXX: probably not the case on 965 */
+ if (IS_I9XX(pI830))
+ align = MB(1);
+ else
+ align = KB(512);
+ } else
+ align = KB(64);
+ front_buffer = i830_allocate_memory(pScrn, "front buffer", size,
+ pitch, align, flags, tile_format);
+
+ if (front_buffer == NULL) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to allocate framebuffer.\n");
+ return NULL;
+ }
+
+ i830_set_max_gtt_map_size(pScrn);
+
+ return front_buffer;
}
-static Bool
-i830_allocate_cursor_buffers(ScrnInfoPtr pScrn)
+static Bool i830_allocate_cursor_buffers(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- int i;
-
- /*
- * Allocate four separate buffers when the kernel doesn't support
- * large allocations as on Linux. If any of these fail, just
- * bail back to software cursors everywhere
- */
- for (i = 0; i < xf86_config->num_crtc; i++)
- {
- pI830->cursor_mem_argb[i] = i830_allocate_memory (pScrn, "ARGB cursor",
- HWCURSOR_SIZE_ARGB,
- PITCH_NONE,
- GTT_PAGE_SIZE,
- DISABLE_REUSE,
- TILE_NONE);
- if (!pI830->cursor_mem_argb[i])
- return FALSE;
-
- }
- return TRUE;
+ I830Ptr pI830 = I830PTR(pScrn);
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ int i;
+
+ /*
+ * Allocate four separate buffers when the kernel doesn't support
+ * large allocations as on Linux. If any of these fail, just
+ * bail back to software cursors everywhere
+ */
+ for (i = 0; i < xf86_config->num_crtc; i++) {
+ pI830->cursor_mem_argb[i] =
+ i830_allocate_memory(pScrn, "ARGB cursor",
+ HWCURSOR_SIZE_ARGB, PITCH_NONE,
+ GTT_PAGE_SIZE, DISABLE_REUSE,
+ TILE_NONE);
+ if (!pI830->cursor_mem_argb[i])
+ return FALSE;
+
+ }
+ return TRUE;
}
/*
* Allocate memory for 2D operation. This includes the (front) framebuffer,
* ring buffer, scratch memory, HW cursor.
*/
-Bool
-i830_allocate_2d_memory(ScrnInfoPtr pScrn)
+Bool i830_allocate_2d_memory(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- /* Next, allocate other fixed-size allocations we have. */
- if (!i830_allocate_cursor_buffers(pScrn)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Failed to allocate HW cursor space.\n");
- return FALSE;
- }
+ /* Next, allocate other fixed-size allocations we have. */
+ if (!i830_allocate_cursor_buffers(pScrn)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to allocate HW cursor space.\n");
+ return FALSE;
+ }
- pI830->front_buffer = i830_allocate_framebuffer(pScrn);
- if (pI830->front_buffer == NULL)
- return FALSE;
+ pI830->front_buffer = i830_allocate_framebuffer(pScrn);
+ if (pI830->front_buffer == NULL)
+ return FALSE;
- return TRUE;
+ return TRUE;
}
/**
@@ -651,26 +637,25 @@ i830_allocate_2d_memory(ScrnInfoPtr pScrn)
* pI830 points to the same allocation list, but the bind_memory will just
* no-op then.
*/
-Bool
-i830_bind_all_memory(ScrnInfoPtr pScrn)
+Bool i830_bind_all_memory(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- if (pI830->memory_list == NULL)
- return TRUE;
+ if (pI830->memory_list == NULL)
+ return TRUE;
- int i;
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- for (i = 0; i < xf86_config->num_crtc; i++)
- drmmode_crtc_set_cursor_bo(xf86_config->crtc[i],
- pI830->cursor_mem_argb[i]->bo);
+ int i;
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ for (i = 0; i < xf86_config->num_crtc; i++)
+ drmmode_crtc_set_cursor_bo(xf86_config->crtc[i],
+ pI830->cursor_mem_argb[i]->bo);
- i830_set_max_gtt_map_size(pScrn);
+ i830_set_max_gtt_map_size(pScrn);
- if (pI830->front_buffer)
- pScrn->fbOffset = pI830->front_buffer->offset;
+ if (pI830->front_buffer)
+ pScrn->fbOffset = pI830->front_buffer->offset;
- return TRUE;
+ return TRUE;
}
#ifdef INTEL_XVMC
@@ -678,59 +663,59 @@ i830_bind_all_memory(ScrnInfoPtr pScrn)
* Allocate memory for MC compensation
*/
Bool i830_allocate_xvmc_buffer(ScrnInfoPtr pScrn, const char *name,
- i830_memory **buffer, unsigned long size,
- int flags)
+ i830_memory ** buffer, unsigned long size,
+ int flags)
{
- *buffer = i830_allocate_memory(pScrn, name, size, PITCH_NONE,
- GTT_PAGE_SIZE, flags, TILE_NONE);
-
- if (!*buffer) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Failed to allocate memory for %s.\n", name);
- return FALSE;
- }
-
- if ((*buffer)->bo) {
- if (drm_intel_bo_pin((*buffer)->bo, GTT_PAGE_SIZE)) {
- i830_free_memory(pScrn, *buffer);
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Failed to bind XvMC buffer bo!\n");
- return FALSE;
- }
-
- (*buffer)->offset = (*buffer)->bo->offset;
- }
-
- return TRUE;
+ *buffer = i830_allocate_memory(pScrn, name, size, PITCH_NONE,
+ GTT_PAGE_SIZE, flags, TILE_NONE);
+
+ if (!*buffer) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to allocate memory for %s.\n", name);
+ return FALSE;
+ }
+
+ if ((*buffer)->bo) {
+ if (drm_intel_bo_pin((*buffer)->bo, GTT_PAGE_SIZE)) {
+ i830_free_memory(pScrn, *buffer);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to bind XvMC buffer bo!\n");
+ return FALSE;
+ }
+
+ (*buffer)->offset = (*buffer)->bo->offset;
+ }
+
+ return TRUE;
}
-void
-i830_free_xvmc_buffer(ScrnInfoPtr pScrn, i830_memory *buffer)
+void i830_free_xvmc_buffer(ScrnInfoPtr pScrn, i830_memory * buffer)
{
- if (buffer->bo)
- drm_intel_bo_unpin(buffer->bo);
+ if (buffer->bo)
+ drm_intel_bo_unpin(buffer->bo);
- i830_free_memory(pScrn, buffer);
+ i830_free_memory(pScrn, buffer);
}
#endif
-void
-i830_set_max_gtt_map_size(ScrnInfoPtr pScrn)
+void i830_set_max_gtt_map_size(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- struct drm_i915_gem_get_aperture aperture;
- int ret;
-
- /* Default low value in case it gets used during server init. */
- pI830->max_gtt_map_size = 16 * 1024 * 1024;
-
- ret = ioctl(pI830->drmSubFD, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture);
- if (ret == 0) {
- /* Let objects up get bound up to the size where only 2 would fit in
- * the aperture, but then leave slop to account for alignment like
- * libdrm does.
- */
- pI830->max_gtt_map_size = aperture.aper_available_size * 3 / 4 / 2;
- }
+ I830Ptr pI830 = I830PTR(pScrn);
+ struct drm_i915_gem_get_aperture aperture;
+ int ret;
+
+ /* Default low value in case it gets used during server init. */
+ pI830->max_gtt_map_size = 16 * 1024 * 1024;
+
+ ret =
+ ioctl(pI830->drmSubFD, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture);
+ if (ret == 0) {
+ /* Let objects up get bound up to the size where only 2 would fit in
+ * the aperture, but then leave slop to account for alignment like
+ * libdrm does.
+ */
+ pI830->max_gtt_map_size =
+ aperture.aper_available_size * 3 / 4 / 2;
+ }
}
diff --git a/src/i830_reg.h b/src/i830_reg.h
index a8b82a68..3bba44da 100644
--- a/src/i830_reg.h
+++ b/src/i830_reg.h
@@ -25,7 +25,6 @@
*
**************************************************************************/
-
#ifndef _I830_REG_H_
#define _I830_REG_H_
@@ -74,7 +73,6 @@
/* Dword 2 */
#define BUF_3D_ADDR(x) ((x) & ~0x3)
-
#define _3DSTATE_COLOR_FACTOR_CMD (CMD_3D | (0x1d<<24) | (0x1<<16))
#define _3DSTATE_COLOR_FACTOR_N_CMD(stage) (CMD_3D | (0x1d<<24) | \
@@ -88,7 +86,6 @@
#define _3DSTATE_DFLT_Z_CMD (CMD_3D | (0x1d<<24) | (0x98<<16))
-
#define _3DSTATE_DST_BUF_VARS_CMD (CMD_3D | (0x1d<<24) | (0x85<<16))
/* Dword 1 */
#define DSTORG_HORT_BIAS(x) ((x)<<20)
@@ -115,7 +112,6 @@
#define VERT_LINE_STRIDE_OFS_1 1
#define VERT_LINE_STRIDE_OFS_0 0
-
#define _3DSTATE_DRAW_RECT_CMD (CMD_3D|(0x1d<<24)|(0x80<<16)|3)
/* Dword 1 */
#define DRAW_RECT_DIS_DEPTH_OFS (1<<30)
@@ -131,7 +127,6 @@
#define DRAW_YORG(x) ((x)<<16)
#define DRAW_XORG(x) (x)
-
#define _3DSTATE_ENABLES_1_CMD (CMD_3D|(0x3<<24))
#define ENABLE_LOGIC_OP_MASK ((1<<23)|(1<<22))
#define ENABLE_LOGIC_OP ((1<<23)|(1<<22))
@@ -307,7 +302,6 @@
#define DISABLE_VIEWPORT_TRANSFORM (1<<31)
#define DISABLE_PERSPECTIVE_DIVIDE (1<<29)
-
/* _3DSTATE_MAP_COORD_SET_BINDINGS, p162 */
#define _3DSTATE_MAP_COORD_SETBIND_CMD (CMD_3D|(0x1d<<24)|(0x02<<16))
#define TEXBIND_MASK3 ((1<<15)|(1<<14)|(1<<13)|(1<<12))
@@ -388,7 +382,6 @@
#define SRC_BLND_FACT(x) ((x)<<6)
#define DST_BLND_FACT(x) (x)
-
/* _3DSTATE_MODES_2, p192 */
#define _3DSTATE_MODES_2_CMD (CMD_3D|(0x0f<<24))
#define ENABLE_GLOBAL_DEPTH_BIAS (1<<22)
@@ -543,7 +536,6 @@
#define MLC_LOD_BIAS_MASK ((1<<7)-1)
-
/* _3DSTATE_VERTEX_TRANSFORM, p207 */
#define _3DSTATE_VERTEX_TRANS_CMD (CMD_3D|(0x1d<<24)|(0x8b<<16)|0)
#define _3DSTATE_VERTEX_TRANS_MTX_CMD (CMD_3D|(0x1d<<24)|(0x8b<<16)|6)
@@ -563,7 +555,6 @@
/* Dword 2 */
#define WFAR_VALUE(x) (x)
-
/* Stipple command, carried over from the i810, apparently:
*/
#define _3DSTATE_STIPPLE (CMD_3D|(0x1d<<24)|(0x83<<16))
@@ -637,8 +628,8 @@
#define MAPSURF_4BIT_INDEXED (7<<6)
#define TM0S1_MT_FORMAT_MASK (0x7 << 3)
#define TM0S1_MT_FORMAT_SHIFT 3
-#define MT_4BIT_IDX_ARGB8888 (7<<3) /* SURFACE_4BIT_INDEXED */
-#define MT_8BIT_IDX_RGB565 (0<<3) /* SURFACE_8BIT_INDEXED */
+#define MT_4BIT_IDX_ARGB8888 (7<<3) /* SURFACE_4BIT_INDEXED */
+#define MT_8BIT_IDX_RGB565 (0<<3) /* SURFACE_8BIT_INDEXED */
#define MT_8BIT_IDX_ARGB1555 (1<<3)
#define MT_8BIT_IDX_ARGB4444 (2<<3)
#define MT_8BIT_IDX_AY88 (3<<3)
@@ -646,10 +637,10 @@
#define MT_8BIT_IDX_BUMP_88DVDU (5<<3)
#define MT_8BIT_IDX_BUMP_655LDVDU (6<<3)
#define MT_8BIT_IDX_ARGB8888 (7<<3)
-#define MT_8BIT_I8 (0<<3) /* SURFACE_8BIT */
+#define MT_8BIT_I8 (0<<3) /* SURFACE_8BIT */
#define MT_8BIT_L8 (1<<3)
#define MT_8BIT_A8 (4<<3)
-#define MT_16BIT_RGB565 (0<<3) /* SURFACE_16BIT */
+#define MT_16BIT_RGB565 (0<<3) /* SURFACE_16BIT */
#define MT_16BIT_ARGB1555 (1<<3)
#define MT_16BIT_ARGB4444 (2<<3)
#define MT_16BIT_AY88 (3<<3)
@@ -657,18 +648,18 @@
#define MT_16BIT_BUMP_88DVDU (5<<3)
#define MT_16BIT_BUMP_655LDVDU (6<<3)
#define MT_16BIT_DIB_RGB565_8888 (7<<3)
-#define MT_32BIT_ARGB8888 (0<<3) /* SURFACE_32BIT */
+#define MT_32BIT_ARGB8888 (0<<3) /* SURFACE_32BIT */
#define MT_32BIT_ABGR8888 (1<<3)
#define MT_32BIT_XRGB8888 (2<<3)
#define MT_32BIT_XBGR8888 (3<<3)
#define MT_32BIT_BUMP_XLDVDU_8888 (6<<3)
#define MT_32BIT_DIB_8888 (7<<3)
-#define MT_411_YUV411 (0<<3) /* SURFACE_411 */
-#define MT_422_YCRCB_SWAPY (0<<3) /* SURFACE_422 */
+#define MT_411_YUV411 (0<<3) /* SURFACE_411 */
+#define MT_422_YCRCB_SWAPY (0<<3) /* SURFACE_422 */
#define MT_422_YCRCB_NORMAL (1<<3)
#define MT_422_YCRCB_SWAPUV (2<<3)
#define MT_422_YCRCB_SWAPUVY (3<<3)
-#define MT_COMPRESS_DXT1 (0<<3) /* SURFACE_COMPRESSED */
+#define MT_COMPRESS_DXT1 (0<<3) /* SURFACE_COMPRESSED */
#define MT_COMPRESS_DXT2_3 (1<<3)
#define MT_COMPRESS_DXT4_5 (2<<3)
#define MT_COMPRESS_FXT1 (3<<3)
@@ -710,7 +701,6 @@
#define TM0S3_KEYED_FILTER (1<<1)
#define TM0S3_CHROMA_KEY (1<<0)
-
/* _3DSTATE_MAP_TEXEL_STREAM, p188 */
#define _3DSTATE_MAP_TEX_STREAM_CMD (CMD_3D|(0x1c<<24)|(0x05<<19))
#define DISABLE_TEX_STREAM_BUMP (1<<12)
@@ -722,13 +712,12 @@
#define ENABLE_TEX_STREAM_MAP_IDX (1<<3)
#define TEX_STREAM_MAP_IDX(x) (x)
-
#define FLUSH_MAP_CACHE (1<<0)
#define _3DSTATE_MAP_FILTER_CMD (CMD_3D|(0x1c<<24)|(0x02<<19))
#define FILTER_TEXMAP_INDEX(x) ((x) << 16)
-#define MAG_MODE_FILTER_ENABLE (1 << 5)
-#define MIN_MODE_FILTER_ENABLE (1 << 2)
+#define MAG_MODE_FILTER_ENABLE (1 << 5)
+#define MIN_MODE_FILTER_ENABLE (1 << 2)
#define MAG_MAPFILTER_NEAREST (0 << 3)
#define MAG_MAPFILTER_LINEAR (1 << 3)
#define MAG_MAPFILTER_ANISOTROPIC (2 << 3)
@@ -736,7 +725,7 @@
#define MIN_MAPFILTER_LINEAR (1)
#define MIN_MAPFILTER_ANISOTROPIC (2)
#define ENABLE_KEYS (1<<15)
-#define DISABLE_COLOR_KEY 0
+#define DISABLE_COLOR_KEY 0
#define DISABLE_CHROMA_KEY 0
#define DISABLE_KILL_PIXEL 0
#define ENABLE_MIP_MODE_FILTER (1 << 9)
diff --git a/src/i830_render.c b/src/i830_render.c
index 4fa872b9..4e849674 100644
--- a/src/i830_render.c
+++ b/src/i830_render.c
@@ -35,15 +35,15 @@
#include "i830_reg.h"
struct blendinfo {
- Bool dst_alpha;
- Bool src_alpha;
- uint32_t src_blend;
- uint32_t dst_blend;
+ Bool dst_alpha;
+ Bool src_alpha;
+ uint32_t src_blend;
+ uint32_t dst_blend;
};
struct formatinfo {
- int fmt;
- uint32_t card_fmt;
+ int fmt;
+ uint32_t card_fmt;
};
#define TB0C_LAST_STAGE (1 << 31)
@@ -98,32 +98,32 @@ struct formatinfo {
#define TB0A_ARG1_SEL_TEXEL3 (9 << 6)
static struct blendinfo i830_blend_op[] = {
- /* Clear */
- {0, 0, BLENDFACTOR_ZERO, BLENDFACTOR_ZERO},
- /* Src */
- {0, 0, BLENDFACTOR_ONE, BLENDFACTOR_ZERO},
- /* Dst */
- {0, 0, BLENDFACTOR_ZERO, BLENDFACTOR_ONE},
- /* Over */
- {0, 1, BLENDFACTOR_ONE, BLENDFACTOR_INV_SRC_ALPHA},
- /* OverReverse */
- {1, 0, BLENDFACTOR_INV_DST_ALPHA, BLENDFACTOR_ONE},
- /* In */
- {1, 0, BLENDFACTOR_DST_ALPHA, BLENDFACTOR_ZERO},
- /* InReverse */
- {0, 1, BLENDFACTOR_ZERO, BLENDFACTOR_SRC_ALPHA},
- /* Out */
- {1, 0, BLENDFACTOR_INV_DST_ALPHA, BLENDFACTOR_ZERO},
- /* OutReverse */
- {0, 1, BLENDFACTOR_ZERO, BLENDFACTOR_INV_SRC_ALPHA},
- /* Atop */
- {1, 1, BLENDFACTOR_DST_ALPHA, BLENDFACTOR_INV_SRC_ALPHA},
- /* AtopReverse */
- {1, 1, BLENDFACTOR_INV_DST_ALPHA, BLENDFACTOR_SRC_ALPHA},
- /* Xor */
- {1, 1, BLENDFACTOR_INV_DST_ALPHA, BLENDFACTOR_INV_SRC_ALPHA},
- /* Add */
- {0, 0, BLENDFACTOR_ONE, BLENDFACTOR_ONE},
+ /* Clear */
+ {0, 0, BLENDFACTOR_ZERO, BLENDFACTOR_ZERO},
+ /* Src */
+ {0, 0, BLENDFACTOR_ONE, BLENDFACTOR_ZERO},
+ /* Dst */
+ {0, 0, BLENDFACTOR_ZERO, BLENDFACTOR_ONE},
+ /* Over */
+ {0, 1, BLENDFACTOR_ONE, BLENDFACTOR_INV_SRC_ALPHA},
+ /* OverReverse */
+ {1, 0, BLENDFACTOR_INV_DST_ALPHA, BLENDFACTOR_ONE},
+ /* In */
+ {1, 0, BLENDFACTOR_DST_ALPHA, BLENDFACTOR_ZERO},
+ /* InReverse */
+ {0, 1, BLENDFACTOR_ZERO, BLENDFACTOR_SRC_ALPHA},
+ /* Out */
+ {1, 0, BLENDFACTOR_INV_DST_ALPHA, BLENDFACTOR_ZERO},
+ /* OutReverse */
+ {0, 1, BLENDFACTOR_ZERO, BLENDFACTOR_INV_SRC_ALPHA},
+ /* Atop */
+ {1, 1, BLENDFACTOR_DST_ALPHA, BLENDFACTOR_INV_SRC_ALPHA},
+ /* AtopReverse */
+ {1, 1, BLENDFACTOR_INV_DST_ALPHA, BLENDFACTOR_SRC_ALPHA},
+ /* Xor */
+ {1, 1, BLENDFACTOR_INV_DST_ALPHA, BLENDFACTOR_INV_SRC_ALPHA},
+ /* Add */
+ {0, 0, BLENDFACTOR_ONE, BLENDFACTOR_ONE},
};
/* The x8* formats could use MT_32BIT_X* on 855+, but since we implement
@@ -131,272 +131,276 @@ static struct blendinfo i830_blend_op[] = {
* could handle it for us or not.
*/
static struct formatinfo i830_tex_formats[] = {
- {PICT_a8r8g8b8, MT_32BIT_ARGB8888 },
- {PICT_x8r8g8b8, MT_32BIT_ARGB8888 },
- {PICT_a8b8g8r8, MT_32BIT_ABGR8888 },
- {PICT_x8b8g8r8, MT_32BIT_ABGR8888 },
- {PICT_r5g6b5, MT_16BIT_RGB565 },
- {PICT_a1r5g5b5, MT_16BIT_ARGB1555 },
- {PICT_x1r5g5b5, MT_16BIT_ARGB1555 },
- {PICT_a8, MT_8BIT_A8 },
+ {PICT_a8r8g8b8, MT_32BIT_ARGB8888},
+ {PICT_x8r8g8b8, MT_32BIT_ARGB8888},
+ {PICT_a8b8g8r8, MT_32BIT_ABGR8888},
+ {PICT_x8b8g8r8, MT_32BIT_ABGR8888},
+ {PICT_r5g6b5, MT_16BIT_RGB565},
+ {PICT_a1r5g5b5, MT_16BIT_ARGB1555},
+ {PICT_x1r5g5b5, MT_16BIT_ARGB1555},
+ {PICT_a8, MT_8BIT_A8},
};
-static Bool i830_get_dest_format(PicturePtr pDstPicture, uint32_t *dst_format)
+static Bool i830_get_dest_format(PicturePtr pDstPicture, uint32_t * dst_format)
{
- switch (pDstPicture->format) {
- case PICT_a8r8g8b8:
- case PICT_x8r8g8b8:
- *dst_format = COLR_BUF_ARGB8888;
- break;
- case PICT_r5g6b5:
- *dst_format = COLR_BUF_RGB565;
- break;
- case PICT_a1r5g5b5:
- case PICT_x1r5g5b5:
- *dst_format = COLR_BUF_ARGB1555;
- break;
- case PICT_a8:
- *dst_format = COLR_BUF_8BIT;
- break;
- case PICT_a4r4g4b4:
- case PICT_x4r4g4b4:
- *dst_format = COLR_BUF_ARGB4444;
- break;
- default:
- {
- ScrnInfoPtr pScrn;
-
- pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
- I830FALLBACK("Unsupported dest format 0x%x\n",
- (int)pDstPicture->format);
+ switch (pDstPicture->format) {
+ case PICT_a8r8g8b8:
+ case PICT_x8r8g8b8:
+ *dst_format = COLR_BUF_ARGB8888;
+ break;
+ case PICT_r5g6b5:
+ *dst_format = COLR_BUF_RGB565;
+ break;
+ case PICT_a1r5g5b5:
+ case PICT_x1r5g5b5:
+ *dst_format = COLR_BUF_ARGB1555;
+ break;
+ case PICT_a8:
+ *dst_format = COLR_BUF_8BIT;
+ break;
+ case PICT_a4r4g4b4:
+ case PICT_x4r4g4b4:
+ *dst_format = COLR_BUF_ARGB4444;
+ break;
+ default:
+ {
+ ScrnInfoPtr pScrn;
+
+ pScrn =
+ xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
+ I830FALLBACK("Unsupported dest format 0x%x\n",
+ (int)pDstPicture->format);
+ }
}
- }
- *dst_format |= DSTORG_HORT_BIAS (0x8) | DSTORG_VERT_BIAS (0x8);
- return TRUE;
+ *dst_format |= DSTORG_HORT_BIAS(0x8) | DSTORG_VERT_BIAS(0x8);
+ return TRUE;
}
-
static Bool i830_get_blend_cntl(ScrnInfoPtr pScrn, int op, PicturePtr pMask,
- uint32_t dst_format, uint32_t *blendctl)
+ uint32_t dst_format, uint32_t * blendctl)
{
- uint32_t sblend, dblend;
-
- sblend = i830_blend_op[op].src_blend;
- dblend = i830_blend_op[op].dst_blend;
-
- /* If there's no dst alpha channel, adjust the blend op so that we'll treat
- * it as always 1.
- */
- if (PICT_FORMAT_A(dst_format) == 0 && i830_blend_op[op].dst_alpha) {
- if (sblend == BLENDFACTOR_DST_ALPHA)
- sblend = BLENDFACTOR_ONE;
- else if (sblend == BLENDFACTOR_INV_DST_ALPHA)
- sblend = BLENDFACTOR_ZERO;
- }
-
- /* For blending purposes, COLR_BUF_8BIT values show up in the green
- * channel. So we can't use the alpha channel.
- */
- if (dst_format == PICT_a8 && ((sblend == BLENDFACTOR_DST_ALPHA ||
- sblend == BLENDFACTOR_INV_DST_ALPHA))) {
- I830FALLBACK("Can't do dst alpha blending with PICT_a8 dest.\n");
- }
-
- /* If the source alpha is being used, then we should only be in a case
- * where the source blend factor is 0, and the source blend value is the
- * mask channels multiplied by the source picture's alpha.
- */
- if (pMask && pMask->componentAlpha && PICT_FORMAT_RGB(pMask->format)
+ uint32_t sblend, dblend;
+
+ sblend = i830_blend_op[op].src_blend;
+ dblend = i830_blend_op[op].dst_blend;
+
+ /* If there's no dst alpha channel, adjust the blend op so that we'll treat
+ * it as always 1.
+ */
+ if (PICT_FORMAT_A(dst_format) == 0 && i830_blend_op[op].dst_alpha) {
+ if (sblend == BLENDFACTOR_DST_ALPHA)
+ sblend = BLENDFACTOR_ONE;
+ else if (sblend == BLENDFACTOR_INV_DST_ALPHA)
+ sblend = BLENDFACTOR_ZERO;
+ }
+
+ /* For blending purposes, COLR_BUF_8BIT values show up in the green
+ * channel. So we can't use the alpha channel.
+ */
+ if (dst_format == PICT_a8 && ((sblend == BLENDFACTOR_DST_ALPHA ||
+ sblend == BLENDFACTOR_INV_DST_ALPHA))) {
+ I830FALLBACK
+ ("Can't do dst alpha blending with PICT_a8 dest.\n");
+ }
+
+ /* If the source alpha is being used, then we should only be in a case
+ * where the source blend factor is 0, and the source blend value is the
+ * mask channels multiplied by the source picture's alpha.
+ */
+ if (pMask && pMask->componentAlpha && PICT_FORMAT_RGB(pMask->format)
&& i830_blend_op[op].src_alpha) {
- if (dblend == BLENDFACTOR_SRC_ALPHA) {
- dblend = BLENDFACTOR_SRC_COLR;
- } else if (dblend == BLENDFACTOR_INV_SRC_ALPHA) {
- dblend = BLENDFACTOR_INV_SRC_COLR;
- }
- }
+ if (dblend == BLENDFACTOR_SRC_ALPHA) {
+ dblend = BLENDFACTOR_SRC_COLR;
+ } else if (dblend == BLENDFACTOR_INV_SRC_ALPHA) {
+ dblend = BLENDFACTOR_INV_SRC_COLR;
+ }
+ }
- *blendctl = (sblend << S8_SRC_BLEND_FACTOR_SHIFT) |
- (dblend << S8_DST_BLEND_FACTOR_SHIFT);
+ *blendctl = (sblend << S8_SRC_BLEND_FACTOR_SHIFT) |
+ (dblend << S8_DST_BLEND_FACTOR_SHIFT);
- return TRUE;
+ return TRUE;
}
-static Bool i830_check_composite_texture(ScrnInfoPtr pScrn, PicturePtr pPict, int unit)
+static Bool i830_check_composite_texture(ScrnInfoPtr pScrn, PicturePtr pPict,
+ int unit)
{
- if (pPict->repeatType > RepeatReflect)
- I830FALLBACK("Unsupported picture repeat %d\n", pPict->repeatType);
-
- if (pPict->filter != PictFilterNearest &&
- pPict->filter != PictFilterBilinear)
- {
- I830FALLBACK("Unsupported filter 0x%x\n", pPict->filter);
- }
-
- if (pPict->pDrawable)
- {
- int w, h, i;
+ if (pPict->repeatType > RepeatReflect)
+ I830FALLBACK("Unsupported picture repeat %d\n",
+ pPict->repeatType);
- w = pPict->pDrawable->width;
- h = pPict->pDrawable->height;
- if ((w > 2048) || (h > 2048))
- I830FALLBACK("Picture w/h too large (%dx%d)\n", w, h);
+ if (pPict->filter != PictFilterNearest &&
+ pPict->filter != PictFilterBilinear) {
+ I830FALLBACK("Unsupported filter 0x%x\n", pPict->filter);
+ }
- for (i = 0; i < sizeof(i830_tex_formats) / sizeof(i830_tex_formats[0]);
- i++)
- {
- if (i830_tex_formats[i].fmt == pPict->format)
- break;
+ if (pPict->pDrawable) {
+ int w, h, i;
+
+ w = pPict->pDrawable->width;
+ h = pPict->pDrawable->height;
+ if ((w > 2048) || (h > 2048))
+ I830FALLBACK("Picture w/h too large (%dx%d)\n", w, h);
+
+ for (i = 0;
+ i < sizeof(i830_tex_formats) / sizeof(i830_tex_formats[0]);
+ i++) {
+ if (i830_tex_formats[i].fmt == pPict->format)
+ break;
+ }
+ if (i == sizeof(i830_tex_formats) / sizeof(i830_tex_formats[0]))
+ I830FALLBACK("Unsupported picture format 0x%x\n",
+ (int)pPict->format);
}
- if (i == sizeof(i830_tex_formats) / sizeof(i830_tex_formats[0]))
- I830FALLBACK("Unsupported picture format 0x%x\n",
- (int)pPict->format);
- }
- return TRUE;
+ return TRUE;
}
-static uint32_t
-i8xx_get_card_format(PicturePtr pPict)
+static uint32_t i8xx_get_card_format(PicturePtr pPict)
{
- int i;
- for (i = 0; i < sizeof(i830_tex_formats) / sizeof(i830_tex_formats[0]);
- i++)
- {
- if (i830_tex_formats[i].fmt == pPict->format)
- return i830_tex_formats[i].card_fmt;
- }
- FatalError("Unsupported format type %d\n", pPict->format);
+ int i;
+ for (i = 0; i < sizeof(i830_tex_formats) / sizeof(i830_tex_formats[0]);
+ i++) {
+ if (i830_tex_formats[i].fmt == pPict->format)
+ return i830_tex_formats[i].card_fmt;
+ }
+ FatalError("Unsupported format type %d\n", pPict->format);
}
-static void
-i830_texture_setup(PicturePtr pPict, PixmapPtr pPix, int unit)
+static void i830_texture_setup(PicturePtr pPict, PixmapPtr pPix, int unit)
{
- ScrnInfoPtr pScrn = xf86Screens[pPict->pDrawable->pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- uint32_t format, pitch, filter;
- uint32_t wrap_mode;
- uint32_t texcoordtype;
-
- pitch = intel_get_pixmap_pitch(pPix);
- pI830->scale_units[unit][0] = pPix->drawable.width;
- pI830->scale_units[unit][1] = pPix->drawable.height;
- pI830->transform[unit] = pPict->transform;
-
- if (i830_transform_is_affine(pI830->transform[unit]))
- texcoordtype = TEXCOORDTYPE_CARTESIAN;
- else
- texcoordtype = TEXCOORDTYPE_HOMOGENEOUS;
-
- format = i8xx_get_card_format(pPict);
-
- switch (pPict->repeatType) {
- case RepeatNone:
- wrap_mode = TEXCOORDMODE_CLAMP_BORDER;
- break;
- case RepeatNormal:
- wrap_mode = TEXCOORDMODE_WRAP;
- break;
- case RepeatPad:
- wrap_mode = TEXCOORDMODE_CLAMP;
- break;
- case RepeatReflect:
- wrap_mode = TEXCOORDMODE_MIRROR;
- break;
- default:
- FatalError("Unknown repeat type %d\n", pPict->repeatType);
- }
-
- switch (pPict->filter) {
- case PictFilterNearest:
- filter = ((FILTER_NEAREST<<TM0S3_MAG_FILTER_SHIFT) |
- (FILTER_NEAREST<<TM0S3_MIN_FILTER_SHIFT));
- break;
- case PictFilterBilinear:
- filter = ((FILTER_LINEAR<<TM0S3_MAG_FILTER_SHIFT) |
- (FILTER_LINEAR<<TM0S3_MIN_FILTER_SHIFT));
- break;
- default:
- filter = 0;
- FatalError("Bad filter 0x%x\n", pPict->filter);
- }
- filter |= (MIPFILTER_NONE << TM0S3_MIP_FILTER_SHIFT);
-
- {
- if (pPix->drawable.bitsPerPixel == 8)
- format |= MAPSURF_8BIT;
- else if (pPix->drawable.bitsPerPixel == 16)
- format |= MAPSURF_16BIT;
- else
- format |= MAPSURF_32BIT;
-
- BEGIN_BATCH(10);
- OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_2 | LOAD_TEXTURE_MAP(unit) | 4);
- OUT_RELOC_PIXMAP(pPix, I915_GEM_DOMAIN_SAMPLER, 0, TM0S0_USE_FENCE);
- OUT_BATCH(((pPix->drawable.height - 1) << TM0S1_HEIGHT_SHIFT) |
- ((pPix->drawable.width - 1) << TM0S1_WIDTH_SHIFT) | format);
- OUT_BATCH((pitch/4 - 1) << TM0S2_PITCH_SHIFT | TM0S2_MAP_2D);
- OUT_BATCH(filter);
- OUT_BATCH(0); /* default color */
- OUT_BATCH(_3DSTATE_MAP_COORD_SET_CMD | TEXCOORD_SET(unit) |
- ENABLE_TEXCOORD_PARAMS | TEXCOORDS_ARE_NORMAL |
- texcoordtype | ENABLE_ADDR_V_CNTL |
- TEXCOORD_ADDR_V_MODE(wrap_mode) |
- ENABLE_ADDR_U_CNTL | TEXCOORD_ADDR_U_MODE(wrap_mode));
- /* map texel stream */
- OUT_BATCH(_3DSTATE_MAP_COORD_SETBIND_CMD);
- if (unit == 0)
- OUT_BATCH(TEXBIND_SET0(TEXCOORDSRC_VTXSET_0) |
- TEXBIND_SET1(TEXCOORDSRC_KEEP) |
- TEXBIND_SET2(TEXCOORDSRC_KEEP) |
- TEXBIND_SET3(TEXCOORDSRC_KEEP));
+ ScrnInfoPtr pScrn = xf86Screens[pPict->pDrawable->pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ uint32_t format, pitch, filter;
+ uint32_t wrap_mode;
+ uint32_t texcoordtype;
+
+ pitch = intel_get_pixmap_pitch(pPix);
+ pI830->scale_units[unit][0] = pPix->drawable.width;
+ pI830->scale_units[unit][1] = pPix->drawable.height;
+ pI830->transform[unit] = pPict->transform;
+
+ if (i830_transform_is_affine(pI830->transform[unit]))
+ texcoordtype = TEXCOORDTYPE_CARTESIAN;
else
- OUT_BATCH(TEXBIND_SET0(TEXCOORDSRC_VTXSET_0) |
- TEXBIND_SET1(TEXCOORDSRC_VTXSET_1) |
- TEXBIND_SET2(TEXCOORDSRC_KEEP) |
- TEXBIND_SET3(TEXCOORDSRC_KEEP));
- OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD | (unit << 16) |
- DISABLE_TEX_STREAM_BUMP |
- ENABLE_TEX_STREAM_COORD_SET |
- TEX_STREAM_COORD_SET(unit) |
- ENABLE_TEX_STREAM_MAP_IDX |
- TEX_STREAM_MAP_IDX(unit));
- ADVANCE_BATCH();
- }
+ texcoordtype = TEXCOORDTYPE_HOMOGENEOUS;
+
+ format = i8xx_get_card_format(pPict);
+
+ switch (pPict->repeatType) {
+ case RepeatNone:
+ wrap_mode = TEXCOORDMODE_CLAMP_BORDER;
+ break;
+ case RepeatNormal:
+ wrap_mode = TEXCOORDMODE_WRAP;
+ break;
+ case RepeatPad:
+ wrap_mode = TEXCOORDMODE_CLAMP;
+ break;
+ case RepeatReflect:
+ wrap_mode = TEXCOORDMODE_MIRROR;
+ break;
+ default:
+ FatalError("Unknown repeat type %d\n", pPict->repeatType);
+ }
+
+ switch (pPict->filter) {
+ case PictFilterNearest:
+ filter = ((FILTER_NEAREST << TM0S3_MAG_FILTER_SHIFT) |
+ (FILTER_NEAREST << TM0S3_MIN_FILTER_SHIFT));
+ break;
+ case PictFilterBilinear:
+ filter = ((FILTER_LINEAR << TM0S3_MAG_FILTER_SHIFT) |
+ (FILTER_LINEAR << TM0S3_MIN_FILTER_SHIFT));
+ break;
+ default:
+ filter = 0;
+ FatalError("Bad filter 0x%x\n", pPict->filter);
+ }
+ filter |= (MIPFILTER_NONE << TM0S3_MIP_FILTER_SHIFT);
+
+ {
+ if (pPix->drawable.bitsPerPixel == 8)
+ format |= MAPSURF_8BIT;
+ else if (pPix->drawable.bitsPerPixel == 16)
+ format |= MAPSURF_16BIT;
+ else
+ format |= MAPSURF_32BIT;
+
+ BEGIN_BATCH(10);
+ OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_2 |
+ LOAD_TEXTURE_MAP(unit) | 4);
+ OUT_RELOC_PIXMAP(pPix, I915_GEM_DOMAIN_SAMPLER, 0,
+ TM0S0_USE_FENCE);
+ OUT_BATCH(((pPix->drawable.height -
+ 1) << TM0S1_HEIGHT_SHIFT) | ((pPix->drawable.width -
+ 1) <<
+ TM0S1_WIDTH_SHIFT) |
+ format);
+ OUT_BATCH((pitch / 4 - 1) << TM0S2_PITCH_SHIFT | TM0S2_MAP_2D);
+ OUT_BATCH(filter);
+ OUT_BATCH(0); /* default color */
+ OUT_BATCH(_3DSTATE_MAP_COORD_SET_CMD | TEXCOORD_SET(unit) |
+ ENABLE_TEXCOORD_PARAMS | TEXCOORDS_ARE_NORMAL |
+ texcoordtype | ENABLE_ADDR_V_CNTL |
+ TEXCOORD_ADDR_V_MODE(wrap_mode) |
+ ENABLE_ADDR_U_CNTL | TEXCOORD_ADDR_U_MODE(wrap_mode));
+ /* map texel stream */
+ OUT_BATCH(_3DSTATE_MAP_COORD_SETBIND_CMD);
+ if (unit == 0)
+ OUT_BATCH(TEXBIND_SET0(TEXCOORDSRC_VTXSET_0) |
+ TEXBIND_SET1(TEXCOORDSRC_KEEP) |
+ TEXBIND_SET2(TEXCOORDSRC_KEEP) |
+ TEXBIND_SET3(TEXCOORDSRC_KEEP));
+ else
+ OUT_BATCH(TEXBIND_SET0(TEXCOORDSRC_VTXSET_0) |
+ TEXBIND_SET1(TEXCOORDSRC_VTXSET_1) |
+ TEXBIND_SET2(TEXCOORDSRC_KEEP) |
+ TEXBIND_SET3(TEXCOORDSRC_KEEP));
+ OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD | (unit << 16) |
+ DISABLE_TEX_STREAM_BUMP |
+ ENABLE_TEX_STREAM_COORD_SET |
+ TEX_STREAM_COORD_SET(unit) |
+ ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(unit));
+ ADVANCE_BATCH();
+ }
}
Bool
i830_check_composite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
PicturePtr pDstPicture)
{
- ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
- uint32_t tmp1;
+ ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
+ uint32_t tmp1;
- /* Check for unsupported compositing operations. */
- if (op >= sizeof(i830_blend_op) / sizeof(i830_blend_op[0]))
- I830FALLBACK("Unsupported Composite op 0x%x\n", op);
+ /* Check for unsupported compositing operations. */
+ if (op >= sizeof(i830_blend_op) / sizeof(i830_blend_op[0]))
+ I830FALLBACK("Unsupported Composite op 0x%x\n", op);
- if (pMaskPicture != NULL && pMaskPicture->componentAlpha &&
+ if (pMaskPicture != NULL && pMaskPicture->componentAlpha &&
PICT_FORMAT_RGB(pMaskPicture->format)) {
- /* Check if it's component alpha that relies on a source alpha and on
- * the source value. We can only get one of those into the single
- * source value that we get to blend with.
- */
- if (i830_blend_op[op].src_alpha &&
- (i830_blend_op[op].src_blend != BLENDFACTOR_ZERO))
- I830FALLBACK("Component alpha not supported with source "
+ /* Check if it's component alpha that relies on a source alpha and on
+ * the source value. We can only get one of those into the single
+ * source value that we get to blend with.
+ */
+ if (i830_blend_op[op].src_alpha &&
+ (i830_blend_op[op].src_blend != BLENDFACTOR_ZERO))
+ I830FALLBACK
+ ("Component alpha not supported with source "
"alpha and source value blending.\n");
- }
+ }
- if (!i830_check_composite_texture(pScrn, pSrcPicture, 0))
- I830FALLBACK("Check Src picture texture\n");
- if (pMaskPicture != NULL && !i830_check_composite_texture(pScrn, pMaskPicture, 1))
- I830FALLBACK("Check Mask picture texture\n");
+ if (!i830_check_composite_texture(pScrn, pSrcPicture, 0))
+ I830FALLBACK("Check Src picture texture\n");
+ if (pMaskPicture != NULL
+ && !i830_check_composite_texture(pScrn, pMaskPicture, 1))
+ I830FALLBACK("Check Mask picture texture\n");
- if (!i830_get_dest_format(pDstPicture, &tmp1))
- I830FALLBACK("Get Color buffer format\n");
+ if (!i830_get_dest_format(pDstPicture, &tmp1))
+ I830FALLBACK("Get Color buffer format\n");
- return TRUE;
+ return TRUE;
}
Bool
@@ -404,209 +408,208 @@ i830_prepare_composite(int op, PicturePtr pSrcPicture,
PicturePtr pMaskPicture, PicturePtr pDstPicture,
PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst)
{
- ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
-
- pI830->render_src_picture = pSrcPicture;
- pI830->render_src = pSrc;
- pI830->render_mask_picture = pMaskPicture;
- pI830->render_mask = pMask;
- pI830->render_dst_picture = pDstPicture;
- pI830->render_dst = pDst;
-
- i830_exa_check_pitch_3d(pSrc);
- if (pMask)
- i830_exa_check_pitch_3d(pMask);
- i830_exa_check_pitch_3d(pDst);
-
- if (!i830_get_dest_format(pDstPicture, &pI830->render_dst_format))
- return FALSE;
-
- pI830->dst_coord_adjust = 0;
- pI830->src_coord_adjust = 0;
- pI830->mask_coord_adjust = 0;
- if (pSrcPicture->filter == PictFilterNearest)
- pI830->src_coord_adjust = 0.375;
- if (pMask != NULL) {
+ ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ pI830->render_src_picture = pSrcPicture;
+ pI830->render_src = pSrc;
+ pI830->render_mask_picture = pMaskPicture;
+ pI830->render_mask = pMask;
+ pI830->render_dst_picture = pDstPicture;
+ pI830->render_dst = pDst;
+
+ i830_exa_check_pitch_3d(pSrc);
+ if (pMask)
+ i830_exa_check_pitch_3d(pMask);
+ i830_exa_check_pitch_3d(pDst);
+
+ if (!i830_get_dest_format(pDstPicture, &pI830->render_dst_format))
+ return FALSE;
+
+ pI830->dst_coord_adjust = 0;
+ pI830->src_coord_adjust = 0;
pI830->mask_coord_adjust = 0;
- if (pMaskPicture->filter == PictFilterNearest)
- pI830->mask_coord_adjust = 0.375;
- } else {
- pI830->transform[1] = NULL;
- pI830->scale_units[1][0] = -1;
- pI830->scale_units[1][1] = -1;
- }
-
- {
- uint32_t cblend, ablend, blendctl;
-
- /* If component alpha is active in the mask and the blend operation
- * uses the source alpha, then we know we don't need the source
- * value (otherwise we would have hit a fallback earlier), so we
- * provide the source alpha (src.A * mask.X) as output color.
- * Conversely, if CA is set and we don't need the source alpha, then
- * we produce the source value (src.X * mask.X) and the source alpha
- * is unused.. Otherwise, we provide the non-CA source value
- * (src.X * mask.A).
- *
- * The PICT_FORMAT_RGB(pict) == 0 fixups are not needed on 855+'s a8
- * pictures, but we need to implement it for 830/845 and there's no
- * harm done in leaving it in.
- */
- cblend = TB0C_LAST_STAGE | TB0C_RESULT_SCALE_1X | TB0C_OP_MODULE |
- TB0C_OUTPUT_WRITE_CURRENT;
- ablend = TB0A_RESULT_SCALE_1X | TB0A_OP_MODULE |
- TB0A_OUTPUT_WRITE_CURRENT;
-
- /* Get the source picture's channels into TBx_ARG1 */
- if ((pMaskPicture != NULL &&
- pMaskPicture->componentAlpha &&
- PICT_FORMAT_RGB(pMaskPicture->format) &&
- i830_blend_op[op].src_alpha) || pDstPicture->format == PICT_a8)
- {
- /* Producing source alpha value, so the first set of channels
- * is src.A instead of src.X. We also do this if the destination
- * is a8, in which case src.G is what's written, and the other
- * channels are ignored.
- */
- if (PICT_FORMAT_A(pSrcPicture->format) != 0) {
- ablend |= TB0A_ARG1_SEL_TEXEL0;
- cblend |= TB0C_ARG1_SEL_TEXEL0 | TB0C_ARG1_REPLICATE_ALPHA;
- } else {
- ablend |= TB0A_ARG1_SEL_ONE;
- cblend |= TB0C_ARG1_SEL_ONE;
- }
- } else {
- if (PICT_FORMAT_A(pSrcPicture->format) != 0) {
- ablend |= TB0A_ARG1_SEL_TEXEL0;
- } else {
- ablend |= TB0A_ARG1_SEL_ONE;
- }
- if (PICT_FORMAT_RGB(pSrcPicture->format) != 0)
- cblend |= TB0C_ARG1_SEL_TEXEL0;
- else
- cblend |= TB0C_ARG1_SEL_ONE | TB0C_ARG1_INVERT; /* 0.0 */
- }
-
- if (pMask) {
- if (pDstPicture->format != PICT_a8 &&
- (pMaskPicture->componentAlpha &&
- PICT_FORMAT_RGB(pMaskPicture->format)))
- {
- cblend |= TB0C_ARG2_SEL_TEXEL1;
- } else {
- if (PICT_FORMAT_A(pMaskPicture->format) != 0)
- cblend |= TB0C_ARG2_SEL_TEXEL1 |
- TB0C_ARG2_REPLICATE_ALPHA;
- else
- cblend |= TB0C_ARG2_SEL_ONE;
- }
- if (PICT_FORMAT_A(pMaskPicture->format) != 0)
- ablend |= TB0A_ARG2_SEL_TEXEL1;
- else
- ablend |= TB0A_ARG2_SEL_ONE;
+ if (pSrcPicture->filter == PictFilterNearest)
+ pI830->src_coord_adjust = 0.375;
+ if (pMask != NULL) {
+ pI830->mask_coord_adjust = 0;
+ if (pMaskPicture->filter == PictFilterNearest)
+ pI830->mask_coord_adjust = 0.375;
} else {
- cblend |= TB0C_ARG2_SEL_ONE;
- ablend |= TB0A_ARG2_SEL_ONE;
+ pI830->transform[1] = NULL;
+ pI830->scale_units[1][0] = -1;
+ pI830->scale_units[1][1] = -1;
}
- if (!i830_get_blend_cntl(pScrn, op, pMaskPicture, pDstPicture->format,
- &blendctl)) {
- return FALSE;
+ {
+ uint32_t cblend, ablend, blendctl;
+
+ /* If component alpha is active in the mask and the blend operation
+ * uses the source alpha, then we know we don't need the source
+ * value (otherwise we would have hit a fallback earlier), so we
+ * provide the source alpha (src.A * mask.X) as output color.
+ * Conversely, if CA is set and we don't need the source alpha, then
+ * we produce the source value (src.X * mask.X) and the source alpha
+ * is unused.. Otherwise, we provide the non-CA source value
+ * (src.X * mask.A).
+ *
+ * The PICT_FORMAT_RGB(pict) == 0 fixups are not needed on 855+'s a8
+ * pictures, but we need to implement it for 830/845 and there's no
+ * harm done in leaving it in.
+ */
+ cblend =
+ TB0C_LAST_STAGE | TB0C_RESULT_SCALE_1X | TB0C_OP_MODULE |
+ TB0C_OUTPUT_WRITE_CURRENT;
+ ablend =
+ TB0A_RESULT_SCALE_1X | TB0A_OP_MODULE |
+ TB0A_OUTPUT_WRITE_CURRENT;
+
+ /* Get the source picture's channels into TBx_ARG1 */
+ if ((pMaskPicture != NULL &&
+ pMaskPicture->componentAlpha &&
+ PICT_FORMAT_RGB(pMaskPicture->format) &&
+ i830_blend_op[op].src_alpha)
+ || pDstPicture->format == PICT_a8) {
+ /* Producing source alpha value, so the first set of channels
+ * is src.A instead of src.X. We also do this if the destination
+ * is a8, in which case src.G is what's written, and the other
+ * channels are ignored.
+ */
+ if (PICT_FORMAT_A(pSrcPicture->format) != 0) {
+ ablend |= TB0A_ARG1_SEL_TEXEL0;
+ cblend |=
+ TB0C_ARG1_SEL_TEXEL0 |
+ TB0C_ARG1_REPLICATE_ALPHA;
+ } else {
+ ablend |= TB0A_ARG1_SEL_ONE;
+ cblend |= TB0C_ARG1_SEL_ONE;
+ }
+ } else {
+ if (PICT_FORMAT_A(pSrcPicture->format) != 0) {
+ ablend |= TB0A_ARG1_SEL_TEXEL0;
+ } else {
+ ablend |= TB0A_ARG1_SEL_ONE;
+ }
+ if (PICT_FORMAT_RGB(pSrcPicture->format) != 0)
+ cblend |= TB0C_ARG1_SEL_TEXEL0;
+ else
+ cblend |= TB0C_ARG1_SEL_ONE | TB0C_ARG1_INVERT; /* 0.0 */
+ }
+
+ if (pMask) {
+ if (pDstPicture->format != PICT_a8 &&
+ (pMaskPicture->componentAlpha &&
+ PICT_FORMAT_RGB(pMaskPicture->format))) {
+ cblend |= TB0C_ARG2_SEL_TEXEL1;
+ } else {
+ if (PICT_FORMAT_A(pMaskPicture->format) != 0)
+ cblend |= TB0C_ARG2_SEL_TEXEL1 |
+ TB0C_ARG2_REPLICATE_ALPHA;
+ else
+ cblend |= TB0C_ARG2_SEL_ONE;
+ }
+ if (PICT_FORMAT_A(pMaskPicture->format) != 0)
+ ablend |= TB0A_ARG2_SEL_TEXEL1;
+ else
+ ablend |= TB0A_ARG2_SEL_ONE;
+ } else {
+ cblend |= TB0C_ARG2_SEL_ONE;
+ ablend |= TB0A_ARG2_SEL_ONE;
+ }
+
+ if (!i830_get_blend_cntl
+ (pScrn, op, pMaskPicture, pDstPicture->format, &blendctl)) {
+ return FALSE;
+ }
+
+ pI830->cblend = cblend;
+ pI830->ablend = ablend;
+ pI830->s8_blendctl = blendctl;
}
- pI830->cblend = cblend;
- pI830->ablend = ablend;
- pI830->s8_blendctl = blendctl;
- }
-
- i830_debug_sync(pScrn);
+ i830_debug_sync(pScrn);
- pI830->needs_render_state_emit = TRUE;
+ pI830->needs_render_state_emit = TRUE;
- return TRUE;
+ return TRUE;
}
-static void
-i830_emit_composite_state(ScrnInfoPtr pScrn)
+static void i830_emit_composite_state(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- uint32_t vf2;
- uint32_t texcoordfmt = 0;
-
- pI830->needs_render_state_emit = FALSE;
-
- IntelEmitInvarientState(pScrn);
- pI830->last_3d = LAST_3D_RENDER;
-
- BEGIN_BATCH(21);
-
- OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
- OUT_BATCH(BUF_3D_ID_COLOR_BACK| BUF_3D_USE_FENCE |
- BUF_3D_PITCH(intel_get_pixmap_pitch(pI830->render_dst)));
- OUT_RELOC_PIXMAP(pI830->render_dst,
- I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
-
- OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
- OUT_BATCH(pI830->render_dst_format);
-
- OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
- OUT_BATCH(0);
- OUT_BATCH(0); /* ymin, xmin */
- OUT_BATCH(DRAW_YMAX(pI830->render_dst->drawable.height - 1) |
- DRAW_XMAX(pI830->render_dst->drawable.width - 1));
- OUT_BATCH(0); /* yorig, xorig */
-
- OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 |
- I1_LOAD_S(2) |
- I1_LOAD_S(3) |
- I1_LOAD_S(8) |
- 2);
- if (pI830->render_mask)
- vf2 = 2 << 12; /* 2 texture coord sets */
- else
- vf2 = 1 << 12;
- OUT_BATCH(vf2); /* number of coordinate sets */
- OUT_BATCH(S3_CULLMODE_NONE | S3_VERTEXHAS_XY);
- OUT_BATCH(S8_ENABLE_COLOR_BLEND | S8_BLENDFUNC_ADD | pI830->s8_blendctl |
- S8_ENABLE_COLOR_BUFFER_WRITE);
-
- OUT_BATCH(_3DSTATE_INDPT_ALPHA_BLEND_CMD | DISABLE_INDPT_ALPHA_BLEND);
-
- OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_2 |
- LOAD_TEXTURE_BLEND_STAGE(0)|1);
- OUT_BATCH(pI830->cblend);
- OUT_BATCH(pI830->ablend);
-
- OUT_BATCH(_3DSTATE_ENABLES_1_CMD | DISABLE_LOGIC_OP |
- DISABLE_STENCIL_TEST | DISABLE_DEPTH_BIAS |
- DISABLE_SPEC_ADD | DISABLE_FOG | DISABLE_ALPHA_TEST |
- ENABLE_COLOR_BLEND | DISABLE_DEPTH_TEST);
- /* We have to explicitly say we don't want write disabled */
- OUT_BATCH(_3DSTATE_ENABLES_2_CMD | ENABLE_COLOR_MASK |
- DISABLE_STENCIL_WRITE | ENABLE_TEX_CACHE |
- DISABLE_DITHER | ENABLE_COLOR_WRITE |
- DISABLE_DEPTH_WRITE);
-
- if (i830_transform_is_affine(pI830->render_src_picture->transform))
- texcoordfmt |= (TEXCOORDFMT_2D << 0);
- else
- texcoordfmt |= (TEXCOORDFMT_3D << 0);
- if (pI830->render_mask) {
- if (i830_transform_is_affine(pI830->render_mask_picture->transform))
- texcoordfmt |= (TEXCOORDFMT_2D << 2);
+ I830Ptr pI830 = I830PTR(pScrn);
+ uint32_t vf2;
+ uint32_t texcoordfmt = 0;
+
+ pI830->needs_render_state_emit = FALSE;
+
+ IntelEmitInvarientState(pScrn);
+ pI830->last_3d = LAST_3D_RENDER;
+
+ BEGIN_BATCH(21);
+
+ OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
+ OUT_BATCH(BUF_3D_ID_COLOR_BACK | BUF_3D_USE_FENCE |
+ BUF_3D_PITCH(intel_get_pixmap_pitch(pI830->render_dst)));
+ OUT_RELOC_PIXMAP(pI830->render_dst,
+ I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
+
+ OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
+ OUT_BATCH(pI830->render_dst_format);
+
+ OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
+ OUT_BATCH(0);
+ OUT_BATCH(0); /* ymin, xmin */
+ OUT_BATCH(DRAW_YMAX(pI830->render_dst->drawable.height - 1) |
+ DRAW_XMAX(pI830->render_dst->drawable.width - 1));
+ OUT_BATCH(0); /* yorig, xorig */
+
+ OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 |
+ I1_LOAD_S(2) | I1_LOAD_S(3) | I1_LOAD_S(8) | 2);
+ if (pI830->render_mask)
+ vf2 = 2 << 12; /* 2 texture coord sets */
+ else
+ vf2 = 1 << 12;
+ OUT_BATCH(vf2); /* number of coordinate sets */
+ OUT_BATCH(S3_CULLMODE_NONE | S3_VERTEXHAS_XY);
+ OUT_BATCH(S8_ENABLE_COLOR_BLEND | S8_BLENDFUNC_ADD | pI830->
+ s8_blendctl | S8_ENABLE_COLOR_BUFFER_WRITE);
+
+ OUT_BATCH(_3DSTATE_INDPT_ALPHA_BLEND_CMD | DISABLE_INDPT_ALPHA_BLEND);
+
+ OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_2 |
+ LOAD_TEXTURE_BLEND_STAGE(0) | 1);
+ OUT_BATCH(pI830->cblend);
+ OUT_BATCH(pI830->ablend);
+
+ OUT_BATCH(_3DSTATE_ENABLES_1_CMD | DISABLE_LOGIC_OP |
+ DISABLE_STENCIL_TEST | DISABLE_DEPTH_BIAS |
+ DISABLE_SPEC_ADD | DISABLE_FOG | DISABLE_ALPHA_TEST |
+ ENABLE_COLOR_BLEND | DISABLE_DEPTH_TEST);
+ /* We have to explicitly say we don't want write disabled */
+ OUT_BATCH(_3DSTATE_ENABLES_2_CMD | ENABLE_COLOR_MASK |
+ DISABLE_STENCIL_WRITE | ENABLE_TEX_CACHE |
+ DISABLE_DITHER | ENABLE_COLOR_WRITE | DISABLE_DEPTH_WRITE);
+
+ if (i830_transform_is_affine(pI830->render_src_picture->transform))
+ texcoordfmt |= (TEXCOORDFMT_2D << 0);
else
- texcoordfmt |= (TEXCOORDFMT_3D << 2);
- }
- OUT_BATCH(_3DSTATE_VERTEX_FORMAT_2_CMD | texcoordfmt);
+ texcoordfmt |= (TEXCOORDFMT_3D << 0);
+ if (pI830->render_mask) {
+ if (i830_transform_is_affine
+ (pI830->render_mask_picture->transform))
+ texcoordfmt |= (TEXCOORDFMT_2D << 2);
+ else
+ texcoordfmt |= (TEXCOORDFMT_3D << 2);
+ }
+ OUT_BATCH(_3DSTATE_VERTEX_FORMAT_2_CMD | texcoordfmt);
- ADVANCE_BATCH();
+ ADVANCE_BATCH();
- i830_texture_setup(pI830->render_src_picture, pI830->render_src, 0);
- if (pI830->render_mask) {
- i830_texture_setup(pI830->render_mask_picture,
- pI830->render_mask, 1);
- }
+ i830_texture_setup(pI830->render_src_picture, pI830->render_src, 0);
+ if (pI830->render_mask) {
+ i830_texture_setup(pI830->render_mask_picture,
+ pI830->render_mask, 1);
+ }
}
/* Emit the vertices for a single composite rectangle.
@@ -617,166 +620,182 @@ static void
i830_emit_composite_primitive(PixmapPtr pDst,
int srcX, int srcY,
int maskX, int maskY,
- int dstX, int dstY,
- int w, int h)
+ int dstX, int dstY, int w, int h)
{
- ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- Bool is_affine_src, is_affine_mask = TRUE;
- int per_vertex, num_floats;
- float src_x[3], src_y[3], src_w[3], mask_x[3], mask_y[3], mask_w[3];
-
- per_vertex = 2; /* dest x/y */
-
- {
- float x = srcX + pI830->src_coord_adjust;
- float y = srcY + pI830->src_coord_adjust;
-
- is_affine_src = i830_transform_is_affine (pI830->transform[0]);
- if (is_affine_src) {
- if (!i830_get_transformed_coordinates(x, y,
- pI830->transform[0],
- &src_x[0], &src_y[0]))
- return;
-
- if (!i830_get_transformed_coordinates(x, y + h,
- pI830->transform[0],
- &src_x[1], &src_y[1]))
- return;
-
- if (!i830_get_transformed_coordinates(x + w, y + h,
- pI830->transform[0],
- &src_x[2], &src_y[2]))
- return;
-
- per_vertex += 2; /* src x/y */
- } else {
- if (!i830_get_transformed_coordinates_3d(x, y,
- pI830->transform[0],
- &src_x[0],
- &src_y[0],
- &src_w[0]))
- return;
-
- if (!i830_get_transformed_coordinates_3d(x, y + h,
- pI830->transform[0],
- &src_x[1],
- &src_y[1],
- &src_w[1]))
- return;
-
- if (!i830_get_transformed_coordinates_3d(x + w, y + h,
- pI830->transform[0],
- &src_x[2],
- &src_y[2],
- &src_w[2]))
- return;
-
- per_vertex += 3; /* src x/y/w */
+ ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ Bool is_affine_src, is_affine_mask = TRUE;
+ int per_vertex, num_floats;
+ float src_x[3], src_y[3], src_w[3], mask_x[3], mask_y[3], mask_w[3];
+
+ per_vertex = 2; /* dest x/y */
+
+ {
+ float x = srcX + pI830->src_coord_adjust;
+ float y = srcY + pI830->src_coord_adjust;
+
+ is_affine_src = i830_transform_is_affine(pI830->transform[0]);
+ if (is_affine_src) {
+ if (!i830_get_transformed_coordinates(x, y,
+ pI830->
+ transform[0],
+ &src_x[0],
+ &src_y[0]))
+ return;
+
+ if (!i830_get_transformed_coordinates(x, y + h,
+ pI830->
+ transform[0],
+ &src_x[1],
+ &src_y[1]))
+ return;
+
+ if (!i830_get_transformed_coordinates(x + w, y + h,
+ pI830->
+ transform[0],
+ &src_x[2],
+ &src_y[2]))
+ return;
+
+ per_vertex += 2; /* src x/y */
+ } else {
+ if (!i830_get_transformed_coordinates_3d(x, y,
+ pI830->
+ transform[0],
+ &src_x[0],
+ &src_y[0],
+ &src_w[0]))
+ return;
+
+ if (!i830_get_transformed_coordinates_3d(x, y + h,
+ pI830->
+ transform[0],
+ &src_x[1],
+ &src_y[1],
+ &src_w[1]))
+ return;
+
+ if (!i830_get_transformed_coordinates_3d(x + w, y + h,
+ pI830->
+ transform[0],
+ &src_x[2],
+ &src_y[2],
+ &src_w[2]))
+ return;
+
+ per_vertex += 3; /* src x/y/w */
+ }
}
- }
-
- if (pI830->render_mask) {
- float x = maskX + pI830->mask_coord_adjust;
- float y = maskY + pI830->mask_coord_adjust;
-
- is_affine_mask = i830_transform_is_affine (pI830->transform[1]);
- if (is_affine_mask) {
- if (!i830_get_transformed_coordinates(x, y,
- pI830->transform[1],
- &mask_x[0], &mask_y[0]))
- return;
-
- if (!i830_get_transformed_coordinates(x, y + h,
- pI830->transform[1],
- &mask_x[1], &mask_y[1]))
- return;
-
- if (!i830_get_transformed_coordinates(x + w, y + h,
- pI830->transform[1],
- &mask_x[2], &mask_y[2]))
- return;
-
- per_vertex += 2; /* mask x/y */
- } else {
- if (!i830_get_transformed_coordinates_3d(x, y,
- pI830->transform[1],
- &mask_x[0],
- &mask_y[0],
- &mask_w[0]))
- return;
-
- if (!i830_get_transformed_coordinates_3d(x, y + h,
- pI830->transform[1],
- &mask_x[1],
- &mask_y[1],
- &mask_w[1]))
- return;
-
- if (!i830_get_transformed_coordinates_3d(x + w, y + h,
- pI830->transform[1],
- &mask_x[2],
- &mask_y[2],
- &mask_w[2]))
- return;
-
- per_vertex += 3; /* mask x/y/w */
+
+ if (pI830->render_mask) {
+ float x = maskX + pI830->mask_coord_adjust;
+ float y = maskY + pI830->mask_coord_adjust;
+
+ is_affine_mask = i830_transform_is_affine(pI830->transform[1]);
+ if (is_affine_mask) {
+ if (!i830_get_transformed_coordinates(x, y,
+ pI830->
+ transform[1],
+ &mask_x[0],
+ &mask_y[0]))
+ return;
+
+ if (!i830_get_transformed_coordinates(x, y + h,
+ pI830->
+ transform[1],
+ &mask_x[1],
+ &mask_y[1]))
+ return;
+
+ if (!i830_get_transformed_coordinates(x + w, y + h,
+ pI830->
+ transform[1],
+ &mask_x[2],
+ &mask_y[2]))
+ return;
+
+ per_vertex += 2; /* mask x/y */
+ } else {
+ if (!i830_get_transformed_coordinates_3d(x, y,
+ pI830->
+ transform[1],
+ &mask_x[0],
+ &mask_y[0],
+ &mask_w[0]))
+ return;
+
+ if (!i830_get_transformed_coordinates_3d(x, y + h,
+ pI830->
+ transform[1],
+ &mask_x[1],
+ &mask_y[1],
+ &mask_w[1]))
+ return;
+
+ if (!i830_get_transformed_coordinates_3d(x + w, y + h,
+ pI830->
+ transform[1],
+ &mask_x[2],
+ &mask_y[2],
+ &mask_w[2]))
+ return;
+
+ per_vertex += 3; /* mask x/y/w */
+ }
}
- }
-
- num_floats = 3 * per_vertex;
-
- BEGIN_BATCH(1 + num_floats);
-
- OUT_BATCH(PRIM3D_INLINE | PRIM3D_RECTLIST | (num_floats-1));
- OUT_BATCH_F(pI830->dst_coord_adjust + dstX + w);
- OUT_BATCH_F(pI830->dst_coord_adjust + dstY + h);
- OUT_BATCH_F(src_x[2] / pI830->scale_units[0][0]);
- OUT_BATCH_F(src_y[2] / pI830->scale_units[0][1]);
- if (!is_affine_src) {
- OUT_BATCH_F(src_w[2]);
- }
- if (pI830->render_mask) {
- OUT_BATCH_F(mask_x[2] / pI830->scale_units[1][0]);
- OUT_BATCH_F(mask_y[2] / pI830->scale_units[1][1]);
- if (!is_affine_mask) {
- OUT_BATCH_F(mask_w[2]);
+
+ num_floats = 3 * per_vertex;
+
+ BEGIN_BATCH(1 + num_floats);
+
+ OUT_BATCH(PRIM3D_INLINE | PRIM3D_RECTLIST | (num_floats - 1));
+ OUT_BATCH_F(pI830->dst_coord_adjust + dstX + w);
+ OUT_BATCH_F(pI830->dst_coord_adjust + dstY + h);
+ OUT_BATCH_F(src_x[2] / pI830->scale_units[0][0]);
+ OUT_BATCH_F(src_y[2] / pI830->scale_units[0][1]);
+ if (!is_affine_src) {
+ OUT_BATCH_F(src_w[2]);
}
- }
-
- OUT_BATCH_F(pI830->dst_coord_adjust + dstX);
- OUT_BATCH_F(pI830->dst_coord_adjust + dstY + h);
- OUT_BATCH_F(src_x[1] / pI830->scale_units[0][0]);
- OUT_BATCH_F(src_y[1] / pI830->scale_units[0][1]);
- if (!is_affine_src) {
- OUT_BATCH_F(src_w[1]);
- }
- if (pI830->render_mask) {
- OUT_BATCH_F(mask_x[1] / pI830->scale_units[1][0]);
- OUT_BATCH_F(mask_y[1] / pI830->scale_units[1][1]);
- if (!is_affine_mask) {
- OUT_BATCH_F(mask_w[1]);
+ if (pI830->render_mask) {
+ OUT_BATCH_F(mask_x[2] / pI830->scale_units[1][0]);
+ OUT_BATCH_F(mask_y[2] / pI830->scale_units[1][1]);
+ if (!is_affine_mask) {
+ OUT_BATCH_F(mask_w[2]);
+ }
}
- }
-
- OUT_BATCH_F(pI830->dst_coord_adjust + dstX);
- OUT_BATCH_F(pI830->dst_coord_adjust + dstY);
- OUT_BATCH_F(src_x[0] / pI830->scale_units[0][0]);
- OUT_BATCH_F(src_y[0] / pI830->scale_units[0][1]);
- if (!is_affine_src) {
- OUT_BATCH_F(src_w[0]);
- }
- if (pI830->render_mask) {
- OUT_BATCH_F(mask_x[0] / pI830->scale_units[1][0]);
- OUT_BATCH_F(mask_y[0] / pI830->scale_units[1][1]);
- if (!is_affine_mask) {
- OUT_BATCH_F(mask_w[0]);
+
+ OUT_BATCH_F(pI830->dst_coord_adjust + dstX);
+ OUT_BATCH_F(pI830->dst_coord_adjust + dstY + h);
+ OUT_BATCH_F(src_x[1] / pI830->scale_units[0][0]);
+ OUT_BATCH_F(src_y[1] / pI830->scale_units[0][1]);
+ if (!is_affine_src) {
+ OUT_BATCH_F(src_w[1]);
+ }
+ if (pI830->render_mask) {
+ OUT_BATCH_F(mask_x[1] / pI830->scale_units[1][0]);
+ OUT_BATCH_F(mask_y[1] / pI830->scale_units[1][1]);
+ if (!is_affine_mask) {
+ OUT_BATCH_F(mask_w[1]);
+ }
}
- }
- ADVANCE_BATCH();
-}
+ OUT_BATCH_F(pI830->dst_coord_adjust + dstX);
+ OUT_BATCH_F(pI830->dst_coord_adjust + dstY);
+ OUT_BATCH_F(src_x[0] / pI830->scale_units[0][0]);
+ OUT_BATCH_F(src_y[0] / pI830->scale_units[0][1]);
+ if (!is_affine_src) {
+ OUT_BATCH_F(src_w[0]);
+ }
+ if (pI830->render_mask) {
+ OUT_BATCH_F(mask_x[0] / pI830->scale_units[1][0]);
+ OUT_BATCH_F(mask_y[0] / pI830->scale_units[1][1]);
+ if (!is_affine_mask) {
+ OUT_BATCH_F(mask_w[0]);
+ }
+ }
+ ADVANCE_BATCH();
+}
/**
* Do a single rectangle composite operation.
@@ -785,30 +804,28 @@ void
i830_composite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY,
int dstX, int dstY, int w, int h)
{
- ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
+ ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
- intel_batch_start_atomic(pScrn,
- 58 + /* invarient */
- 22 + /* setup */
- 20 + /* 2 * setup_texture */
- 1 + 30 /* verts */);
+ intel_batch_start_atomic(pScrn, 58 + /* invarient */
+ 22 + /* setup */
+ 20 + /* 2 * setup_texture */
+ 1 + 30 /* verts */ );
- if (pI830->needs_render_state_emit)
- i830_emit_composite_state(pScrn);
+ if (pI830->needs_render_state_emit)
+ i830_emit_composite_state(pScrn);
- i830_emit_composite_primitive(pDst, srcX, srcY, maskX, maskY, dstX, dstY,
- w, h);
+ i830_emit_composite_primitive(pDst, srcX, srcY, maskX, maskY, dstX,
+ dstY, w, h);
- intel_batch_end_atomic(pScrn);
+ intel_batch_end_atomic(pScrn);
- i830_debug_sync(pScrn);
+ i830_debug_sync(pScrn);
}
-void
-i830_batch_flush_notify(ScrnInfoPtr scrn)
+void i830_batch_flush_notify(ScrnInfoPtr scrn)
{
- I830Ptr i830 = I830PTR(scrn);
+ I830Ptr i830 = I830PTR(scrn);
- i830->needs_render_state_emit = TRUE;
+ i830->needs_render_state_emit = TRUE;
}
diff --git a/src/i830_uxa.c b/src/i830_uxa.c
index df77259f..ecd654e3 100644
--- a/src/i830_uxa.c
+++ b/src/i830_uxa.c
@@ -39,44 +39,42 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <string.h>
#include <sys/mman.h>
-const int I830CopyROP[16] =
-{
- ROP_0, /* GXclear */
- ROP_DSa, /* GXand */
- ROP_SDna, /* GXandReverse */
- ROP_S, /* GXcopy */
- ROP_DSna, /* GXandInverted */
- ROP_D, /* GXnoop */
- ROP_DSx, /* GXxor */
- ROP_DSo, /* GXor */
- ROP_DSon, /* GXnor */
- ROP_DSxn, /* GXequiv */
- ROP_Dn, /* GXinvert*/
- ROP_SDno, /* GXorReverse */
- ROP_Sn, /* GXcopyInverted */
- ROP_DSno, /* GXorInverted */
- ROP_DSan, /* GXnand */
- ROP_1 /* GXset */
+const int I830CopyROP[16] = {
+ ROP_0, /* GXclear */
+ ROP_DSa, /* GXand */
+ ROP_SDna, /* GXandReverse */
+ ROP_S, /* GXcopy */
+ ROP_DSna, /* GXandInverted */
+ ROP_D, /* GXnoop */
+ ROP_DSx, /* GXxor */
+ ROP_DSo, /* GXor */
+ ROP_DSon, /* GXnor */
+ ROP_DSxn, /* GXequiv */
+ ROP_Dn, /* GXinvert */
+ ROP_SDno, /* GXorReverse */
+ ROP_Sn, /* GXcopyInverted */
+ ROP_DSno, /* GXorInverted */
+ ROP_DSan, /* GXnand */
+ ROP_1 /* GXset */
};
-const int I830PatternROP[16] =
-{
- ROP_0,
- ROP_DPa,
- ROP_PDna,
- ROP_P,
- ROP_DPna,
- ROP_D,
- ROP_DPx,
- ROP_DPo,
- ROP_DPon,
- ROP_PDxn,
- ROP_Dn,
- ROP_PDno,
- ROP_Pn,
- ROP_DPno,
- ROP_DPan,
- ROP_1
+const int I830PatternROP[16] = {
+ ROP_0,
+ ROP_DPa,
+ ROP_PDna,
+ ROP_P,
+ ROP_DPna,
+ ROP_D,
+ ROP_DPx,
+ ROP_DPo,
+ ROP_DPon,
+ ROP_PDxn,
+ ROP_Dn,
+ ROP_PDno,
+ ROP_Pn,
+ ROP_DPno,
+ ROP_DPan,
+ ROP_1
};
static int uxa_pixmap_index;
@@ -88,56 +86,56 @@ static int uxa_pixmap_index;
* buffer. At the point where we are tiling some pixmaps managed by the
* general allocator, we should move this to using pixmap privates.
*/
-Bool
-i830_pixmap_tiled(PixmapPtr pPixmap)
+Bool i830_pixmap_tiled(PixmapPtr pPixmap)
{
- dri_bo *bo;
- uint32_t tiling_mode, swizzle_mode;
- int ret;
+ dri_bo *bo;
+ uint32_t tiling_mode, swizzle_mode;
+ int ret;
- bo = i830_get_pixmap_bo(pPixmap);
- assert(bo != NULL);
+ bo = i830_get_pixmap_bo(pPixmap);
+ assert(bo != NULL);
- ret = drm_intel_bo_get_tiling(bo, &tiling_mode, &swizzle_mode);
- if (ret != 0) {
- FatalError("Couldn't get tiling on bo %p: %s\n",
- bo, strerror(-ret));
- }
+ ret = drm_intel_bo_get_tiling(bo, &tiling_mode, &swizzle_mode);
+ if (ret != 0) {
+ FatalError("Couldn't get tiling on bo %p: %s\n",
+ bo, strerror(-ret));
+ }
- return tiling_mode != I915_TILING_NONE;
+ return tiling_mode != I915_TILING_NONE;
}
Bool
-i830_get_aperture_space(ScrnInfoPtr pScrn, drm_intel_bo **bo_table, int num_bos)
+i830_get_aperture_space(ScrnInfoPtr pScrn, drm_intel_bo ** bo_table,
+ int num_bos)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- if (pI830->batch_bo == NULL)
- I830FALLBACK("VT inactive\n");
+ if (pI830->batch_bo == NULL)
+ I830FALLBACK("VT inactive\n");
- bo_table[0] = pI830->batch_bo;
- if (drm_intel_bufmgr_check_aperture_space(bo_table, num_bos) != 0) {
- intel_batch_flush(pScrn, FALSE);
bo_table[0] = pI830->batch_bo;
- if (drm_intel_bufmgr_check_aperture_space(bo_table, num_bos) != 0)
- I830FALLBACK("Couldn't get aperture space for BOs\n");
- }
- return TRUE;
+ if (drm_intel_bufmgr_check_aperture_space(bo_table, num_bos) != 0) {
+ intel_batch_flush(pScrn, FALSE);
+ bo_table[0] = pI830->batch_bo;
+ if (drm_intel_bufmgr_check_aperture_space(bo_table, num_bos) !=
+ 0)
+ I830FALLBACK("Couldn't get aperture space for BOs\n");
+ }
+ return TRUE;
}
-static unsigned long
-i830_pixmap_pitch(PixmapPtr pixmap)
+static unsigned long i830_pixmap_pitch(PixmapPtr pixmap)
{
- return pixmap->devKind;
+ return pixmap->devKind;
}
-static int
-i830_pixmap_pitch_is_aligned(PixmapPtr pixmap)
+static int i830_pixmap_pitch_is_aligned(PixmapPtr pixmap)
{
- ScrnInfoPtr pScrn = xf86Screens[pixmap->drawable.pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
+ ScrnInfoPtr pScrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
- return i830_pixmap_pitch(pixmap) % pI830->accel_pixmap_pitch_alignment == 0;
+ return i830_pixmap_pitch(pixmap) %
+ pI830->accel_pixmap_pitch_alignment == 0;
}
/**
@@ -146,91 +144,91 @@ i830_pixmap_pitch_is_aligned(PixmapPtr pixmap)
static Bool
i830_uxa_prepare_solid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- unsigned long pitch;
- drm_intel_bo *bo_table[] = {
- NULL, /* batch_bo */
- i830_get_pixmap_bo(pPixmap),
- };
+ ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ unsigned long pitch;
+ drm_intel_bo *bo_table[] = {
+ NULL, /* batch_bo */
+ i830_get_pixmap_bo(pPixmap),
+ };
- if (!UXA_PM_IS_SOLID(&pPixmap->drawable, planemask))
- I830FALLBACK("planemask is not solid");
+ if (!UXA_PM_IS_SOLID(&pPixmap->drawable, planemask))
+ I830FALLBACK("planemask is not solid");
- if (pPixmap->drawable.bitsPerPixel == 24)
- I830FALLBACK("solid 24bpp unsupported!\n");
+ if (pPixmap->drawable.bitsPerPixel == 24)
+ I830FALLBACK("solid 24bpp unsupported!\n");
- if (pPixmap->drawable.bitsPerPixel < 8)
- I830FALLBACK("under 8bpp pixmaps unsupported\n");
+ if (pPixmap->drawable.bitsPerPixel < 8)
+ I830FALLBACK("under 8bpp pixmaps unsupported\n");
- i830_exa_check_pitch_2d(pPixmap);
+ i830_exa_check_pitch_2d(pPixmap);
- pitch = i830_pixmap_pitch(pPixmap);
+ pitch = i830_pixmap_pitch(pPixmap);
- if (!i830_pixmap_pitch_is_aligned(pPixmap))
- I830FALLBACK("pixmap pitch not aligned");
+ if (!i830_pixmap_pitch_is_aligned(pPixmap))
+ I830FALLBACK("pixmap pitch not aligned");
- if (!i830_get_aperture_space(pScrn, bo_table, ARRAY_SIZE(bo_table)))
- return FALSE;
+ if (!i830_get_aperture_space(pScrn, bo_table, ARRAY_SIZE(bo_table)))
+ return FALSE;
- pI830->BR[13] = (I830PatternROP[alu] & 0xff) << 16 ;
- switch (pPixmap->drawable.bitsPerPixel) {
+ pI830->BR[13] = (I830PatternROP[alu] & 0xff) << 16;
+ switch (pPixmap->drawable.bitsPerPixel) {
case 8:
- break;
+ break;
case 16:
- /* RGB565 */
- pI830->BR[13] |= (1 << 24);
- break;
+ /* RGB565 */
+ pI830->BR[13] |= (1 << 24);
+ break;
case 32:
- /* RGB8888 */
- pI830->BR[13] |= ((1 << 24) | (1 << 25));
- break;
- }
- pI830->BR[16] = fg;
- return TRUE;
+ /* RGB8888 */
+ pI830->BR[13] |= ((1 << 24) | (1 << 25));
+ break;
+ }
+ pI830->BR[16] = fg;
+ return TRUE;
}
-static void
-i830_uxa_solid(PixmapPtr pPixmap, int x1, int y1, int x2, int y2)
+static void i830_uxa_solid(PixmapPtr pPixmap, int x1, int y1, int x2, int y2)
{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- unsigned long pitch;
- uint32_t cmd;
+ ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ unsigned long pitch;
+ uint32_t cmd;
- pitch = i830_pixmap_pitch(pPixmap);
+ pitch = i830_pixmap_pitch(pPixmap);
- {
- BEGIN_BATCH(6);
+ {
+ BEGIN_BATCH(6);
- cmd = XY_COLOR_BLT_CMD;
+ cmd = XY_COLOR_BLT_CMD;
- if (pPixmap->drawable.bitsPerPixel == 32)
- cmd |= XY_COLOR_BLT_WRITE_ALPHA | XY_COLOR_BLT_WRITE_RGB;
+ if (pPixmap->drawable.bitsPerPixel == 32)
+ cmd |=
+ XY_COLOR_BLT_WRITE_ALPHA | XY_COLOR_BLT_WRITE_RGB;
- if (IS_I965G(pI830) && i830_pixmap_tiled(pPixmap)) {
- assert((pitch % 512) == 0);
- pitch >>= 2;
- cmd |= XY_COLOR_BLT_TILED;
- }
+ if (IS_I965G(pI830) && i830_pixmap_tiled(pPixmap)) {
+ assert((pitch % 512) == 0);
+ pitch >>= 2;
+ cmd |= XY_COLOR_BLT_TILED;
+ }
- OUT_BATCH(cmd);
+ OUT_BATCH(cmd);
- OUT_BATCH(pI830->BR[13] | pitch);
- OUT_BATCH((y1 << 16) | (x1 & 0xffff));
- OUT_BATCH((y2 << 16) | (x2 & 0xffff));
- OUT_RELOC_PIXMAP(pPixmap, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
- OUT_BATCH(pI830->BR[16]);
- ADVANCE_BATCH();
- }
+ OUT_BATCH(pI830->BR[13] | pitch);
+ OUT_BATCH((y1 << 16) | (x1 & 0xffff));
+ OUT_BATCH((y2 << 16) | (x2 & 0xffff));
+ OUT_RELOC_PIXMAP(pPixmap, I915_GEM_DOMAIN_RENDER,
+ I915_GEM_DOMAIN_RENDER, 0);
+ OUT_BATCH(pI830->BR[16]);
+ ADVANCE_BATCH();
+ }
}
-static void
-i830_uxa_done_solid(PixmapPtr pPixmap)
+static void i830_uxa_done_solid(PixmapPtr pPixmap)
{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
+ ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- i830_debug_sync(pScrn);
+ i830_debug_sync(pScrn);
}
/**
@@ -241,137 +239,135 @@ static Bool
i830_uxa_prepare_copy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir,
int ydir, int alu, Pixel planemask)
{
- ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- drm_intel_bo *bo_table[] = {
- NULL, /* batch_bo */
- i830_get_pixmap_bo(pSrcPixmap),
- i830_get_pixmap_bo(pDstPixmap),
- };
-
- if (!UXA_PM_IS_SOLID(&pSrcPixmap->drawable, planemask))
- I830FALLBACK("planemask is not solid");
-
- if (pDstPixmap->drawable.bitsPerPixel < 8)
- I830FALLBACK("under 8bpp pixmaps unsupported\n");
-
- if (!i830_get_aperture_space(pScrn, bo_table, ARRAY_SIZE(bo_table)))
- return FALSE;
-
- i830_exa_check_pitch_2d(pSrcPixmap);
- i830_exa_check_pitch_2d(pDstPixmap);
-
- pI830->pSrcPixmap = pSrcPixmap;
-
- pI830->BR[13] = I830CopyROP[alu] << 16;
-
- switch (pSrcPixmap->drawable.bitsPerPixel) {
- case 8:
- break;
- case 16:
- pI830->BR[13] |= (1 << 24);
- break;
- case 32:
- pI830->BR[13] |= ((1 << 25) | (1 << 24));
- break;
- }
- return TRUE;
+ ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ drm_intel_bo *bo_table[] = {
+ NULL, /* batch_bo */
+ i830_get_pixmap_bo(pSrcPixmap),
+ i830_get_pixmap_bo(pDstPixmap),
+ };
+
+ if (!UXA_PM_IS_SOLID(&pSrcPixmap->drawable, planemask))
+ I830FALLBACK("planemask is not solid");
+
+ if (pDstPixmap->drawable.bitsPerPixel < 8)
+ I830FALLBACK("under 8bpp pixmaps unsupported\n");
+
+ if (!i830_get_aperture_space(pScrn, bo_table, ARRAY_SIZE(bo_table)))
+ return FALSE;
+
+ i830_exa_check_pitch_2d(pSrcPixmap);
+ i830_exa_check_pitch_2d(pDstPixmap);
+
+ pI830->pSrcPixmap = pSrcPixmap;
+
+ pI830->BR[13] = I830CopyROP[alu] << 16;
+
+ switch (pSrcPixmap->drawable.bitsPerPixel) {
+ case 8:
+ break;
+ case 16:
+ pI830->BR[13] |= (1 << 24);
+ break;
+ case 32:
+ pI830->BR[13] |= ((1 << 25) | (1 << 24));
+ break;
+ }
+ return TRUE;
}
static void
i830_uxa_copy(PixmapPtr pDstPixmap, int src_x1, int src_y1, int dst_x1,
int dst_y1, int w, int h)
{
- ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- uint32_t cmd;
- int dst_x2, dst_y2;
- unsigned int dst_pitch, src_pitch;
-
- dst_x2 = dst_x1 + w;
- dst_y2 = dst_y1 + h;
-
- dst_pitch = i830_pixmap_pitch(pDstPixmap);
- src_pitch = i830_pixmap_pitch(pI830->pSrcPixmap);
-
- {
- BEGIN_BATCH(8);
-
- cmd = XY_SRC_COPY_BLT_CMD;
-
- if (pDstPixmap->drawable.bitsPerPixel == 32)
- cmd |= XY_SRC_COPY_BLT_WRITE_ALPHA | XY_SRC_COPY_BLT_WRITE_RGB;
-
- if (IS_I965G(pI830)) {
- if (i830_pixmap_tiled(pDstPixmap)) {
- assert((dst_pitch % 512) == 0);
- dst_pitch >>= 2;
- cmd |= XY_SRC_COPY_BLT_DST_TILED;
- }
-
- if (i830_pixmap_tiled(pI830->pSrcPixmap)) {
- assert((src_pitch % 512) == 0);
- src_pitch >>= 2;
- cmd |= XY_SRC_COPY_BLT_SRC_TILED;
- }
- }
+ ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ uint32_t cmd;
+ int dst_x2, dst_y2;
+ unsigned int dst_pitch, src_pitch;
- OUT_BATCH(cmd);
+ dst_x2 = dst_x1 + w;
+ dst_y2 = dst_y1 + h;
- OUT_BATCH(pI830->BR[13] | dst_pitch);
- OUT_BATCH((dst_y1 << 16) | (dst_x1 & 0xffff));
- OUT_BATCH((dst_y2 << 16) | (dst_x2 & 0xffff));
- OUT_RELOC_PIXMAP(pDstPixmap, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
- OUT_BATCH((src_y1 << 16) | (src_x1 & 0xffff));
- OUT_BATCH(src_pitch);
- OUT_RELOC_PIXMAP(pI830->pSrcPixmap, I915_GEM_DOMAIN_RENDER, 0, 0);
+ dst_pitch = i830_pixmap_pitch(pDstPixmap);
+ src_pitch = i830_pixmap_pitch(pI830->pSrcPixmap);
- ADVANCE_BATCH();
- }
+ {
+ BEGIN_BATCH(8);
+
+ cmd = XY_SRC_COPY_BLT_CMD;
+
+ if (pDstPixmap->drawable.bitsPerPixel == 32)
+ cmd |=
+ XY_SRC_COPY_BLT_WRITE_ALPHA |
+ XY_SRC_COPY_BLT_WRITE_RGB;
+
+ if (IS_I965G(pI830)) {
+ if (i830_pixmap_tiled(pDstPixmap)) {
+ assert((dst_pitch % 512) == 0);
+ dst_pitch >>= 2;
+ cmd |= XY_SRC_COPY_BLT_DST_TILED;
+ }
+
+ if (i830_pixmap_tiled(pI830->pSrcPixmap)) {
+ assert((src_pitch % 512) == 0);
+ src_pitch >>= 2;
+ cmd |= XY_SRC_COPY_BLT_SRC_TILED;
+ }
+ }
+
+ OUT_BATCH(cmd);
+
+ OUT_BATCH(pI830->BR[13] | dst_pitch);
+ OUT_BATCH((dst_y1 << 16) | (dst_x1 & 0xffff));
+ OUT_BATCH((dst_y2 << 16) | (dst_x2 & 0xffff));
+ OUT_RELOC_PIXMAP(pDstPixmap, I915_GEM_DOMAIN_RENDER,
+ I915_GEM_DOMAIN_RENDER, 0);
+ OUT_BATCH((src_y1 << 16) | (src_x1 & 0xffff));
+ OUT_BATCH(src_pitch);
+ OUT_RELOC_PIXMAP(pI830->pSrcPixmap, I915_GEM_DOMAIN_RENDER, 0,
+ 0);
+
+ ADVANCE_BATCH();
+ }
}
-static void
-i830_uxa_done_copy(PixmapPtr pDstPixmap)
+static void i830_uxa_done_copy(PixmapPtr pDstPixmap)
{
- ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
+ ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
- i830_debug_sync(pScrn);
+ i830_debug_sync(pScrn);
}
-
/**
* Do any cleanup from the Composite operation.
*
* This is shared between i830 through i965.
*/
-void
-i830_done_composite(PixmapPtr pDst)
+void i830_done_composite(PixmapPtr pDst)
{
- ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
+ ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
- i830_debug_sync(pScrn);
+ i830_debug_sync(pScrn);
}
#define xFixedToFloat(val) \
((float)xFixedToInt(val) + ((float)xFixedFrac(val) / 65536.0))
static Bool
-_i830_transform_point (PictTransformPtr transform,
- float x,
- float y,
- float result[3])
+_i830_transform_point(PictTransformPtr transform,
+ float x, float y, float result[3])
{
- int j;
-
- for (j = 0; j < 3; j++)
- {
- result[j] = (xFixedToFloat (transform->matrix[j][0]) * x +
- xFixedToFloat (transform->matrix[j][1]) * y +
- xFixedToFloat (transform->matrix[j][2]));
- }
- if (!result[2])
- return FALSE;
- return TRUE;
+ int j;
+
+ for (j = 0; j < 3; j++) {
+ result[j] = (xFixedToFloat(transform->matrix[j][0]) * x +
+ xFixedToFloat(transform->matrix[j][1]) * y +
+ xFixedToFloat(transform->matrix[j][2]));
+ }
+ if (!result[2])
+ return FALSE;
+ return TRUE;
}
/**
@@ -383,18 +379,19 @@ Bool
i830_get_transformed_coordinates(int x, int y, PictTransformPtr transform,
float *x_out, float *y_out)
{
- if (transform == NULL) {
- *x_out = x;
- *y_out = y;
- } else {
- float result[3];
-
- if (!_i830_transform_point (transform, (float) x, (float) y, result))
- return FALSE;
- *x_out = result[0] / result[2];
- *y_out = result[1] / result[2];
- }
- return TRUE;
+ if (transform == NULL) {
+ *x_out = x;
+ *y_out = y;
+ } else {
+ float result[3];
+
+ if (!_i830_transform_point
+ (transform, (float)x, (float)y, result))
+ return FALSE;
+ *x_out = result[0] / result[2];
+ *y_out = result[1] / result[2];
+ }
+ return TRUE;
}
/**
@@ -406,20 +403,21 @@ Bool
i830_get_transformed_coordinates_3d(int x, int y, PictTransformPtr transform,
float *x_out, float *y_out, float *w_out)
{
- if (transform == NULL) {
- *x_out = x;
- *y_out = y;
- *w_out = 1;
- } else {
- float result[3];
-
- if (!_i830_transform_point (transform, (float) x, (float) y, result))
- return FALSE;
- *x_out = result[0];
- *y_out = result[1];
- *w_out = result[2];
- }
- return TRUE;
+ if (transform == NULL) {
+ *x_out = x;
+ *y_out = y;
+ *w_out = 1;
+ } else {
+ float result[3];
+
+ if (!_i830_transform_point
+ (transform, (float)x, (float)y, result))
+ return FALSE;
+ *x_out = result[0];
+ *y_out = result[1];
+ *w_out = result[2];
+ }
+ return TRUE;
}
/**
@@ -427,312 +425,300 @@ i830_get_transformed_coordinates_3d(int x, int y, PictTransformPtr transform,
*
* transform may be null.
*/
-Bool
-i830_transform_is_affine (PictTransformPtr t)
+Bool i830_transform_is_affine(PictTransformPtr t)
{
- if (t == NULL)
- return TRUE;
- return t->matrix[2][0] == 0 && t->matrix[2][1] == 0;
+ if (t == NULL)
+ return TRUE;
+ return t->matrix[2][0] == 0 && t->matrix[2][1] == 0;
}
-dri_bo *
-i830_get_pixmap_bo(PixmapPtr pixmap)
+dri_bo *i830_get_pixmap_bo(PixmapPtr pixmap)
{
- return dixLookupPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
+ return dixLookupPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
}
-void
-i830_set_pixmap_bo(PixmapPtr pixmap, dri_bo *bo)
+void i830_set_pixmap_bo(PixmapPtr pixmap, dri_bo * bo)
{
- dri_bo *old_bo = i830_get_pixmap_bo (pixmap);
+ dri_bo *old_bo = i830_get_pixmap_bo(pixmap);
- if (old_bo)
- dri_bo_unreference (old_bo);
- if (bo != NULL)
- dri_bo_reference(bo);
- dixSetPrivate(&pixmap->devPrivates, &uxa_pixmap_index, bo);
+ if (old_bo)
+ dri_bo_unreference(old_bo);
+ if (bo != NULL)
+ dri_bo_reference(bo);
+ dixSetPrivate(&pixmap->devPrivates, &uxa_pixmap_index, bo);
}
-static void
-i830_uxa_set_pixmap_bo (PixmapPtr pixmap, dri_bo *bo)
+static void i830_uxa_set_pixmap_bo(PixmapPtr pixmap, dri_bo * bo)
{
- dixSetPrivate(&pixmap->devPrivates, &uxa_pixmap_index, bo);
+ dixSetPrivate(&pixmap->devPrivates, &uxa_pixmap_index, bo);
}
-static Bool
-i830_uxa_prepare_access (PixmapPtr pixmap, uxa_access_t access)
+static Bool i830_uxa_prepare_access(PixmapPtr pixmap, uxa_access_t access)
{
- dri_bo *bo = i830_get_pixmap_bo (pixmap);
- ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
- I830Ptr i830 = I830PTR(scrn);
+ dri_bo *bo = i830_get_pixmap_bo(pixmap);
+ ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+ I830Ptr i830 = I830PTR(scrn);
- intel_batch_flush(scrn, FALSE);
+ intel_batch_flush(scrn, FALSE);
- /* No VT sema or GEM? No GTT mapping. */
- if (!scrn->vtSema) {
- if (dri_bo_map(bo, access == UXA_ACCESS_RW) != 0)
- return FALSE;
- pixmap->devPrivate.ptr = bo->virtual;
- return TRUE;
- }
-
- /* Kernel manages fences at GTT map/fault time */
- if (bo->size < i830->max_gtt_map_size) {
- if (drm_intel_gem_bo_map_gtt(bo)) {
- xf86DrvMsg(scrn->scrnIndex, X_WARNING,
- "%s: bo map failed\n",
- __FUNCTION__);
- return FALSE;
+ /* No VT sema or GEM? No GTT mapping. */
+ if (!scrn->vtSema) {
+ if (dri_bo_map(bo, access == UXA_ACCESS_RW) != 0)
+ return FALSE;
+ pixmap->devPrivate.ptr = bo->virtual;
+ return TRUE;
}
- } else {
- if (dri_bo_map(bo, access == UXA_ACCESS_RW) != 0) {
- xf86DrvMsg(scrn->scrnIndex, X_WARNING,
- "%s: bo map failed\n",
- __FUNCTION__);
- return FALSE;
+
+ /* Kernel manages fences at GTT map/fault time */
+ if (bo->size < i830->max_gtt_map_size) {
+ if (drm_intel_gem_bo_map_gtt(bo)) {
+ xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+ "%s: bo map failed\n", __FUNCTION__);
+ return FALSE;
+ }
+ } else {
+ if (dri_bo_map(bo, access == UXA_ACCESS_RW) != 0) {
+ xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+ "%s: bo map failed\n", __FUNCTION__);
+ return FALSE;
+ }
}
- }
- pixmap->devPrivate.ptr = bo->virtual;
+ pixmap->devPrivate.ptr = bo->virtual;
- return TRUE;
+ return TRUE;
}
-static void
-i830_uxa_finish_access (PixmapPtr pixmap)
+static void i830_uxa_finish_access(PixmapPtr pixmap)
{
- dri_bo *bo = i830_get_pixmap_bo (pixmap);
+ dri_bo *bo = i830_get_pixmap_bo(pixmap);
+
+ if (bo) {
+ ScreenPtr screen = pixmap->drawable.pScreen;
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ I830Ptr i830 = I830PTR(scrn);
+
+ if (bo == i830->front_buffer->bo)
+ i830->need_flush = TRUE;
+
+ if (!scrn->vtSema) {
+ dri_bo_unmap(bo);
+ pixmap->devPrivate.ptr = NULL;
+ return;
+ }
+
+ if (bo->size < i830->max_gtt_map_size)
+ drm_intel_gem_bo_unmap_gtt(bo);
+ else
+ dri_bo_unmap(bo);
+ pixmap->devPrivate.ptr = NULL;
+ }
+}
- if (bo) {
- ScreenPtr screen = pixmap->drawable.pScreen;
+void i830_uxa_block_handler(ScreenPtr screen)
+{
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
I830Ptr i830 = I830PTR(scrn);
- if (bo == i830->front_buffer->bo)
- i830->need_flush = TRUE;
-
- if (!scrn->vtSema) {
- dri_bo_unmap(bo);
- pixmap->devPrivate.ptr = NULL;
- return;
+ if (i830->need_flush) {
+ dri_bo_wait_rendering(i830->front_buffer->bo);
+ i830->need_flush = FALSE;
}
+}
+
+static Bool i830_uxa_pixmap_is_offscreen(PixmapPtr pixmap)
+{
+ ScreenPtr screen = pixmap->drawable.pScreen;
- if (bo->size < i830->max_gtt_map_size)
- drm_intel_gem_bo_unmap_gtt(bo);
- else
- dri_bo_unmap(bo);
- pixmap->devPrivate.ptr = NULL;
- }
+ /* The front buffer is always in memory and pinned */
+ if (screen->GetScreenPixmap(screen) == pixmap)
+ return TRUE;
+
+ return i830_get_pixmap_bo(pixmap) != NULL;
}
-void
-i830_uxa_block_handler (ScreenPtr screen)
+static PixmapPtr
+i830_uxa_create_pixmap(ScreenPtr screen, int w, int h, int depth,
+ unsigned usage)
{
- ScrnInfoPtr scrn = xf86Screens[screen->myNum];
- I830Ptr i830 = I830PTR(scrn);
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ I830Ptr i830 = I830PTR(scrn);
+ dri_bo *bo;
+ int stride;
+ PixmapPtr pixmap;
+
+ if (w > 32767 || h > 32767)
+ return NullPixmap;
+
+ if (usage == CREATE_PIXMAP_USAGE_GLYPH_PICTURE)
+ return fbCreatePixmap(screen, w, h, depth, usage);
+
+ pixmap = fbCreatePixmap(screen, 0, 0, depth, usage);
+
+ if (w && h) {
+ unsigned int size;
+ uint32_t tiling = I915_TILING_NONE;
+ int pitch_align;
+
+ if (usage == INTEL_CREATE_PIXMAP_TILING_X) {
+ tiling = I915_TILING_X;
+ pitch_align = 512;
+ } else if (usage == INTEL_CREATE_PIXMAP_TILING_Y) {
+ tiling = I915_TILING_Y;
+ pitch_align = 512;
+ } else {
+ pitch_align = i830->accel_pixmap_pitch_alignment;
+ }
+
+ stride = ROUND_TO((w * pixmap->drawable.bitsPerPixel + 7) / 8,
+ pitch_align);
+
+ if (tiling == I915_TILING_NONE) {
+ /* Round the height up so that the GPU's access to a 2x2 aligned
+ * subspan doesn't address an invalid page offset beyond the
+ * end of the GTT.
+ */
+ size = stride * ALIGN(h, 2);
+ } else {
+ int aligned_h = h;
+ if (tiling == I915_TILING_X)
+ aligned_h = ALIGN(h, 8);
+ else
+ aligned_h = ALIGN(h, 32);
+
+ stride = i830_get_fence_pitch(i830, stride, tiling);
+ /* Round the object up to the size of the fence it will live in
+ * if necessary. We could potentially make the kernel allocate
+ * a larger aperture space and just bind the subset of pages in,
+ * but this is easier and also keeps us out of trouble (as much)
+ * with drm_intel_bufmgr_check_aperture().
+ */
+ size = i830_get_fence_size(i830, stride * aligned_h);
+ assert(size >= stride * aligned_h);
+ }
+
+ /* Fail very large allocations on 32-bit systems. Large BOs will
+ * tend to hit SW fallbacks frequently, and also will tend to fail
+ * to successfully map when doing SW fallbacks because we overcommit
+ * address space for BO access.
+ *
+ * Note that size should fit in 32 bits. We throw out >32767x32767x4,
+ * and pitch alignment could get us up to 32768x32767x4.
+ */
+ if (sizeof(unsigned long) == 4 &&
+ size > (unsigned int)(1024 * 1024 * 1024)) {
+ fbDestroyPixmap(pixmap);
+ return NullPixmap;
+ }
+
+ if (usage == UXA_CREATE_PIXMAP_FOR_MAP)
+ bo = drm_intel_bo_alloc(i830->bufmgr, "pixmap", size,
+ 0);
+ else
+ bo = drm_intel_bo_alloc_for_render(i830->bufmgr,
+ "pixmap", size, 0);
+ if (!bo) {
+ fbDestroyPixmap(pixmap);
+ return NullPixmap;
+ }
+
+ if (tiling != I915_TILING_NONE)
+ drm_intel_bo_set_tiling(bo, &tiling, stride);
+
+ screen->ModifyPixmapHeader(pixmap, w, h, 0, 0, stride, NULL);
+
+ i830_uxa_set_pixmap_bo(pixmap, bo);
+ }
- if (i830->need_flush) {
- dri_bo_wait_rendering (i830->front_buffer->bo);
- i830->need_flush = FALSE;
- }
+ return pixmap;
}
-static Bool
-i830_uxa_pixmap_is_offscreen(PixmapPtr pixmap)
+static Bool i830_uxa_destroy_pixmap(PixmapPtr pixmap)
{
- ScreenPtr screen = pixmap->drawable.pScreen;
+ if (pixmap->refcnt == 1) {
+ dri_bo *bo = i830_get_pixmap_bo(pixmap);
- /* The front buffer is always in memory and pinned */
- if (screen->GetScreenPixmap(screen) == pixmap)
+ if (bo)
+ dri_bo_unreference(bo);
+ }
+ fbDestroyPixmap(pixmap);
return TRUE;
-
- return i830_get_pixmap_bo (pixmap) != NULL;
}
-static PixmapPtr
-i830_uxa_create_pixmap (ScreenPtr screen, int w, int h, int depth, unsigned usage)
+void i830_uxa_create_screen_resources(ScreenPtr pScreen)
{
- ScrnInfoPtr scrn = xf86Screens[screen->myNum];
- I830Ptr i830 = I830PTR(scrn);
- dri_bo *bo;
- int stride;
- PixmapPtr pixmap;
-
- if (w > 32767 || h > 32767)
- return NullPixmap;
-
- if (usage == CREATE_PIXMAP_USAGE_GLYPH_PICTURE)
- return fbCreatePixmap (screen, w, h, depth, usage);
-
- pixmap = fbCreatePixmap (screen, 0, 0, depth, usage);
-
- if (w && h)
- {
- unsigned int size;
- uint32_t tiling = I915_TILING_NONE;
- int pitch_align;
-
- if (usage == INTEL_CREATE_PIXMAP_TILING_X) {
- tiling = I915_TILING_X;
- pitch_align = 512;
- } else if (usage == INTEL_CREATE_PIXMAP_TILING_Y) {
- tiling = I915_TILING_Y;
- pitch_align = 512;
- } else {
- pitch_align = i830->accel_pixmap_pitch_alignment;
+ ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
+ I830Ptr i830 = I830PTR(scrn);
+ dri_bo *bo = i830->front_buffer->bo;
+
+ if (bo != NULL) {
+ PixmapPtr pixmap = pScreen->GetScreenPixmap(pScreen);
+ i830_uxa_set_pixmap_bo(pixmap, bo);
+ dri_bo_reference(bo);
}
+}
- stride = ROUND_TO((w * pixmap->drawable.bitsPerPixel + 7) / 8,
- pitch_align);
+Bool i830_uxa_init(ScreenPtr pScreen)
+{
+ ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
+ I830Ptr i830 = I830PTR(scrn);
- if (tiling == I915_TILING_NONE) {
- /* Round the height up so that the GPU's access to a 2x2 aligned
- * subspan doesn't address an invalid page offset beyond the
- * end of the GTT.
- */
- size = stride * ALIGN(h, 2);
- } else {
- int aligned_h = h;
- if (tiling == I915_TILING_X)
- aligned_h = ALIGN(h, 8);
- else
- aligned_h = ALIGN(h, 32);
-
- stride = i830_get_fence_pitch(i830, stride, tiling);
- /* Round the object up to the size of the fence it will live in
- * if necessary. We could potentially make the kernel allocate
- * a larger aperture space and just bind the subset of pages in,
- * but this is easier and also keeps us out of trouble (as much)
- * with drm_intel_bufmgr_check_aperture().
- */
- size = i830_get_fence_size(i830, stride * aligned_h);
- assert(size >= stride * aligned_h);
- }
+ if (!dixRequestPrivate(&uxa_pixmap_index, 0))
+ return FALSE;
- /* Fail very large allocations on 32-bit systems. Large BOs will
- * tend to hit SW fallbacks frequently, and also will tend to fail
- * to successfully map when doing SW fallbacks because we overcommit
- * address space for BO access.
- *
- * Note that size should fit in 32 bits. We throw out >32767x32767x4,
- * and pitch alignment could get us up to 32768x32767x4.
- */
- if (sizeof(unsigned long) == 4 &&
- size > (unsigned int)(1024 * 1024 * 1024))
- {
- fbDestroyPixmap (pixmap);
- return NullPixmap;
- }
+ i830->uxa_driver = uxa_driver_alloc();
+ if (i830->uxa_driver == NULL)
+ return FALSE;
- if (usage == UXA_CREATE_PIXMAP_FOR_MAP)
- bo = drm_intel_bo_alloc(i830->bufmgr, "pixmap", size, 0);
- else
- bo = drm_intel_bo_alloc_for_render(i830->bufmgr, "pixmap", size, 0);
- if (!bo) {
- fbDestroyPixmap (pixmap);
- return NullPixmap;
+ memset(i830->uxa_driver, 0, sizeof(*i830->uxa_driver));
+
+ i830->bufferOffset = 0;
+ i830->uxa_driver->uxa_major = 1;
+ i830->uxa_driver->uxa_minor = 0;
+
+ /* Solid fill */
+ i830->uxa_driver->prepare_solid = i830_uxa_prepare_solid;
+ i830->uxa_driver->solid = i830_uxa_solid;
+ i830->uxa_driver->done_solid = i830_uxa_done_solid;
+
+ /* Copy */
+ i830->uxa_driver->prepare_copy = i830_uxa_prepare_copy;
+ i830->uxa_driver->copy = i830_uxa_copy;
+ i830->uxa_driver->done_copy = i830_uxa_done_copy;
+
+ /* Composite */
+ if (!IS_I9XX(i830)) {
+ i830->uxa_driver->check_composite = i830_check_composite;
+ i830->uxa_driver->prepare_composite = i830_prepare_composite;
+ i830->uxa_driver->composite = i830_composite;
+ i830->uxa_driver->done_composite = i830_done_composite;
+ } else if (IS_I915G(i830) || IS_I915GM(i830) ||
+ IS_I945G(i830) || IS_I945GM(i830) || IS_G33CLASS(i830)) {
+ i830->uxa_driver->check_composite = i915_check_composite;
+ i830->uxa_driver->prepare_composite = i915_prepare_composite;
+ i830->uxa_driver->composite = i915_composite;
+ i830->uxa_driver->done_composite = i830_done_composite;
+ } else {
+ i830->uxa_driver->check_composite = i965_check_composite;
+ i830->uxa_driver->prepare_composite = i965_prepare_composite;
+ i830->uxa_driver->composite = i965_composite;
+ i830->uxa_driver->done_composite = i830_done_composite;
}
- if (tiling != I915_TILING_NONE)
- drm_intel_bo_set_tiling(bo, &tiling, stride);
-
- screen->ModifyPixmapHeader (pixmap, w, h, 0, 0, stride, NULL);
-
- i830_uxa_set_pixmap_bo (pixmap, bo);
- }
+ i830->uxa_driver->prepare_access = i830_uxa_prepare_access;
+ i830->uxa_driver->finish_access = i830_uxa_finish_access;
+ i830->uxa_driver->pixmap_is_offscreen = i830_uxa_pixmap_is_offscreen;
- return pixmap;
-}
+ if (!uxa_driver_init(pScreen, i830->uxa_driver)) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "UXA initialization failed\n");
+ xfree(i830->uxa_driver);
+ return FALSE;
+ }
-static Bool
-i830_uxa_destroy_pixmap (PixmapPtr pixmap)
-{
- if (pixmap->refcnt == 1) {
- dri_bo *bo = i830_get_pixmap_bo (pixmap);
-
- if (bo)
- dri_bo_unreference (bo);
- }
- fbDestroyPixmap (pixmap);
- return TRUE;
-}
+ pScreen->CreatePixmap = i830_uxa_create_pixmap;
+ pScreen->DestroyPixmap = i830_uxa_destroy_pixmap;
-void i830_uxa_create_screen_resources(ScreenPtr pScreen)
-{
- ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
- I830Ptr i830 = I830PTR(scrn);
- dri_bo *bo = i830->front_buffer->bo;
-
- if (bo != NULL) {
- PixmapPtr pixmap = pScreen->GetScreenPixmap(pScreen);
- i830_uxa_set_pixmap_bo (pixmap, bo);
- dri_bo_reference(bo);
- }
-}
+ uxa_set_fallback_debug(pScreen, i830->fallback_debug);
-Bool
-i830_uxa_init (ScreenPtr pScreen)
-{
- ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
- I830Ptr i830 = I830PTR(scrn);
-
- if (!dixRequestPrivate(&uxa_pixmap_index, 0))
- return FALSE;
-
- i830->uxa_driver = uxa_driver_alloc();
- if (i830->uxa_driver == NULL)
- return FALSE;
-
- memset(i830->uxa_driver, 0, sizeof(*i830->uxa_driver));
-
- i830->bufferOffset = 0;
- i830->uxa_driver->uxa_major = 1;
- i830->uxa_driver->uxa_minor = 0;
-
- /* Solid fill */
- i830->uxa_driver->prepare_solid = i830_uxa_prepare_solid;
- i830->uxa_driver->solid = i830_uxa_solid;
- i830->uxa_driver->done_solid = i830_uxa_done_solid;
-
- /* Copy */
- i830->uxa_driver->prepare_copy = i830_uxa_prepare_copy;
- i830->uxa_driver->copy = i830_uxa_copy;
- i830->uxa_driver->done_copy = i830_uxa_done_copy;
-
- /* Composite */
- if (!IS_I9XX(i830)) {
- i830->uxa_driver->check_composite = i830_check_composite;
- i830->uxa_driver->prepare_composite = i830_prepare_composite;
- i830->uxa_driver->composite = i830_composite;
- i830->uxa_driver->done_composite = i830_done_composite;
- } else if (IS_I915G(i830) || IS_I915GM(i830) ||
- IS_I945G(i830) || IS_I945GM(i830) || IS_G33CLASS(i830))
- {
- i830->uxa_driver->check_composite = i915_check_composite;
- i830->uxa_driver->prepare_composite = i915_prepare_composite;
- i830->uxa_driver->composite = i915_composite;
- i830->uxa_driver->done_composite = i830_done_composite;
- } else {
- i830->uxa_driver->check_composite = i965_check_composite;
- i830->uxa_driver->prepare_composite = i965_prepare_composite;
- i830->uxa_driver->composite = i965_composite;
- i830->uxa_driver->done_composite = i830_done_composite;
- }
-
- i830->uxa_driver->prepare_access = i830_uxa_prepare_access;
- i830->uxa_driver->finish_access = i830_uxa_finish_access;
- i830->uxa_driver->pixmap_is_offscreen = i830_uxa_pixmap_is_offscreen;
-
- if(!uxa_driver_init(pScreen, i830->uxa_driver)) {
- xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "UXA initialization failed\n");
- xfree(i830->uxa_driver);
- return FALSE;
- }
-
- pScreen->CreatePixmap = i830_uxa_create_pixmap;
- pScreen->DestroyPixmap = i830_uxa_destroy_pixmap;
-
- uxa_set_fallback_debug(pScreen, i830->fallback_debug);
-
- return TRUE;
+ return TRUE;
}
diff --git a/src/i830_video.c b/src/i830_video.c
index 379a4318..820c2d82 100644
--- a/src/i830_video.c
+++ b/src/i830_video.c
@@ -77,7 +77,7 @@
#include "i915_hwmc.h"
#endif
-#define OFF_DELAY 250 /* milliseconds */
+#define OFF_DELAY 250 /* milliseconds */
#define FREE_DELAY 15000
#define OFF_TIMER 0x01
@@ -99,7 +99,7 @@ static int I830PutImage(ScrnInfoPtr, short, short, short, short, short, short,
short, short, int, unsigned char *, short, short,
Bool, RegionPtr, pointer, DrawablePtr);
static int I830QueryImageAttributes(ScrnInfoPtr, int, unsigned short *,
- unsigned short *, int *, int *);
+ unsigned short *, int *, int *);
#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
@@ -126,338 +126,336 @@ static Atom xvSyncToVblank;
/* client libraries expect an encoding */
static XF86VideoEncodingRec DummyEncoding[1] = {
- {
- 0,
- "XV_IMAGE",
- IMAGE_MAX_WIDTH, IMAGE_MAX_HEIGHT,
- {1, 1}
- }
+ {
+ 0,
+ "XV_IMAGE",
+ IMAGE_MAX_WIDTH, IMAGE_MAX_HEIGHT,
+ {1, 1}
+ }
};
#define NUM_FORMATS 3
static XF86VideoFormatRec Formats[NUM_FORMATS] = {
- {15, TrueColor}, {16, TrueColor}, {24, TrueColor}
+ {15, TrueColor}, {16, TrueColor}, {24, TrueColor}
};
#define CLONE_ATTRIBUTES 1
static XF86AttributeRec CloneAttributes[CLONE_ATTRIBUTES] = {
- {XvSettable | XvGettable, -1, 1, "XV_PIPE"}
+ {XvSettable | XvGettable, -1, 1, "XV_PIPE"}
};
#define NUM_ATTRIBUTES 4
static XF86AttributeRec Attributes[NUM_ATTRIBUTES] = {
- {XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"},
- {XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"},
- {XvSettable | XvGettable, 0, 255, "XV_CONTRAST"},
- {XvSettable | XvGettable, 0, 1023, "XV_SATURATION"}
+ {XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"},
+ {XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"},
+ {XvSettable | XvGettable, 0, 255, "XV_CONTRAST"},
+ {XvSettable | XvGettable, 0, 1023, "XV_SATURATION"}
};
#define NUM_TEXTURED_ATTRIBUTES 3
static XF86AttributeRec TexturedAttributes[NUM_TEXTURED_ATTRIBUTES] = {
- {XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"},
- {XvSettable | XvGettable, 0, 255, "XV_CONTRAST"},
- {XvSettable | XvGettable, -1, 1, "XV_SYNC_TO_VBLANK"},
+ {XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"},
+ {XvSettable | XvGettable, 0, 255, "XV_CONTRAST"},
+ {XvSettable | XvGettable, -1, 1, "XV_SYNC_TO_VBLANK"},
};
#define GAMMA_ATTRIBUTES 6
static XF86AttributeRec GammaAttributes[GAMMA_ATTRIBUTES] = {
- {XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA0"},
- {XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA1"},
- {XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA2"},
- {XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA3"},
- {XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA4"},
- {XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA5"}
+ {XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA0"},
+ {XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA1"},
+ {XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA2"},
+ {XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA3"},
+ {XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA4"},
+ {XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA5"}
};
#define NUM_IMAGES 5
static XF86ImageRec Images[NUM_IMAGES] = {
- XVIMAGE_YUY2,
- XVIMAGE_YV12,
- XVIMAGE_I420,
- XVIMAGE_UYVY,
+ XVIMAGE_YUY2,
+ XVIMAGE_YV12,
+ XVIMAGE_I420,
+ XVIMAGE_UYVY,
#ifdef INTEL_XVMC
- {
- /*
- * Below, a dummy picture type that is used in XvPutImage only to do
- * an overlay update. Introduced for the XvMC client lib.
- * Defined to have a zero data size.
- */
- FOURCC_XVMC,
- XvYUV,
- LSBFirst,
- {'X', 'V', 'M', 'C',
- 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0xAA, 0x00,
- 0x38, 0x9B, 0x71},
- 12,
- XvPlanar,
- 3,
- 0, 0, 0, 0,
- 8, 8, 8,
- 1, 2, 2,
- 1, 2, 2,
- {'Y', 'V', 'U',
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- XvTopToBottom
- },
+ {
+ /*
+ * Below, a dummy picture type that is used in XvPutImage only to do
+ * an overlay update. Introduced for the XvMC client lib.
+ * Defined to have a zero data size.
+ */
+ FOURCC_XVMC,
+ XvYUV,
+ LSBFirst,
+ {'X', 'V', 'M', 'C',
+ 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0xAA, 0x00,
+ 0x38, 0x9B, 0x71},
+ 12,
+ XvPlanar,
+ 3,
+ 0, 0, 0, 0,
+ 8, 8, 8,
+ 1, 2, 2,
+ 1, 2, 2,
+ {'Y', 'V', 'U',
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ XvTopToBottom},
#endif
};
#if VIDEO_DEBUG
-static void
-CompareOverlay(I830Ptr pI830, uint32_t * overlay, int size)
+static void CompareOverlay(I830Ptr pI830, uint32_t * overlay, int size)
{
- int i;
- uint32_t val;
- int bad = 0;
-
- for (i = 0; i < size; i += 4) {
- val = INREG(0x30100 + i);
- if (val != overlay[i / 4]) {
- OVERLAY_DEBUG("0x%05x value doesn't match (0x%lx != 0x%lx)\n",
- 0x30100 + i, val, overlay[i / 4]);
- bad++;
+ int i;
+ uint32_t val;
+ int bad = 0;
+
+ for (i = 0; i < size; i += 4) {
+ val = INREG(0x30100 + i);
+ if (val != overlay[i / 4]) {
+ OVERLAY_DEBUG
+ ("0x%05x value doesn't match (0x%lx != 0x%lx)\n",
+ 0x30100 + i, val, overlay[i / 4]);
+ bad++;
+ }
}
- }
- if (!bad)
- OVERLAY_DEBUG("CompareOverlay: no differences\n");
+ if (!bad)
+ OVERLAY_DEBUG("CompareOverlay: no differences\n");
}
#endif
/* kernel modesetting overlay functions */
-static Bool
-drmmode_has_overlay(ScrnInfoPtr pScrn)
+static Bool drmmode_has_overlay(ScrnInfoPtr pScrn)
{
#ifdef DRM_MODE_OVERLAY_LANDED
- I830Ptr p830 = I830PTR(pScrn);
- struct drm_i915_getparam gp;
- int has_overlay = 0;
+ I830Ptr p830 = I830PTR(pScrn);
+ struct drm_i915_getparam gp;
+ int has_overlay = 0;
- gp.param = I915_PARAM_HAS_OVERLAY;
- gp.value = &has_overlay;
- drmCommandWriteRead(p830->drmSubFD, DRM_I915_GETPARAM,
- &gp, sizeof(gp));
+ gp.param = I915_PARAM_HAS_OVERLAY;
+ gp.value = &has_overlay;
+ drmCommandWriteRead(p830->drmSubFD, DRM_I915_GETPARAM, &gp, sizeof(gp));
- return has_overlay ? TRUE : FALSE;
+ return has_overlay ? TRUE : FALSE;
#else
- return FALSE;
+ return FALSE;
#endif
}
-static void
-drmmode_overlay_update_attrs(ScrnInfoPtr pScrn)
+static void drmmode_overlay_update_attrs(ScrnInfoPtr pScrn)
{
#ifdef DRM_MODE_OVERLAY_LANDED
- I830Ptr p830 = I830PTR(pScrn);
- I830PortPrivPtr pPriv = GET_PORT_PRIVATE(pScrn);
- struct drm_intel_overlay_attrs attrs;
- int ret;
-
- attrs.flags = I915_OVERLAY_UPDATE_ATTRS;
- attrs.brightness = pPriv->brightness;
- attrs.contrast = pPriv->contrast;
- attrs.saturation = pPriv->saturation;
- attrs.color_key = pPriv->colorKey;
- attrs.gamma0 = pPriv->gamma0;
- attrs.gamma1 = pPriv->gamma1;
- attrs.gamma2 = pPriv->gamma2;
- attrs.gamma3 = pPriv->gamma3;
- attrs.gamma4 = pPriv->gamma4;
- attrs.gamma5 = pPriv->gamma5;
-
- ret = drmCommandWriteRead(p830->drmSubFD, DRM_I915_OVERLAY_ATTRS,
- &attrs, sizeof(attrs));
-
- if (ret != 0)
- OVERLAY_DEBUG("overlay attrs ioctl failed: %i\n", ret);
+ I830Ptr p830 = I830PTR(pScrn);
+ I830PortPrivPtr pPriv = GET_PORT_PRIVATE(pScrn);
+ struct drm_intel_overlay_attrs attrs;
+ int ret;
+
+ attrs.flags = I915_OVERLAY_UPDATE_ATTRS;
+ attrs.brightness = pPriv->brightness;
+ attrs.contrast = pPriv->contrast;
+ attrs.saturation = pPriv->saturation;
+ attrs.color_key = pPriv->colorKey;
+ attrs.gamma0 = pPriv->gamma0;
+ attrs.gamma1 = pPriv->gamma1;
+ attrs.gamma2 = pPriv->gamma2;
+ attrs.gamma3 = pPriv->gamma3;
+ attrs.gamma4 = pPriv->gamma4;
+ attrs.gamma5 = pPriv->gamma5;
+
+ ret = drmCommandWriteRead(p830->drmSubFD, DRM_I915_OVERLAY_ATTRS,
+ &attrs, sizeof(attrs));
+
+ if (ret != 0)
+ OVERLAY_DEBUG("overlay attrs ioctl failed: %i\n", ret);
#endif
}
-static void
-drmmode_overlay_off(ScrnInfoPtr pScrn)
+static void drmmode_overlay_off(ScrnInfoPtr pScrn)
{
#ifdef DRM_MODE_OVERLAY_LANDED
- I830Ptr p830 = I830PTR(pScrn);
- struct drm_intel_overlay_put_image request;
- int ret;
+ I830Ptr p830 = I830PTR(pScrn);
+ struct drm_intel_overlay_put_image request;
+ int ret;
- request.flags = 0;
+ request.flags = 0;
- ret = drmCommandWrite(p830->drmSubFD, DRM_I915_OVERLAY_PUT_IMAGE,
+ ret = drmCommandWrite(p830->drmSubFD, DRM_I915_OVERLAY_PUT_IMAGE,
&request, sizeof(request));
- if (ret != 0)
- OVERLAY_DEBUG("overlay switch-off ioctl failed: %i\n", ret);
+ if (ret != 0)
+ OVERLAY_DEBUG("overlay switch-off ioctl failed: %i\n", ret);
#endif
}
static Bool
drmmode_overlay_put_image(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
- int id, short width, short height,
- int dstPitch, int x1, int y1, int x2, int y2, BoxPtr dstBox,
- short src_w, short src_h, short drw_w, short drw_h)
+ int id, short width, short height,
+ int dstPitch, int x1, int y1, int x2, int y2,
+ BoxPtr dstBox, short src_w, short src_h, short drw_w,
+ short drw_h)
{
#ifdef DRM_MODE_OVERLAY_LANDED
- I830Ptr p830 = I830PTR(pScrn);
- I830PortPrivPtr pPriv = GET_PORT_PRIVATE(pScrn);
- struct drm_intel_overlay_put_image request;
- int ret;
- int planar = is_planar_fourcc(id);
- float scale;
-
- request.flags = I915_OVERLAY_ENABLE;
-
- request.bo_handle = pPriv->buf->handle;
- if (planar) {
- request.stride_Y = dstPitch*2;
- request.stride_UV = dstPitch;
- } else {
- request.stride_Y = dstPitch;
- request.stride_UV = 0;
- }
- request.offset_Y = pPriv->YBufOffset;
- request.offset_U = pPriv->UBufOffset;
- request.offset_V = pPriv->VBufOffset;
- OVERLAY_DEBUG("off_Y: %i, off_U: %i, off_V: %i\n", request.offset_Y,
- request.offset_U, request.offset_V);
-
- request.crtc_id = drmmode_crtc_id(crtc);
- request.dst_x = dstBox->x1;
- request.dst_y = dstBox->y1;
- request.dst_width = dstBox->x2 - dstBox->x1;
- request.dst_height = dstBox->y2 - dstBox->y1;
-
- request.src_width = width;
- request.src_height = height;
- /* adjust src dimensions */
- if (request.dst_height > 1) {
- scale = ((float) request.dst_height - 1) / ((float) drw_h - 1);
- request.src_scan_height = src_h * scale;
- } else
- request.src_scan_height = 1;
-
- if (request.dst_width > 1) {
- scale = ((float) request.dst_width - 1) / ((float) drw_w - 1);
- request.src_scan_width = src_w * scale;
- } else
- request.src_scan_width = 1;
-
- if (planar) {
- request.flags |= I915_OVERLAY_YUV_PLANAR | I915_OVERLAY_YUV420;
- } else {
- request.flags |= I915_OVERLAY_YUV_PACKED | I915_OVERLAY_YUV422;
- if (id == FOURCC_UYVY)
- request.flags |= I915_OVERLAY_Y_SWAP;
- }
-
- ret = drmCommandWrite(p830->drmSubFD, DRM_I915_OVERLAY_PUT_IMAGE,
+ I830Ptr p830 = I830PTR(pScrn);
+ I830PortPrivPtr pPriv = GET_PORT_PRIVATE(pScrn);
+ struct drm_intel_overlay_put_image request;
+ int ret;
+ int planar = is_planar_fourcc(id);
+ float scale;
+
+ request.flags = I915_OVERLAY_ENABLE;
+
+ request.bo_handle = pPriv->buf->handle;
+ if (planar) {
+ request.stride_Y = dstPitch * 2;
+ request.stride_UV = dstPitch;
+ } else {
+ request.stride_Y = dstPitch;
+ request.stride_UV = 0;
+ }
+ request.offset_Y = pPriv->YBufOffset;
+ request.offset_U = pPriv->UBufOffset;
+ request.offset_V = pPriv->VBufOffset;
+ OVERLAY_DEBUG("off_Y: %i, off_U: %i, off_V: %i\n", request.offset_Y,
+ request.offset_U, request.offset_V);
+
+ request.crtc_id = drmmode_crtc_id(crtc);
+ request.dst_x = dstBox->x1;
+ request.dst_y = dstBox->y1;
+ request.dst_width = dstBox->x2 - dstBox->x1;
+ request.dst_height = dstBox->y2 - dstBox->y1;
+
+ request.src_width = width;
+ request.src_height = height;
+ /* adjust src dimensions */
+ if (request.dst_height > 1) {
+ scale = ((float)request.dst_height - 1) / ((float)drw_h - 1);
+ request.src_scan_height = src_h * scale;
+ } else
+ request.src_scan_height = 1;
+
+ if (request.dst_width > 1) {
+ scale = ((float)request.dst_width - 1) / ((float)drw_w - 1);
+ request.src_scan_width = src_w * scale;
+ } else
+ request.src_scan_width = 1;
+
+ if (planar) {
+ request.flags |= I915_OVERLAY_YUV_PLANAR | I915_OVERLAY_YUV420;
+ } else {
+ request.flags |= I915_OVERLAY_YUV_PACKED | I915_OVERLAY_YUV422;
+ if (id == FOURCC_UYVY)
+ request.flags |= I915_OVERLAY_Y_SWAP;
+ }
+
+ ret = drmCommandWrite(p830->drmSubFD, DRM_I915_OVERLAY_PUT_IMAGE,
&request, sizeof(request));
- /* drop the newly displaying buffer right away */
- drm_intel_bo_disable_reuse(pPriv->buf);
- drm_intel_bo_unreference(pPriv->buf);
- pPriv->buf = NULL;
+ /* drop the newly displaying buffer right away */
+ drm_intel_bo_disable_reuse(pPriv->buf);
+ drm_intel_bo_unreference(pPriv->buf);
+ pPriv->buf = NULL;
- if (ret != 0) {
- OVERLAY_DEBUG("overlay put-image ioctl failed: %i\n", ret);
- return FALSE;
- } else
- return TRUE;
+ if (ret != 0) {
+ OVERLAY_DEBUG("overlay put-image ioctl failed: %i\n", ret);
+ return FALSE;
+ } else
+ return TRUE;
#else
- return FALSE;
+ return FALSE;
#endif
}
-void
-I830InitVideo(ScreenPtr pScreen)
+void I830InitVideo(ScreenPtr pScreen)
{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
- XF86VideoAdaptorPtr overlayAdaptor = NULL, texturedAdaptor = NULL;
- int num_adaptors;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
+ XF86VideoAdaptorPtr overlayAdaptor = NULL, texturedAdaptor = NULL;
+ int num_adaptors;
#ifdef INTEL_XVMC
- Bool xvmc_status = FALSE;
+ Bool xvmc_status = FALSE;
#endif
- num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
- /* Give our adaptor list enough space for the overlay and/or texture video
- * adaptors.
- */
- newAdaptors = xalloc((num_adaptors + 2) * sizeof(XF86VideoAdaptorPtr *));
- if (newAdaptors == NULL)
- return;
+ num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
+ /* Give our adaptor list enough space for the overlay and/or texture video
+ * adaptors.
+ */
+ newAdaptors =
+ xalloc((num_adaptors + 2) * sizeof(XF86VideoAdaptorPtr *));
+ if (newAdaptors == NULL)
+ return;
- memcpy(newAdaptors, adaptors, num_adaptors * sizeof(XF86VideoAdaptorPtr));
- adaptors = newAdaptors;
-
- /* Add the adaptors supported by our hardware. First, set up the atoms
- * that will be used by both output adaptors.
- */
- xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
- xvContrast = MAKE_ATOM("XV_CONTRAST");
-
- /* Set up textured video if we can do it at this depth and we are on
- * supported hardware.
- */
- if (pScrn->bitsPerPixel >= 16 && (IS_I9XX(pI830) || IS_I965G(pI830)) &&
- !(!IS_I965G(pI830) && pScrn->displayWidth > 2048))
- {
- texturedAdaptor = I830SetupImageVideoTextured(pScreen);
- if (texturedAdaptor != NULL) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Set up textured video\n");
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Failed to set up textured video\n");
+ memcpy(newAdaptors, adaptors,
+ num_adaptors * sizeof(XF86VideoAdaptorPtr));
+ adaptors = newAdaptors;
+
+ /* Add the adaptors supported by our hardware. First, set up the atoms
+ * that will be used by both output adaptors.
+ */
+ xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
+ xvContrast = MAKE_ATOM("XV_CONTRAST");
+
+ /* Set up textured video if we can do it at this depth and we are on
+ * supported hardware.
+ */
+ if (pScrn->bitsPerPixel >= 16 && (IS_I9XX(pI830) || IS_I965G(pI830)) &&
+ !(!IS_I965G(pI830) && pScrn->displayWidth > 2048)) {
+ texturedAdaptor = I830SetupImageVideoTextured(pScreen);
+ if (texturedAdaptor != NULL) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Set up textured video\n");
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to set up textured video\n");
+ }
}
- }
-
- /* Set up overlay video if we can do it at this depth. */
- if (!OVERLAY_NOEXIST(pI830) && pScrn->bitsPerPixel != 8)
- {
- pI830->use_drmmode_overlay = drmmode_has_overlay(pScrn);
- if (pI830->use_drmmode_overlay) {
- overlayAdaptor = I830SetupImageVideoOverlay(pScreen);
- if (overlayAdaptor != NULL) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Set up overlay video\n");
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Failed to set up overlay video\n");
- }
+
+ /* Set up overlay video if we can do it at this depth. */
+ if (!OVERLAY_NOEXIST(pI830) && pScrn->bitsPerPixel != 8) {
+ pI830->use_drmmode_overlay = drmmode_has_overlay(pScrn);
+ if (pI830->use_drmmode_overlay) {
+ overlayAdaptor = I830SetupImageVideoOverlay(pScreen);
+ if (overlayAdaptor != NULL) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Set up overlay video\n");
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to set up overlay video\n");
+ }
+ }
}
- }
- if (overlayAdaptor && pI830->XvPreferOverlay)
- adaptors[num_adaptors++] = overlayAdaptor;
+ if (overlayAdaptor && pI830->XvPreferOverlay)
+ adaptors[num_adaptors++] = overlayAdaptor;
- if (texturedAdaptor)
- adaptors[num_adaptors++] = texturedAdaptor;
+ if (texturedAdaptor)
+ adaptors[num_adaptors++] = texturedAdaptor;
- if (overlayAdaptor && !pI830->XvPreferOverlay)
- adaptors[num_adaptors++] = overlayAdaptor;
+ if (overlayAdaptor && !pI830->XvPreferOverlay)
+ adaptors[num_adaptors++] = overlayAdaptor;
#ifdef INTEL_XVMC
- if (intel_xvmc_probe(pScrn)) {
- if (texturedAdaptor)
- xvmc_status = intel_xvmc_driver_init(pScreen, texturedAdaptor);
- }
+ if (intel_xvmc_probe(pScrn)) {
+ if (texturedAdaptor)
+ xvmc_status =
+ intel_xvmc_driver_init(pScreen, texturedAdaptor);
+ }
#endif
- if (num_adaptors) {
- xf86XVScreenInit(pScreen, adaptors, num_adaptors);
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Disabling Xv because no adaptors could be initialized.\n");
- pI830->XvEnabled = FALSE;
- }
+ if (num_adaptors) {
+ xf86XVScreenInit(pScreen, adaptors, num_adaptors);
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Disabling Xv because no adaptors could be initialized.\n");
+ pI830->XvEnabled = FALSE;
+ }
#ifdef INTEL_XVMC
- if (xvmc_status)
- intel_xvmc_screen_init(pScreen);
+ if (xvmc_status)
+ intel_xvmc_screen_init(pScreen);
#endif
- xfree(adaptors);
+ xfree(adaptors);
}
#define PFIT_CONTROLS 0x61230
@@ -466,244 +464,244 @@ I830InitVideo(ScreenPtr pScreen)
#define PFIT_AUTOSCALE_RATIO 0x61238
#define PFIT_PROGRAMMED_SCALE_RATIO 0x61234
-static XF86VideoAdaptorPtr
-I830SetupImageVideoOverlay(ScreenPtr pScreen)
+static XF86VideoAdaptorPtr I830SetupImageVideoOverlay(ScreenPtr pScreen)
{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- XF86VideoAdaptorPtr adapt;
- I830PortPrivPtr pPriv;
- XF86AttributePtr att;
-
- OVERLAY_DEBUG("I830SetupImageVideoOverlay\n");
-
- if (!(adapt = xcalloc(1, sizeof(XF86VideoAdaptorRec) +
- sizeof(I830PortPrivRec) + sizeof(DevUnion))))
- return NULL;
-
- adapt->type = XvWindowMask | XvInputMask | XvImageMask;
- adapt->flags = VIDEO_OVERLAID_IMAGES /*| VIDEO_CLIP_TO_VIEWPORT*/;
- adapt->name = "Intel(R) Video Overlay";
- adapt->nEncodings = 1;
- adapt->pEncodings = DummyEncoding;
- /* update the DummyEncoding for these two chipsets */
- if (IS_845G(pI830) || IS_I830(pI830)) {
- adapt->pEncodings->width = IMAGE_MAX_WIDTH_LEGACY;
- adapt->pEncodings->height = IMAGE_MAX_HEIGHT_LEGACY;
- }
- adapt->nFormats = NUM_FORMATS;
- adapt->pFormats = Formats;
- adapt->nPorts = 1;
- adapt->pPortPrivates = (DevUnion *) (&adapt[1]);
-
- pPriv = (I830PortPrivPtr) (&adapt->pPortPrivates[1]);
-
- adapt->pPortPrivates[0].ptr = (pointer) (pPriv);
- adapt->nAttributes = NUM_ATTRIBUTES;
- adapt->nAttributes += CLONE_ATTRIBUTES;
- if (IS_I9XX(pI830))
- adapt->nAttributes += GAMMA_ATTRIBUTES; /* has gamma */
- adapt->pAttributes = xnfalloc(sizeof(XF86AttributeRec) * adapt->nAttributes);
- /* Now copy the attributes */
- att = adapt->pAttributes;
- memcpy((char *)att, (char*)Attributes, sizeof(XF86AttributeRec)* NUM_ATTRIBUTES);
- att+=NUM_ATTRIBUTES;
- memcpy((char*)att, (char*)CloneAttributes, sizeof(XF86AttributeRec) * CLONE_ATTRIBUTES);
- att+=CLONE_ATTRIBUTES;
- if (IS_I9XX(pI830)) {
- memcpy((char*)att, (char*)GammaAttributes, sizeof(XF86AttributeRec) * GAMMA_ATTRIBUTES);
- att+=GAMMA_ATTRIBUTES;
- }
- adapt->nImages = NUM_IMAGES;
- adapt->pImages = Images;
- adapt->PutVideo = NULL;
- adapt->PutStill = NULL;
- adapt->GetVideo = NULL;
- adapt->GetStill = NULL;
- adapt->StopVideo = I830StopVideo;
- adapt->SetPortAttribute = I830SetPortAttributeOverlay;
- adapt->GetPortAttribute = I830GetPortAttribute;
- adapt->QueryBestSize = I830QueryBestSize;
- adapt->PutImage = I830PutImage;
- adapt->QueryImageAttributes = I830QueryImageAttributes;
-
- pPriv->textured = FALSE;
- pPriv->colorKey = pI830->colorKey & ((1 << pScrn->depth) - 1);
- pPriv->videoStatus = 0;
- pPriv->brightness = -19; /* (255/219) * -16 */
- pPriv->contrast = 75; /* 255/219 * 64 */
- pPriv->saturation = 146; /* 128/112 * 128 */
- pPriv->current_crtc = NULL;
- pPriv->desired_crtc = NULL;
- pPriv->buf = NULL;
- pPriv->oldBuf = NULL;
- pPriv->oldBuf_pinned = FALSE;
- pPriv->gamma5 = 0xc0c0c0;
- pPriv->gamma4 = 0x808080;
- pPriv->gamma3 = 0x404040;
- pPriv->gamma2 = 0x202020;
- pPriv->gamma1 = 0x101010;
- pPriv->gamma0 = 0x080808;
-
- pPriv->rotation = RR_Rotate_0;
-
- /* gotta uninit this someplace */
- REGION_NULL(pScreen, &pPriv->clip);
-
- pI830->adaptor = adapt;
-
- /* With LFP's we need to detect whether we're in One Line Mode, which
- * essentially means a resolution greater than 1024x768, and fix up
- * the scaler accordingly. */
- pPriv->scaleRatio = 0x10000;
- pPriv->oneLineMode = FALSE;
-
- /*
- * Initialise pPriv->overlayOK. Set it to TRUE here so that a warning will
- * be generated if i830_crtc_dpms_video() sets it to FALSE during mode
- * setup.
- */
- pPriv->overlayOK = TRUE;
-
- xvColorKey = MAKE_ATOM("XV_COLORKEY");
- xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
- xvContrast = MAKE_ATOM("XV_CONTRAST");
- xvSaturation = MAKE_ATOM("XV_SATURATION");
-
- /* Allow the pipe to be switched from pipe A to B when in clone mode */
- xvPipe = MAKE_ATOM("XV_PIPE");
-
- if (IS_I9XX(pI830)) {
- xvGamma0 = MAKE_ATOM("XV_GAMMA0");
- xvGamma1 = MAKE_ATOM("XV_GAMMA1");
- xvGamma2 = MAKE_ATOM("XV_GAMMA2");
- xvGamma3 = MAKE_ATOM("XV_GAMMA3");
- xvGamma4 = MAKE_ATOM("XV_GAMMA4");
- xvGamma5 = MAKE_ATOM("XV_GAMMA5");
- }
-
- drmmode_overlay_update_attrs(pScrn);
-
- return adapt;
-}
-
-static XF86VideoAdaptorPtr
-I830SetupImageVideoTextured(ScreenPtr pScreen)
-{
- XF86VideoAdaptorPtr adapt;
- XF86AttributePtr attrs;
- I830PortPrivPtr portPrivs;
- DevUnion *devUnions;
- int nports = 16, i;
- int nAttributes;
-
- OVERLAY_DEBUG("I830SetupImageVideoOverlay\n");
-
- nAttributes = NUM_TEXTURED_ATTRIBUTES;
-
- adapt = xcalloc(1, sizeof(XF86VideoAdaptorRec));
- portPrivs = xcalloc(nports, sizeof(I830PortPrivRec));
- devUnions = xcalloc(nports, sizeof(DevUnion));
- attrs = xcalloc(nAttributes, sizeof(XF86AttributeRec));
- if (adapt == NULL || portPrivs == NULL || devUnions == NULL ||
- attrs == NULL)
- {
- xfree(adapt);
- xfree(portPrivs);
- xfree(devUnions);
- xfree(attrs);
- return NULL;
- }
-
- adapt->type = XvWindowMask | XvInputMask | XvImageMask;
- adapt->flags = 0;
- adapt->name = "Intel(R) Textured Video";
- adapt->nEncodings = 1;
- adapt->pEncodings = DummyEncoding;
- adapt->nFormats = NUM_FORMATS;
- adapt->pFormats = Formats;
- adapt->nPorts = nports;
- adapt->pPortPrivates = devUnions;
- adapt->nAttributes = nAttributes;
- adapt->pAttributes = attrs;
- memcpy(attrs, TexturedAttributes, nAttributes * sizeof(XF86AttributeRec));
- adapt->nImages = NUM_IMAGES;
- adapt->pImages = Images;
- adapt->PutVideo = NULL;
- adapt->PutStill = NULL;
- adapt->GetVideo = NULL;
- adapt->GetStill = NULL;
- adapt->StopVideo = I830StopVideo;
- adapt->SetPortAttribute = I830SetPortAttributeTextured;
- adapt->GetPortAttribute = I830GetPortAttribute;
- adapt->QueryBestSize = I830QueryBestSize;
- adapt->PutImage = I830PutImage;
- adapt->QueryImageAttributes = I830QueryImageAttributes;
-
- for (i = 0; i < nports; i++) {
- I830PortPrivPtr pPriv = &portPrivs[i];
-
- pPriv->textured = TRUE;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ XF86VideoAdaptorPtr adapt;
+ I830PortPrivPtr pPriv;
+ XF86AttributePtr att;
+
+ OVERLAY_DEBUG("I830SetupImageVideoOverlay\n");
+
+ if (!(adapt = xcalloc(1, sizeof(XF86VideoAdaptorRec) +
+ sizeof(I830PortPrivRec) + sizeof(DevUnion))))
+ return NULL;
+
+ adapt->type = XvWindowMask | XvInputMask | XvImageMask;
+ adapt->flags = VIDEO_OVERLAID_IMAGES /*| VIDEO_CLIP_TO_VIEWPORT */ ;
+ adapt->name = "Intel(R) Video Overlay";
+ adapt->nEncodings = 1;
+ adapt->pEncodings = DummyEncoding;
+ /* update the DummyEncoding for these two chipsets */
+ if (IS_845G(pI830) || IS_I830(pI830)) {
+ adapt->pEncodings->width = IMAGE_MAX_WIDTH_LEGACY;
+ adapt->pEncodings->height = IMAGE_MAX_HEIGHT_LEGACY;
+ }
+ adapt->nFormats = NUM_FORMATS;
+ adapt->pFormats = Formats;
+ adapt->nPorts = 1;
+ adapt->pPortPrivates = (DevUnion *) (&adapt[1]);
+
+ pPriv = (I830PortPrivPtr) (&adapt->pPortPrivates[1]);
+
+ adapt->pPortPrivates[0].ptr = (pointer) (pPriv);
+ adapt->nAttributes = NUM_ATTRIBUTES;
+ adapt->nAttributes += CLONE_ATTRIBUTES;
+ if (IS_I9XX(pI830))
+ adapt->nAttributes += GAMMA_ATTRIBUTES; /* has gamma */
+ adapt->pAttributes =
+ xnfalloc(sizeof(XF86AttributeRec) * adapt->nAttributes);
+ /* Now copy the attributes */
+ att = adapt->pAttributes;
+ memcpy((char *)att, (char *)Attributes,
+ sizeof(XF86AttributeRec) * NUM_ATTRIBUTES);
+ att += NUM_ATTRIBUTES;
+ memcpy((char *)att, (char *)CloneAttributes,
+ sizeof(XF86AttributeRec) * CLONE_ATTRIBUTES);
+ att += CLONE_ATTRIBUTES;
+ if (IS_I9XX(pI830)) {
+ memcpy((char *)att, (char *)GammaAttributes,
+ sizeof(XF86AttributeRec) * GAMMA_ATTRIBUTES);
+ att += GAMMA_ATTRIBUTES;
+ }
+ adapt->nImages = NUM_IMAGES;
+ adapt->pImages = Images;
+ adapt->PutVideo = NULL;
+ adapt->PutStill = NULL;
+ adapt->GetVideo = NULL;
+ adapt->GetStill = NULL;
+ adapt->StopVideo = I830StopVideo;
+ adapt->SetPortAttribute = I830SetPortAttributeOverlay;
+ adapt->GetPortAttribute = I830GetPortAttribute;
+ adapt->QueryBestSize = I830QueryBestSize;
+ adapt->PutImage = I830PutImage;
+ adapt->QueryImageAttributes = I830QueryImageAttributes;
+
+ pPriv->textured = FALSE;
+ pPriv->colorKey = pI830->colorKey & ((1 << pScrn->depth) - 1);
pPriv->videoStatus = 0;
+ pPriv->brightness = -19; /* (255/219) * -16 */
+ pPriv->contrast = 75; /* 255/219 * 64 */
+ pPriv->saturation = 146; /* 128/112 * 128 */
+ pPriv->current_crtc = NULL;
+ pPriv->desired_crtc = NULL;
pPriv->buf = NULL;
pPriv->oldBuf = NULL;
pPriv->oldBuf_pinned = FALSE;
+ pPriv->gamma5 = 0xc0c0c0;
+ pPriv->gamma4 = 0x808080;
+ pPriv->gamma3 = 0x404040;
+ pPriv->gamma2 = 0x202020;
+ pPriv->gamma1 = 0x101010;
+ pPriv->gamma0 = 0x080808;
pPriv->rotation = RR_Rotate_0;
- pPriv->SyncToVblank = 1;
- /* gotta uninit this someplace, XXX: shouldn't be necessary for textured */
+ /* gotta uninit this someplace */
REGION_NULL(pScreen, &pPriv->clip);
- adapt->pPortPrivates[i].ptr = (pointer) (pPriv);
- }
+ pI830->adaptor = adapt;
- xvSyncToVblank = MAKE_ATOM("XV_SYNC_TO_VBLANK");
+ /* With LFP's we need to detect whether we're in One Line Mode, which
+ * essentially means a resolution greater than 1024x768, and fix up
+ * the scaler accordingly. */
+ pPriv->scaleRatio = 0x10000;
+ pPriv->oneLineMode = FALSE;
- return adapt;
+ /*
+ * Initialise pPriv->overlayOK. Set it to TRUE here so that a warning will
+ * be generated if i830_crtc_dpms_video() sets it to FALSE during mode
+ * setup.
+ */
+ pPriv->overlayOK = TRUE;
+
+ xvColorKey = MAKE_ATOM("XV_COLORKEY");
+ xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
+ xvContrast = MAKE_ATOM("XV_CONTRAST");
+ xvSaturation = MAKE_ATOM("XV_SATURATION");
+
+ /* Allow the pipe to be switched from pipe A to B when in clone mode */
+ xvPipe = MAKE_ATOM("XV_PIPE");
+
+ if (IS_I9XX(pI830)) {
+ xvGamma0 = MAKE_ATOM("XV_GAMMA0");
+ xvGamma1 = MAKE_ATOM("XV_GAMMA1");
+ xvGamma2 = MAKE_ATOM("XV_GAMMA2");
+ xvGamma3 = MAKE_ATOM("XV_GAMMA3");
+ xvGamma4 = MAKE_ATOM("XV_GAMMA4");
+ xvGamma5 = MAKE_ATOM("XV_GAMMA5");
+ }
+
+ drmmode_overlay_update_attrs(pScrn);
+
+ return adapt;
}
-static void
-i830_free_video_buffers(I830PortPrivPtr pPriv)
+static XF86VideoAdaptorPtr I830SetupImageVideoTextured(ScreenPtr pScreen)
{
- if (pPriv->buf) {
- drm_intel_bo_unreference(pPriv->buf);
- pPriv->buf = NULL;
- }
+ XF86VideoAdaptorPtr adapt;
+ XF86AttributePtr attrs;
+ I830PortPrivPtr portPrivs;
+ DevUnion *devUnions;
+ int nports = 16, i;
+ int nAttributes;
+
+ OVERLAY_DEBUG("I830SetupImageVideoOverlay\n");
+
+ nAttributes = NUM_TEXTURED_ATTRIBUTES;
+
+ adapt = xcalloc(1, sizeof(XF86VideoAdaptorRec));
+ portPrivs = xcalloc(nports, sizeof(I830PortPrivRec));
+ devUnions = xcalloc(nports, sizeof(DevUnion));
+ attrs = xcalloc(nAttributes, sizeof(XF86AttributeRec));
+ if (adapt == NULL || portPrivs == NULL || devUnions == NULL ||
+ attrs == NULL) {
+ xfree(adapt);
+ xfree(portPrivs);
+ xfree(devUnions);
+ xfree(attrs);
+ return NULL;
+ }
- if (pPriv->oldBuf) {
- if (pPriv->oldBuf_pinned)
- drm_intel_bo_unpin(pPriv->oldBuf);
- drm_intel_bo_unreference(pPriv->oldBuf);
- pPriv->oldBuf = NULL;
- pPriv->oldBuf_pinned = FALSE;
- }
+ adapt->type = XvWindowMask | XvInputMask | XvImageMask;
+ adapt->flags = 0;
+ adapt->name = "Intel(R) Textured Video";
+ adapt->nEncodings = 1;
+ adapt->pEncodings = DummyEncoding;
+ adapt->nFormats = NUM_FORMATS;
+ adapt->pFormats = Formats;
+ adapt->nPorts = nports;
+ adapt->pPortPrivates = devUnions;
+ adapt->nAttributes = nAttributes;
+ adapt->pAttributes = attrs;
+ memcpy(attrs, TexturedAttributes,
+ nAttributes * sizeof(XF86AttributeRec));
+ adapt->nImages = NUM_IMAGES;
+ adapt->pImages = Images;
+ adapt->PutVideo = NULL;
+ adapt->PutStill = NULL;
+ adapt->GetVideo = NULL;
+ adapt->GetStill = NULL;
+ adapt->StopVideo = I830StopVideo;
+ adapt->SetPortAttribute = I830SetPortAttributeTextured;
+ adapt->GetPortAttribute = I830GetPortAttribute;
+ adapt->QueryBestSize = I830QueryBestSize;
+ adapt->PutImage = I830PutImage;
+ adapt->QueryImageAttributes = I830QueryImageAttributes;
+
+ for (i = 0; i < nports; i++) {
+ I830PortPrivPtr pPriv = &portPrivs[i];
+
+ pPriv->textured = TRUE;
+ pPriv->videoStatus = 0;
+ pPriv->buf = NULL;
+ pPriv->oldBuf = NULL;
+ pPriv->oldBuf_pinned = FALSE;
+
+ pPriv->rotation = RR_Rotate_0;
+ pPriv->SyncToVblank = 1;
+
+ /* gotta uninit this someplace, XXX: shouldn't be necessary for textured */
+ REGION_NULL(pScreen, &pPriv->clip);
+
+ adapt->pPortPrivates[i].ptr = (pointer) (pPriv);
+ }
+
+ xvSyncToVblank = MAKE_ATOM("XV_SYNC_TO_VBLANK");
+
+ return adapt;
}
-static void
-I830StopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown)
+static void i830_free_video_buffers(I830PortPrivPtr pPriv)
{
- I830PortPrivPtr pPriv = (I830PortPrivPtr) data;
+ if (pPriv->buf) {
+ drm_intel_bo_unreference(pPriv->buf);
+ pPriv->buf = NULL;
+ }
- if (pPriv->textured)
- return;
+ if (pPriv->oldBuf) {
+ if (pPriv->oldBuf_pinned)
+ drm_intel_bo_unpin(pPriv->oldBuf);
+ drm_intel_bo_unreference(pPriv->oldBuf);
+ pPriv->oldBuf = NULL;
+ pPriv->oldBuf_pinned = FALSE;
+ }
+}
- OVERLAY_DEBUG("I830StopVideo\n");
+static void I830StopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown)
+{
+ I830PortPrivPtr pPriv = (I830PortPrivPtr) data;
- REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
+ if (pPriv->textured)
+ return;
- if (shutdown) {
- if (pPriv->videoStatus & CLIENT_VIDEO_ON)
- drmmode_overlay_off(pScrn);
+ OVERLAY_DEBUG("I830StopVideo\n");
- i830_free_video_buffers(pPriv);
- pPriv->videoStatus = 0;
- } else {
- if (pPriv->videoStatus & CLIENT_VIDEO_ON) {
- pPriv->videoStatus |= OFF_TIMER;
- pPriv->offTime = currentTime.milliseconds + OFF_DELAY;
+ REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
+
+ if (shutdown) {
+ if (pPriv->videoStatus & CLIENT_VIDEO_ON)
+ drmmode_overlay_off(pScrn);
+
+ i830_free_video_buffers(pPriv);
+ pPriv->videoStatus = 0;
+ } else {
+ if (pPriv->videoStatus & CLIENT_VIDEO_ON) {
+ pPriv->videoStatus |= OFF_TIMER;
+ pPriv->offTime = currentTime.milliseconds + OFF_DELAY;
+ }
}
- }
}
@@ -711,138 +709,138 @@ static int
I830SetPortAttributeTextured(ScrnInfoPtr pScrn,
Atom attribute, INT32 value, pointer data)
{
- I830PortPrivPtr pPriv = (I830PortPrivPtr) data;
-
- if (attribute == xvBrightness) {
- if ((value < -128) || (value > 127))
- return BadValue;
- pPriv->brightness = value;
- return Success;
- } else if (attribute == xvContrast) {
- if ((value < 0) || (value > 255))
- return BadValue;
- pPriv->contrast = value;
- return Success;
- } else if (attribute == xvSyncToVblank) {
- if ((value < -1) || (value > 1))
- return BadValue;
- pPriv->SyncToVblank = value;
- return Success;
- } else {
- return BadMatch;
- }
+ I830PortPrivPtr pPriv = (I830PortPrivPtr) data;
+
+ if (attribute == xvBrightness) {
+ if ((value < -128) || (value > 127))
+ return BadValue;
+ pPriv->brightness = value;
+ return Success;
+ } else if (attribute == xvContrast) {
+ if ((value < 0) || (value > 255))
+ return BadValue;
+ pPriv->contrast = value;
+ return Success;
+ } else if (attribute == xvSyncToVblank) {
+ if ((value < -1) || (value > 1))
+ return BadValue;
+ pPriv->SyncToVblank = value;
+ return Success;
+ } else {
+ return BadMatch;
+ }
}
static int
I830SetPortAttributeOverlay(ScrnInfoPtr pScrn,
- Atom attribute, INT32 value, pointer data)
+ Atom attribute, INT32 value, pointer data)
{
- I830PortPrivPtr pPriv = (I830PortPrivPtr) data;
- I830Ptr pI830 = I830PTR(pScrn);
-
- if (attribute == xvBrightness) {
- if ((value < -128) || (value > 127))
- return BadValue;
- pPriv->brightness = value;
- OVERLAY_DEBUG("BRIGHTNESS\n");
- } else if (attribute == xvContrast) {
- if ((value < 0) || (value > 255))
- return BadValue;
- pPriv->contrast = value;
- OVERLAY_DEBUG("CONTRAST\n");
- } else if (attribute == xvSaturation) {
- if ((value < 0) || (value > 1023))
- return BadValue;
- pPriv->saturation = value;
- } else if (attribute == xvPipe) {
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- if ((value < -1) || (value > xf86_config->num_crtc))
- return BadValue;
- if (value < 0)
- pPriv->desired_crtc = NULL;
- else
- pPriv->desired_crtc = xf86_config->crtc[value];
- /*
- * Leave this to be updated at the next frame
- */
- } else if (attribute == xvGamma0 && (IS_I9XX(pI830))) {
- pPriv->gamma0 = value;
- } else if (attribute == xvGamma1 && (IS_I9XX(pI830))) {
- pPriv->gamma1 = value;
- } else if (attribute == xvGamma2 && (IS_I9XX(pI830))) {
- pPriv->gamma2 = value;
- } else if (attribute == xvGamma3 && (IS_I9XX(pI830))) {
- pPriv->gamma3 = value;
- } else if (attribute == xvGamma4 && (IS_I9XX(pI830))) {
- pPriv->gamma4 = value;
- } else if (attribute == xvGamma5 && (IS_I9XX(pI830))) {
- pPriv->gamma5 = value;
- } else if (attribute == xvColorKey) {
- pPriv->colorKey = value;
- OVERLAY_DEBUG("COLORKEY\n");
- } else
- return BadMatch;
-
- /* Ensure that the overlay is off, ready for updating */
- if ((attribute == xvGamma0 ||
- attribute == xvGamma1 ||
- attribute == xvGamma2 ||
- attribute == xvGamma3 ||
- attribute == xvGamma4 ||
- attribute == xvGamma5) && (IS_I9XX(pI830))) {
- OVERLAY_DEBUG("GAMMA\n");
- }
-
- drmmode_overlay_update_attrs(pScrn);
-
- if (attribute == xvColorKey)
- REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
+ I830PortPrivPtr pPriv = (I830PortPrivPtr) data;
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ if (attribute == xvBrightness) {
+ if ((value < -128) || (value > 127))
+ return BadValue;
+ pPriv->brightness = value;
+ OVERLAY_DEBUG("BRIGHTNESS\n");
+ } else if (attribute == xvContrast) {
+ if ((value < 0) || (value > 255))
+ return BadValue;
+ pPriv->contrast = value;
+ OVERLAY_DEBUG("CONTRAST\n");
+ } else if (attribute == xvSaturation) {
+ if ((value < 0) || (value > 1023))
+ return BadValue;
+ pPriv->saturation = value;
+ } else if (attribute == xvPipe) {
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ if ((value < -1) || (value > xf86_config->num_crtc))
+ return BadValue;
+ if (value < 0)
+ pPriv->desired_crtc = NULL;
+ else
+ pPriv->desired_crtc = xf86_config->crtc[value];
+ /*
+ * Leave this to be updated at the next frame
+ */
+ } else if (attribute == xvGamma0 && (IS_I9XX(pI830))) {
+ pPriv->gamma0 = value;
+ } else if (attribute == xvGamma1 && (IS_I9XX(pI830))) {
+ pPriv->gamma1 = value;
+ } else if (attribute == xvGamma2 && (IS_I9XX(pI830))) {
+ pPriv->gamma2 = value;
+ } else if (attribute == xvGamma3 && (IS_I9XX(pI830))) {
+ pPriv->gamma3 = value;
+ } else if (attribute == xvGamma4 && (IS_I9XX(pI830))) {
+ pPriv->gamma4 = value;
+ } else if (attribute == xvGamma5 && (IS_I9XX(pI830))) {
+ pPriv->gamma5 = value;
+ } else if (attribute == xvColorKey) {
+ pPriv->colorKey = value;
+ OVERLAY_DEBUG("COLORKEY\n");
+ } else
+ return BadMatch;
+
+ /* Ensure that the overlay is off, ready for updating */
+ if ((attribute == xvGamma0 ||
+ attribute == xvGamma1 ||
+ attribute == xvGamma2 ||
+ attribute == xvGamma3 ||
+ attribute == xvGamma4 ||
+ attribute == xvGamma5) && (IS_I9XX(pI830))) {
+ OVERLAY_DEBUG("GAMMA\n");
+ }
+
+ drmmode_overlay_update_attrs(pScrn);
- return Success;
+ if (attribute == xvColorKey)
+ REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
+
+ return Success;
}
static int
I830GetPortAttribute(ScrnInfoPtr pScrn,
Atom attribute, INT32 * value, pointer data)
{
- I830Ptr pI830 = I830PTR(pScrn);
- I830PortPrivPtr pPriv = (I830PortPrivPtr) data;
-
- if (attribute == xvBrightness) {
- *value = pPriv->brightness;
- } else if (attribute == xvContrast) {
- *value = pPriv->contrast;
- } else if (attribute == xvSaturation) {
- *value = pPriv->saturation;
- } else if (attribute == xvPipe) {
- int c;
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- for (c = 0; c < xf86_config->num_crtc; c++)
- if (xf86_config->crtc[c] == pPriv->desired_crtc)
- break;
- if (c == xf86_config->num_crtc)
- c = -1;
- *value = c;
- } else if (attribute == xvGamma0 && (IS_I9XX(pI830))) {
- *value = pPriv->gamma0;
- } else if (attribute == xvGamma1 && (IS_I9XX(pI830))) {
- *value = pPriv->gamma1;
- } else if (attribute == xvGamma2 && (IS_I9XX(pI830))) {
- *value = pPriv->gamma2;
- } else if (attribute == xvGamma3 && (IS_I9XX(pI830))) {
- *value = pPriv->gamma3;
- } else if (attribute == xvGamma4 && (IS_I9XX(pI830))) {
- *value = pPriv->gamma4;
- } else if (attribute == xvGamma5 && (IS_I9XX(pI830))) {
- *value = pPriv->gamma5;
- } else if (attribute == xvColorKey) {
- *value = pPriv->colorKey;
- } else if (attribute == xvSyncToVblank) {
- *value = pPriv->SyncToVblank;
- } else
- return BadMatch;
-
- return Success;
+ I830Ptr pI830 = I830PTR(pScrn);
+ I830PortPrivPtr pPriv = (I830PortPrivPtr) data;
+
+ if (attribute == xvBrightness) {
+ *value = pPriv->brightness;
+ } else if (attribute == xvContrast) {
+ *value = pPriv->contrast;
+ } else if (attribute == xvSaturation) {
+ *value = pPriv->saturation;
+ } else if (attribute == xvPipe) {
+ int c;
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ for (c = 0; c < xf86_config->num_crtc; c++)
+ if (xf86_config->crtc[c] == pPriv->desired_crtc)
+ break;
+ if (c == xf86_config->num_crtc)
+ c = -1;
+ *value = c;
+ } else if (attribute == xvGamma0 && (IS_I9XX(pI830))) {
+ *value = pPriv->gamma0;
+ } else if (attribute == xvGamma1 && (IS_I9XX(pI830))) {
+ *value = pPriv->gamma1;
+ } else if (attribute == xvGamma2 && (IS_I9XX(pI830))) {
+ *value = pPriv->gamma2;
+ } else if (attribute == xvGamma3 && (IS_I9XX(pI830))) {
+ *value = pPriv->gamma3;
+ } else if (attribute == xvGamma4 && (IS_I9XX(pI830))) {
+ *value = pPriv->gamma4;
+ } else if (attribute == xvGamma5 && (IS_I9XX(pI830))) {
+ *value = pPriv->gamma5;
+ } else if (attribute == xvColorKey) {
+ *value = pPriv->colorKey;
+ } else if (attribute == xvSyncToVblank) {
+ *value = pPriv->SyncToVblank;
+ } else
+ return BadMatch;
+
+ return Success;
}
static void
@@ -852,160 +850,174 @@ I830QueryBestSize(ScrnInfoPtr pScrn,
short drw_w, short drw_h,
unsigned int *p_w, unsigned int *p_h, pointer data)
{
- if (vid_w > (drw_w << 1))
- drw_w = vid_w >> 1;
- if (vid_h > (drw_h << 1))
- drw_h = vid_h >> 1;
+ if (vid_w > (drw_w << 1))
+ drw_w = vid_w >> 1;
+ if (vid_h > (drw_h << 1))
+ drw_h = vid_h >> 1;
- *p_w = drw_w;
- *p_h = drw_h;
+ *p_w = drw_w;
+ *p_h = drw_h;
}
static void
I830CopyPackedData(I830PortPrivPtr pPriv,
unsigned char *buf,
- int srcPitch,
- int dstPitch, int top, int left, int h, int w)
+ int srcPitch, int dstPitch, int top, int left, int h, int w)
{
- unsigned char *src, *dst, *dst_base;
- int i,j;
- unsigned char *s;
+ unsigned char *src, *dst, *dst_base;
+ int i, j;
+ unsigned char *s;
#if 0
- ErrorF("I830CopyPackedData: (%d,%d) (%d,%d)\n"
- "srcPitch: %d, dstPitch: %d\n", top, left, h, w,
- srcPitch, dstPitch);
+ ErrorF("I830CopyPackedData: (%d,%d) (%d,%d)\n"
+ "srcPitch: %d, dstPitch: %d\n", top, left, h, w,
+ srcPitch, dstPitch);
#endif
- src = buf + (top * srcPitch) + (left << 1);
+ src = buf + (top * srcPitch) + (left << 1);
- drm_intel_bo_map(pPriv->buf, TRUE);
- dst_base = pPriv->buf->virtual;
+ drm_intel_bo_map(pPriv->buf, TRUE);
+ dst_base = pPriv->buf->virtual;
- dst = dst_base + pPriv->YBufOffset;
+ dst = dst_base + pPriv->YBufOffset;
- switch (pPriv->rotation) {
- case RR_Rotate_0:
- w <<= 1;
- for (i = 0; i < h; i++) {
- memcpy(dst, src, w);
- src += srcPitch;
- dst += dstPitch;
- }
- break;
- case RR_Rotate_90:
- h <<= 1;
- for (i = 0; i < h; i+=2) {
- s = src;
- for (j = 0; j < w; j++) {
- /* Copy Y */
- dst[(i + 0) + ((w - j - 1) * dstPitch)] = *s++;
- (void)*s++;
- }
- src += srcPitch;
- }
- h >>= 1;
- src = buf + (top * srcPitch) + (left << 1);
- for (i = 0; i < h; i+=2) {
- for (j = 0; j < w; j+=2) {
- /* Copy U */
- dst[((i*2) + 1) + ((w - j - 1) * dstPitch)] = src[(j*2) + 1 + (i * srcPitch)];
- dst[((i*2) + 1) + ((w - j - 2) * dstPitch)] = src[(j*2) + 1 + ((i+1) * srcPitch)];
- /* Copy V */
- dst[((i*2) + 3) + ((w - j - 1) * dstPitch)] = src[(j*2) + 3 + (i * srcPitch)];
- dst[((i*2) + 3) + ((w - j - 2) * dstPitch)] = src[(j*2) + 3 + ((i+1) * srcPitch)];
- }
- }
- break;
- case RR_Rotate_180:
- w <<= 1;
- for (i = 0; i < h; i++) {
- s = src;
- for (j = 0; j < w; j+=4) {
- dst[(w - j - 4) + ((h - i - 1) * dstPitch)] = *s++;
- dst[(w - j - 3) + ((h - i - 1) * dstPitch)] = *s++;
- dst[(w - j - 2) + ((h - i - 1) * dstPitch)] = *s++;
- dst[(w - j - 1) + ((h - i - 1) * dstPitch)] = *s++;
- }
- src += srcPitch;
- }
- break;
- case RR_Rotate_270:
- h <<= 1;
- for (i = 0; i < h; i+=2) {
- s = src;
- for (j = 0; j < w; j++) {
- /* Copy Y */
- dst[(h - i - 2) + (j * dstPitch)] = *s++;
- (void)*s++;
- }
- src += srcPitch;
- }
- h >>= 1;
- src = buf + (top * srcPitch) + (left << 1);
- for (i = 0; i < h; i+=2) {
- for (j = 0; j < w; j+=2) {
- /* Copy U */
- dst[(((h - i)*2) - 3) + (j * dstPitch)] = src[(j*2) + 1 + (i * srcPitch)];
- dst[(((h - i)*2) - 3) + ((j - 1) * dstPitch)] = src[(j*2) + 1 + ((i+1) * srcPitch)];
- /* Copy V */
- dst[(((h - i)*2) - 1) + (j * dstPitch)] = src[(j*2) + 3 + (i * srcPitch)];
- dst[(((h - i)*2) - 1) + ((j - 1) * dstPitch)] = src[(j*2) + 3 + ((i+1) * srcPitch)];
- }
+ switch (pPriv->rotation) {
+ case RR_Rotate_0:
+ w <<= 1;
+ for (i = 0; i < h; i++) {
+ memcpy(dst, src, w);
+ src += srcPitch;
+ dst += dstPitch;
+ }
+ break;
+ case RR_Rotate_90:
+ h <<= 1;
+ for (i = 0; i < h; i += 2) {
+ s = src;
+ for (j = 0; j < w; j++) {
+ /* Copy Y */
+ dst[(i + 0) + ((w - j - 1) * dstPitch)] = *s++;
+ (void)*s++;
+ }
+ src += srcPitch;
+ }
+ h >>= 1;
+ src = buf + (top * srcPitch) + (left << 1);
+ for (i = 0; i < h; i += 2) {
+ for (j = 0; j < w; j += 2) {
+ /* Copy U */
+ dst[((i * 2) + 1) + ((w - j - 1) * dstPitch)] =
+ src[(j * 2) + 1 + (i * srcPitch)];
+ dst[((i * 2) + 1) + ((w - j - 2) * dstPitch)] =
+ src[(j * 2) + 1 + ((i + 1) * srcPitch)];
+ /* Copy V */
+ dst[((i * 2) + 3) + ((w - j - 1) * dstPitch)] =
+ src[(j * 2) + 3 + (i * srcPitch)];
+ dst[((i * 2) + 3) + ((w - j - 2) * dstPitch)] =
+ src[(j * 2) + 3 + ((i + 1) * srcPitch)];
+ }
+ }
+ break;
+ case RR_Rotate_180:
+ w <<= 1;
+ for (i = 0; i < h; i++) {
+ s = src;
+ for (j = 0; j < w; j += 4) {
+ dst[(w - j - 4) + ((h - i - 1) * dstPitch)] =
+ *s++;
+ dst[(w - j - 3) + ((h - i - 1) * dstPitch)] =
+ *s++;
+ dst[(w - j - 2) + ((h - i - 1) * dstPitch)] =
+ *s++;
+ dst[(w - j - 1) + ((h - i - 1) * dstPitch)] =
+ *s++;
+ }
+ src += srcPitch;
+ }
+ break;
+ case RR_Rotate_270:
+ h <<= 1;
+ for (i = 0; i < h; i += 2) {
+ s = src;
+ for (j = 0; j < w; j++) {
+ /* Copy Y */
+ dst[(h - i - 2) + (j * dstPitch)] = *s++;
+ (void)*s++;
+ }
+ src += srcPitch;
+ }
+ h >>= 1;
+ src = buf + (top * srcPitch) + (left << 1);
+ for (i = 0; i < h; i += 2) {
+ for (j = 0; j < w; j += 2) {
+ /* Copy U */
+ dst[(((h - i) * 2) - 3) + (j * dstPitch)] =
+ src[(j * 2) + 1 + (i * srcPitch)];
+ dst[(((h - i) * 2) - 3) +
+ ((j - 1) * dstPitch)] =
+ src[(j * 2) + 1 + ((i + 1) * srcPitch)];
+ /* Copy V */
+ dst[(((h - i) * 2) - 1) + (j * dstPitch)] =
+ src[(j * 2) + 3 + (i * srcPitch)];
+ dst[(((h - i) * 2) - 1) +
+ ((j - 1) * dstPitch)] =
+ src[(j * 2) + 3 + ((i + 1) * srcPitch)];
+ }
+ }
+ break;
}
- break;
- }
- drm_intel_bo_unmap(pPriv->buf);
+ drm_intel_bo_unmap(pPriv->buf);
}
static void i830_memcpy_plane(unsigned char *dst, unsigned char *src,
- int height, int width,
- int dstPitch, int srcPitch, Rotation rotation)
+ int height, int width,
+ int dstPitch, int srcPitch, Rotation rotation)
{
- int i, j = 0;
- unsigned char *s;
-
- switch (rotation) {
- case RR_Rotate_0:
- /* optimise for the case of no clipping */
- if (srcPitch == dstPitch && srcPitch == width)
- memcpy (dst, src, srcPitch * height);
- else
- for (i = 0; i < height; i++) {
- memcpy(dst, src, width);
- src += srcPitch;
- dst += dstPitch;
- }
- break;
- case RR_Rotate_90:
- for (i = 0; i < height; i++) {
- s = src;
- for (j = 0; j < width; j++) {
- dst[(i) + ((width - j - 1) * dstPitch)] = *s++;
- }
- src += srcPitch;
- }
- break;
- case RR_Rotate_180:
- for (i = 0; i < height; i++) {
- s = src;
- for (j = 0; j < width; j++) {
- dst[(width - j - 1) + ((height - i - 1) * dstPitch)] = *s++;
- }
- src += srcPitch;
- }
- break;
- case RR_Rotate_270:
- for (i = 0; i < height; i++) {
- s = src;
- for (j = 0; j < width; j++) {
- dst[(height - i - 1) + (j * dstPitch)] = *s++;
- }
- src += srcPitch;
+ int i, j = 0;
+ unsigned char *s;
+
+ switch (rotation) {
+ case RR_Rotate_0:
+ /* optimise for the case of no clipping */
+ if (srcPitch == dstPitch && srcPitch == width)
+ memcpy(dst, src, srcPitch * height);
+ else
+ for (i = 0; i < height; i++) {
+ memcpy(dst, src, width);
+ src += srcPitch;
+ dst += dstPitch;
+ }
+ break;
+ case RR_Rotate_90:
+ for (i = 0; i < height; i++) {
+ s = src;
+ for (j = 0; j < width; j++) {
+ dst[(i) + ((width - j - 1) * dstPitch)] = *s++;
+ }
+ src += srcPitch;
+ }
+ break;
+ case RR_Rotate_180:
+ for (i = 0; i < height; i++) {
+ s = src;
+ for (j = 0; j < width; j++) {
+ dst[(width - j - 1) +
+ ((height - i - 1) * dstPitch)] = *s++;
+ }
+ src += srcPitch;
+ }
+ break;
+ case RR_Rotate_270:
+ for (i = 0; i < height; i++) {
+ s = src;
+ for (j = 0; j < width; j++) {
+ dst[(height - i - 1) + (j * dstPitch)] = *s++;
+ }
+ src += srcPitch;
+ }
+ break;
}
- break;
- }
}
static void
@@ -1014,104 +1026,101 @@ I830CopyPlanarData(I830PortPrivPtr pPriv,
int srcPitch2, int dstPitch, int srcH, int top, int left,
int h, int w, int id)
{
- unsigned char *src1, *src2, *src3, *dst_base, *dst1, *dst2, *dst3;
- int dstPitch2 = dstPitch << 1;
+ unsigned char *src1, *src2, *src3, *dst_base, *dst1, *dst2, *dst3;
+ int dstPitch2 = dstPitch << 1;
#if 0
- ErrorF("I830CopyPlanarData: srcPitch %d, srcPitch %d, dstPitch %d\n"
- "nlines %d, npixels %d, top %d, left %d\n",
- srcPitch, srcPitch2, dstPitch,
- h, w, top, left);
+ ErrorF("I830CopyPlanarData: srcPitch %d, srcPitch %d, dstPitch %d\n"
+ "nlines %d, npixels %d, top %d, left %d\n",
+ srcPitch, srcPitch2, dstPitch, h, w, top, left);
#endif
- /* Copy Y data */
- src1 = buf + (top * srcPitch) + left;
+ /* Copy Y data */
+ src1 = buf + (top * srcPitch) + left;
#if 0
- ErrorF("src1 is %p, offset is %ld\n", src1,
- (unsigned long)src1 - (unsigned long)buf);
+ ErrorF("src1 is %p, offset is %ld\n", src1,
+ (unsigned long)src1 - (unsigned long)buf);
#endif
- drm_intel_bo_map(pPriv->buf, TRUE);
- dst_base = pPriv->buf->virtual;
+ drm_intel_bo_map(pPriv->buf, TRUE);
+ dst_base = pPriv->buf->virtual;
- dst1 = dst_base + pPriv->YBufOffset;
+ dst1 = dst_base + pPriv->YBufOffset;
- i830_memcpy_plane(dst1, src1, h, w, dstPitch2, srcPitch, pPriv->rotation);
+ i830_memcpy_plane(dst1, src1, h, w, dstPitch2, srcPitch,
+ pPriv->rotation);
- /* Copy V data for YV12, or U data for I420 */
- src2 = buf + /* start of YUV data */
- (srcH * srcPitch) + /* move over Luma plane */
- ((top * srcPitch) >> 2) + /* move down from by top lines */
- (left >> 1); /* move left by left pixels */
+ /* Copy V data for YV12, or U data for I420 */
+ src2 = buf + /* start of YUV data */
+ (srcH * srcPitch) + /* move over Luma plane */
+ ((top * srcPitch) >> 2) + /* move down from by top lines */
+ (left >> 1); /* move left by left pixels */
#if 0
- ErrorF("src2 is %p, offset is %ld\n", src2,
- (unsigned long)src2 - (unsigned long)buf);
+ ErrorF("src2 is %p, offset is %ld\n", src2,
+ (unsigned long)src2 - (unsigned long)buf);
#endif
- if (id == FOURCC_I420)
- dst2 = dst_base + pPriv->UBufOffset;
- else
- dst2 = dst_base + pPriv->VBufOffset;
-
- i830_memcpy_plane(dst2, src2, h/2, w/2,
- dstPitch, srcPitch2, pPriv->rotation);
-
- /* Copy U data for YV12, or V data for I420 */
- src3 = buf + /* start of YUV data */
- (srcH * srcPitch) + /* move over Luma plane */
- ((srcH >> 1) * srcPitch2) + /* move over Chroma plane */
- ((top * srcPitch) >> 2) + /* move down from by top lines */
- (left >> 1); /* move left by left pixels */
+ if (id == FOURCC_I420)
+ dst2 = dst_base + pPriv->UBufOffset;
+ else
+ dst2 = dst_base + pPriv->VBufOffset;
+
+ i830_memcpy_plane(dst2, src2, h / 2, w / 2,
+ dstPitch, srcPitch2, pPriv->rotation);
+
+ /* Copy U data for YV12, or V data for I420 */
+ src3 = buf + /* start of YUV data */
+ (srcH * srcPitch) + /* move over Luma plane */
+ ((srcH >> 1) * srcPitch2) + /* move over Chroma plane */
+ ((top * srcPitch) >> 2) + /* move down from by top lines */
+ (left >> 1); /* move left by left pixels */
#if 0
- ErrorF("src3 is %p, offset is %ld\n", src3,
- (unsigned long)src3 - (unsigned long)buf);
+ ErrorF("src3 is %p, offset is %ld\n", src3,
+ (unsigned long)src3 - (unsigned long)buf);
#endif
- if (id == FOURCC_I420)
- dst3 = dst_base + pPriv->VBufOffset;
- else
- dst3 = dst_base + pPriv->UBufOffset;
+ if (id == FOURCC_I420)
+ dst3 = dst_base + pPriv->VBufOffset;
+ else
+ dst3 = dst_base + pPriv->UBufOffset;
- i830_memcpy_plane(dst3, src3, h/2, w/2,
- dstPitch, srcPitch2, pPriv->rotation);
+ i830_memcpy_plane(dst3, src3, h / 2, w / 2,
+ dstPitch, srcPitch2, pPriv->rotation);
- drm_intel_bo_unmap(pPriv->buf);
+ drm_intel_bo_unmap(pPriv->buf);
}
typedef struct {
- uint8_t sign;
- uint16_t mantissa;
- uint8_t exponent;
+ uint8_t sign;
+ uint16_t mantissa;
+ uint8_t exponent;
} coeffRec, *coeffPtr;
-static void
-i830_box_intersect (BoxPtr dest, BoxPtr a, BoxPtr b)
+static void i830_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
{
- dest->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
- dest->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
- dest->y1 = a->y1 > b->y1 ? a->y1 : b->y1;
- dest->y2 = a->y2 < b->y2 ? a->y2 : b->y2;
- if (dest->x1 >= dest->x2 || dest->y1 >= dest->y2)
- dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
+ dest->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
+ dest->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
+ dest->y1 = a->y1 > b->y1 ? a->y1 : b->y1;
+ dest->y2 = a->y2 < b->y2 ? a->y2 : b->y2;
+ if (dest->x1 >= dest->x2 || dest->y1 >= dest->y2)
+ dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
}
-static void
-i830_crtc_box (xf86CrtcPtr crtc, BoxPtr crtc_box)
+static void i830_crtc_box(xf86CrtcPtr crtc, BoxPtr crtc_box)
{
- if (crtc->enabled)
- {
- crtc_box->x1 = crtc->x;
- crtc_box->x2 = crtc->x + xf86ModeWidth (&crtc->mode, crtc->rotation);
- crtc_box->y1 = crtc->y;
- crtc_box->y2 = crtc->y + xf86ModeHeight (&crtc->mode, crtc->rotation);
- }
- else
- crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
+ if (crtc->enabled) {
+ crtc_box->x1 = crtc->x;
+ crtc_box->x2 =
+ crtc->x + xf86ModeWidth(&crtc->mode, crtc->rotation);
+ crtc_box->y1 = crtc->y;
+ crtc_box->y2 =
+ crtc->y + xf86ModeHeight(&crtc->mode, crtc->rotation);
+ } else
+ crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
}
-static int
-i830_box_area (BoxPtr box)
+static int i830_box_area(BoxPtr box)
{
- return (int) (box->x2 - box->x1) * (int) (box->y2 - box->y1);
+ return (int)(box->x2 - box->x1) * (int)(box->y2 - box->y1);
}
/*
@@ -1121,447 +1130,452 @@ i830_box_area (BoxPtr box)
*/
xf86CrtcPtr
-i830_covering_crtc (ScrnInfoPtr pScrn,
- BoxPtr box,
- xf86CrtcPtr desired,
- BoxPtr crtc_box_ret)
+i830_covering_crtc(ScrnInfoPtr pScrn,
+ BoxPtr box, xf86CrtcPtr desired, BoxPtr crtc_box_ret)
{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- xf86CrtcPtr crtc, best_crtc;
- int coverage, best_coverage;
- int c;
- BoxRec crtc_box, cover_box;
-
- best_crtc = NULL;
- best_coverage = 0;
- crtc_box_ret->x1 = 0;
- crtc_box_ret->x2 = 0;
- crtc_box_ret->y1 = 0;
- crtc_box_ret->y2 = 0;
- for (c = 0; c < xf86_config->num_crtc; c++)
- {
- crtc = xf86_config->crtc[c];
-
- /* If the CRTC is off, treat it as not covering */
- if (!i830_crtc_on(crtc))
- continue;
-
- i830_crtc_box (crtc, &crtc_box);
- i830_box_intersect (&cover_box, &crtc_box, box);
- coverage = i830_box_area (&cover_box);
- if (coverage && crtc == desired)
- {
- *crtc_box_ret = crtc_box;
- return crtc;
- }
- if (coverage > best_coverage)
- {
- *crtc_box_ret = crtc_box;
- best_crtc = crtc;
- best_coverage = coverage;
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ xf86CrtcPtr crtc, best_crtc;
+ int coverage, best_coverage;
+ int c;
+ BoxRec crtc_box, cover_box;
+
+ best_crtc = NULL;
+ best_coverage = 0;
+ crtc_box_ret->x1 = 0;
+ crtc_box_ret->x2 = 0;
+ crtc_box_ret->y1 = 0;
+ crtc_box_ret->y2 = 0;
+ for (c = 0; c < xf86_config->num_crtc; c++) {
+ crtc = xf86_config->crtc[c];
+
+ /* If the CRTC is off, treat it as not covering */
+ if (!i830_crtc_on(crtc))
+ continue;
+
+ i830_crtc_box(crtc, &crtc_box);
+ i830_box_intersect(&cover_box, &crtc_box, box);
+ coverage = i830_box_area(&cover_box);
+ if (coverage && crtc == desired) {
+ *crtc_box_ret = crtc_box;
+ return crtc;
+ }
+ if (coverage > best_coverage) {
+ *crtc_box_ret = crtc_box;
+ best_crtc = crtc;
+ best_coverage = coverage;
+ }
}
- }
- return best_crtc;
+ return best_crtc;
}
static void
i830_update_dst_box_to_crtc_coords(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
- BoxPtr dstBox)
+ BoxPtr dstBox)
{
- int tmp;
-
- /* for overlay, we should take it from crtc's screen
- * coordinate to current crtc's display mode.
- * yeah, a bit confusing.
- */
- switch (crtc->rotation & 0xf) {
- case RR_Rotate_0:
- dstBox->x1 -= crtc->x;
- dstBox->x2 -= crtc->x;
- dstBox->y1 -= crtc->y;
- dstBox->y2 -= crtc->y;
- break;
- case RR_Rotate_90:
- tmp = dstBox->x1;
- dstBox->x1 = dstBox->y1 - crtc->x;
- dstBox->y1 = pScrn->virtualX - tmp - crtc->y;
- tmp = dstBox->x2;
- dstBox->x2 = dstBox->y2 - crtc->x;
- dstBox->y2 = pScrn->virtualX - tmp - crtc->y;
- tmp = dstBox->y1;
- dstBox->y1 = dstBox->y2;
- dstBox->y2 = tmp;
- break;
- case RR_Rotate_180:
- tmp = dstBox->x1;
- dstBox->x1 = pScrn->virtualX - dstBox->x2 - crtc->x;
- dstBox->x2 = pScrn->virtualX - tmp - crtc->x;
- tmp = dstBox->y1;
- dstBox->y1 = pScrn->virtualY - dstBox->y2 - crtc->y;
- dstBox->y2 = pScrn->virtualY - tmp - crtc->y;
- break;
- case RR_Rotate_270:
- tmp = dstBox->x1;
- dstBox->x1 = pScrn->virtualY - dstBox->y1 - crtc->x;
- dstBox->y1 = tmp - crtc->y;
- tmp = dstBox->x2;
- dstBox->x2 = pScrn->virtualY - dstBox->y2 - crtc->x;
- dstBox->y2 = tmp - crtc->y;
- tmp = dstBox->x1;
- dstBox->x1 = dstBox->x2;
- dstBox->x2 = tmp;
- break;
- }
-
- return;
+ int tmp;
+
+ /* for overlay, we should take it from crtc's screen
+ * coordinate to current crtc's display mode.
+ * yeah, a bit confusing.
+ */
+ switch (crtc->rotation & 0xf) {
+ case RR_Rotate_0:
+ dstBox->x1 -= crtc->x;
+ dstBox->x2 -= crtc->x;
+ dstBox->y1 -= crtc->y;
+ dstBox->y2 -= crtc->y;
+ break;
+ case RR_Rotate_90:
+ tmp = dstBox->x1;
+ dstBox->x1 = dstBox->y1 - crtc->x;
+ dstBox->y1 = pScrn->virtualX - tmp - crtc->y;
+ tmp = dstBox->x2;
+ dstBox->x2 = dstBox->y2 - crtc->x;
+ dstBox->y2 = pScrn->virtualX - tmp - crtc->y;
+ tmp = dstBox->y1;
+ dstBox->y1 = dstBox->y2;
+ dstBox->y2 = tmp;
+ break;
+ case RR_Rotate_180:
+ tmp = dstBox->x1;
+ dstBox->x1 = pScrn->virtualX - dstBox->x2 - crtc->x;
+ dstBox->x2 = pScrn->virtualX - tmp - crtc->x;
+ tmp = dstBox->y1;
+ dstBox->y1 = pScrn->virtualY - dstBox->y2 - crtc->y;
+ dstBox->y2 = pScrn->virtualY - tmp - crtc->y;
+ break;
+ case RR_Rotate_270:
+ tmp = dstBox->x1;
+ dstBox->x1 = pScrn->virtualY - dstBox->y1 - crtc->x;
+ dstBox->y1 = tmp - crtc->y;
+ tmp = dstBox->x2;
+ dstBox->x2 = pScrn->virtualY - dstBox->y2 - crtc->x;
+ dstBox->y2 = tmp - crtc->y;
+ tmp = dstBox->x1;
+ dstBox->x1 = dstBox->x2;
+ dstBox->x2 = tmp;
+ break;
+ }
+
+ return;
}
-int
-is_planar_fourcc(int id)
+int is_planar_fourcc(int id)
{
- switch (id) {
- case FOURCC_YV12:
- case FOURCC_I420:
+ switch (id) {
+ case FOURCC_YV12:
+ case FOURCC_I420:
#ifdef INTEL_XVMC
- case FOURCC_XVMC:
+ case FOURCC_XVMC:
#endif
- return 1;
- case FOURCC_UYVY:
- case FOURCC_YUY2:
- return 0;
- default:
- ErrorF("Unknown format 0x%x\n", id);
- return 0;
- }
+ return 1;
+ case FOURCC_UYVY:
+ case FOURCC_YUY2:
+ return 0;
+ default:
+ ErrorF("Unknown format 0x%x\n", id);
+ return 0;
+ }
}
-static int
-xvmc_passthrough(int id, Rotation rotation)
+static int xvmc_passthrough(int id, Rotation rotation)
{
#ifdef INTEL_XVMC
- return id == FOURCC_XVMC && rotation == RR_Rotate_0;
+ return id == FOURCC_XVMC && rotation == RR_Rotate_0;
#else
- return 0;
+ return 0;
#endif
}
static Bool
i830_display_overlay(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
- int id, short width, short height,
- int dstPitch, int x1, int y1, int x2, int y2, BoxPtr dstBox,
- short src_w, short src_h, short drw_w, short drw_h)
+ int id, short width, short height,
+ int dstPitch, int x1, int y1, int x2, int y2,
+ BoxPtr dstBox, short src_w, short src_h, short drw_w,
+ short drw_h)
{
- I830Ptr pI830 = I830PTR(pScrn);
- I830PortPrivPtr pPriv = pI830->adaptor->pPortPrivates[0].ptr;
- int tmp;
+ I830Ptr pI830 = I830PTR(pScrn);
+ I830PortPrivPtr pPriv = pI830->adaptor->pPortPrivates[0].ptr;
+ int tmp;
- OVERLAY_DEBUG("I830DisplayVideo: %dx%d (pitch %d)\n", width, height,
- dstPitch);
+ OVERLAY_DEBUG("I830DisplayVideo: %dx%d (pitch %d)\n", width, height,
+ dstPitch);
#if VIDEO_DEBUG
- CompareOverlay(pI830, (uint32_t *) overlay, 0x100);
+ CompareOverlay(pI830, (uint32_t *) overlay, 0x100);
#endif
- /*
- * If the video isn't visible on any CRTC, turn it off
- */
- if (!crtc)
- {
- pPriv->current_crtc = NULL;
- drmmode_overlay_off(pScrn);
+ /*
+ * If the video isn't visible on any CRTC, turn it off
+ */
+ if (!crtc) {
+ pPriv->current_crtc = NULL;
+ drmmode_overlay_off(pScrn);
- return TRUE;
- }
-
- i830_update_dst_box_to_crtc_coords(pScrn, crtc, dstBox);
-
- if (crtc->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
- tmp = width;
- width = height;
- height = tmp;
- tmp = drw_w;
- drw_w = drw_h;
- drw_h = tmp;
- tmp = src_w;
- src_w = src_h;
- src_h = tmp;
- }
-
- return drmmode_overlay_put_image(pScrn, crtc, id, width, height, dstPitch,
- x1, y1, x2, y2, dstBox,
- src_w, src_h, drw_w, drw_h);
+ return TRUE;
+ }
+
+ i830_update_dst_box_to_crtc_coords(pScrn, crtc, dstBox);
+
+ if (crtc->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
+ tmp = width;
+ width = height;
+ height = tmp;
+ tmp = drw_w;
+ drw_w = drw_h;
+ drw_h = tmp;
+ tmp = src_w;
+ src_w = src_h;
+ src_h = tmp;
+ }
+
+ return drmmode_overlay_put_image(pScrn, crtc, id, width, height,
+ dstPitch, x1, y1, x2, y2, dstBox,
+ src_w, src_h, drw_w, drw_h);
}
static Bool
-i830_clip_video_helper (ScrnInfoPtr pScrn,
- I830PortPrivPtr pPriv,
- xf86CrtcPtr *crtc_ret,
- BoxPtr dst,
- INT32 *xa,
- INT32 *xb,
- INT32 *ya,
- INT32 *yb,
- RegionPtr reg,
- INT32 width,
- INT32 height)
+i830_clip_video_helper(ScrnInfoPtr pScrn,
+ I830PortPrivPtr pPriv,
+ xf86CrtcPtr * crtc_ret,
+ BoxPtr dst,
+ INT32 * xa,
+ INT32 * xb,
+ INT32 * ya,
+ INT32 * yb, RegionPtr reg, INT32 width, INT32 height)
{
- Bool ret;
- RegionRec crtc_region_local;
- RegionPtr crtc_region = reg;
-
- /*
- * For overlay video, compute the relevant CRTC and
- * clip video to that
- */
- if (crtc_ret)
- {
- BoxRec crtc_box;
- xf86CrtcPtr crtc = i830_covering_crtc (pScrn, dst,
- pPriv->desired_crtc,
- &crtc_box);
-
- /* For textured video, we don't actually want to clip at all. */
- if (crtc && !pPriv->textured)
- {
- REGION_INIT (pScreen, &crtc_region_local, &crtc_box, 1);
- crtc_region = &crtc_region_local;
- REGION_INTERSECT (pScreen, crtc_region, crtc_region, reg);
+ Bool ret;
+ RegionRec crtc_region_local;
+ RegionPtr crtc_region = reg;
+
+ /*
+ * For overlay video, compute the relevant CRTC and
+ * clip video to that
+ */
+ if (crtc_ret) {
+ BoxRec crtc_box;
+ xf86CrtcPtr crtc = i830_covering_crtc(pScrn, dst,
+ pPriv->desired_crtc,
+ &crtc_box);
+
+ /* For textured video, we don't actually want to clip at all. */
+ if (crtc && !pPriv->textured) {
+ REGION_INIT(pScreen, &crtc_region_local, &crtc_box, 1);
+ crtc_region = &crtc_region_local;
+ REGION_INTERSECT(pScreen, crtc_region, crtc_region,
+ reg);
+ }
+ *crtc_ret = crtc;
}
- *crtc_ret = crtc;
- }
- ret = xf86XVClipVideoHelper (dst, xa, xb, ya, yb,
- crtc_region, width, height);
- if (crtc_region != reg)
- REGION_UNINIT (pScreen, &crtc_region_local);
- return ret;
+ ret = xf86XVClipVideoHelper(dst, xa, xb, ya, yb,
+ crtc_region, width, height);
+ if (crtc_region != reg)
+ REGION_UNINIT(pScreen, &crtc_region_local);
+ return ret;
}
static void
-i830_fill_colorkey (ScreenPtr pScreen, uint32_t key, RegionPtr clipboxes)
+i830_fill_colorkey(ScreenPtr pScreen, uint32_t key, RegionPtr clipboxes)
{
- DrawablePtr root = &WindowTable[pScreen->myNum]->drawable;
- XID pval[2];
- BoxPtr pbox = REGION_RECTS(clipboxes);
- int i, nbox = REGION_NUM_RECTS(clipboxes);
- xRectangle *rects;
- GCPtr gc;
-
- if(!xf86Screens[pScreen->myNum]->vtSema) return;
-
- gc = GetScratchGC(root->depth, pScreen);
- pval[0] = key;
- pval[1] = IncludeInferiors;
- (void) ChangeGC(gc, GCForeground|GCSubwindowMode, pval);
- ValidateGC(root, gc);
-
- rects = xalloc (nbox * sizeof(xRectangle));
-
- for(i = 0; i < nbox; i++, pbox++)
- {
- rects[i].x = pbox->x1;
- rects[i].y = pbox->y1;
- rects[i].width = pbox->x2 - pbox->x1;
- rects[i].height = pbox->y2 - pbox->y1;
- }
-
- (*gc->ops->PolyFillRect)(root, gc, nbox, rects);
-
- xfree (rects);
- FreeScratchGC (gc);
+ DrawablePtr root = &WindowTable[pScreen->myNum]->drawable;
+ XID pval[2];
+ BoxPtr pbox = REGION_RECTS(clipboxes);
+ int i, nbox = REGION_NUM_RECTS(clipboxes);
+ xRectangle *rects;
+ GCPtr gc;
+
+ if (!xf86Screens[pScreen->myNum]->vtSema)
+ return;
+
+ gc = GetScratchGC(root->depth, pScreen);
+ pval[0] = key;
+ pval[1] = IncludeInferiors;
+ (void)ChangeGC(gc, GCForeground | GCSubwindowMode, pval);
+ ValidateGC(root, gc);
+
+ rects = xalloc(nbox * sizeof(xRectangle));
+
+ for (i = 0; i < nbox; i++, pbox++) {
+ rects[i].x = pbox->x1;
+ rects[i].y = pbox->y1;
+ rects[i].width = pbox->x2 - pbox->x1;
+ rects[i].height = pbox->y2 - pbox->y1;
+ }
+
+ (*gc->ops->PolyFillRect) (root, gc, nbox, rects);
+
+ xfree(rects);
+ FreeScratchGC(gc);
}
static void
i830_wait_for_scanline(ScrnInfoPtr pScrn, PixmapPtr pPixmap,
- xf86CrtcPtr crtc, RegionPtr clipBoxes)
+ xf86CrtcPtr crtc, RegionPtr clipBoxes)
{
- I830Ptr pI830 = I830PTR(pScrn);
- BoxPtr box;
- pixman_box16_t box_in_crtc_coordinates;
- int pipe = -1, event, load_scan_lines_pipe;
-
- if (pixmap_is_scanout(pPixmap))
- pipe = i830_crtc_to_pipe(crtc);
-
- if (pipe >= 0) {
- if (pipe == 0) {
- event = MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
- load_scan_lines_pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEA;
- } else {
- event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
- load_scan_lines_pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEB;
+ I830Ptr pI830 = I830PTR(pScrn);
+ BoxPtr box;
+ pixman_box16_t box_in_crtc_coordinates;
+ int pipe = -1, event, load_scan_lines_pipe;
+
+ if (pixmap_is_scanout(pPixmap))
+ pipe = i830_crtc_to_pipe(crtc);
+
+ if (pipe >= 0) {
+ if (pipe == 0) {
+ event = MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
+ load_scan_lines_pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEA;
+ } else {
+ event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
+ load_scan_lines_pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEB;
+ }
+
+ box = REGION_EXTENTS(unused, clipBoxes);
+ box_in_crtc_coordinates = *box;
+ if (crtc->transform_in_use)
+ pixman_f_transform_bounds(&crtc->f_framebuffer_to_crtc,
+ &box_in_crtc_coordinates);
+
+ BEGIN_BATCH(5);
+ /* The documentation says that the LOAD_SCAN_LINES command
+ * always comes in pairs. Don't ask me why. */
+ OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | load_scan_lines_pipe);
+ OUT_BATCH((box_in_crtc_coordinates.
+ y1 << 16) | box_in_crtc_coordinates.y2);
+ OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | load_scan_lines_pipe);
+ OUT_BATCH((box_in_crtc_coordinates.
+ y1 << 16) | box_in_crtc_coordinates.y2);
+ OUT_BATCH(MI_WAIT_FOR_EVENT | event);
+ ADVANCE_BATCH();
}
-
- box = REGION_EXTENTS(unused, clipBoxes);
- box_in_crtc_coordinates = *box;
- if (crtc->transform_in_use)
- pixman_f_transform_bounds (&crtc->f_framebuffer_to_crtc, &box_in_crtc_coordinates);
-
- BEGIN_BATCH(5);
- /* The documentation says that the LOAD_SCAN_LINES command
- * always comes in pairs. Don't ask me why. */
- OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | load_scan_lines_pipe);
- OUT_BATCH((box_in_crtc_coordinates.y1 << 16) | box_in_crtc_coordinates.y2);
- OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | load_scan_lines_pipe);
- OUT_BATCH((box_in_crtc_coordinates.y1 << 16) | box_in_crtc_coordinates.y2);
- OUT_BATCH(MI_WAIT_FOR_EVENT | event);
- ADVANCE_BATCH();
- }
}
static Bool
i830_setup_video_buffer(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
- int alloc_size, int id)
+ int alloc_size, int id)
{
- I830Ptr pI830 = I830PTR(pScrn);
- /* Free the current buffer if we're going to have to reallocate */
- if (pPriv->buf && pPriv->buf->size < alloc_size) {
- drm_intel_bo_unreference(pPriv->buf);
- pPriv->buf = NULL;
- }
-
- if (xvmc_passthrough(id, pPriv->rotation)) {
- i830_free_video_buffers(pPriv);
- } else {
- if (pPriv->buf == NULL) {
- pPriv->buf = drm_intel_bo_alloc(pI830->bufmgr,
- "xv buffer", alloc_size, 4096);
- if (pPriv->buf == NULL)
- return FALSE;
- }
- }
-
- return TRUE;
+ I830Ptr pI830 = I830PTR(pScrn);
+ /* Free the current buffer if we're going to have to reallocate */
+ if (pPriv->buf && pPriv->buf->size < alloc_size) {
+ drm_intel_bo_unreference(pPriv->buf);
+ pPriv->buf = NULL;
+ }
+
+ if (xvmc_passthrough(id, pPriv->rotation)) {
+ i830_free_video_buffers(pPriv);
+ } else {
+ if (pPriv->buf == NULL) {
+ pPriv->buf = drm_intel_bo_alloc(pI830->bufmgr,
+ "xv buffer", alloc_size,
+ 4096);
+ if (pPriv->buf == NULL)
+ return FALSE;
+ }
+ }
+
+ return TRUE;
}
static void
i830_dst_pitch_and_size(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, short width,
- short height, int *dstPitch, int *dstPitch2, int *size, int id)
+ short height, int *dstPitch, int *dstPitch2, int *size,
+ int id)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int pitchAlignMask;
-
- /* Only needs to be DWORD-aligned for textured on i915, but overlay has
- * stricter requirements.
- */
- if (pPriv->textured) {
- pitchAlignMask = 3;
+ I830Ptr pI830 = I830PTR(pScrn);
+ int pitchAlignMask;
+
+ /* Only needs to be DWORD-aligned for textured on i915, but overlay has
+ * stricter requirements.
+ */
+ if (pPriv->textured) {
+ pitchAlignMask = 3;
#ifdef INTEL_XVMC
- /* for i915 xvmc, hw requires at least 1kb aligned surface */
- if ((id == FOURCC_XVMC) && IS_I915(pI830))
- pitchAlignMask = 0x3ff;
+ /* for i915 xvmc, hw requires at least 1kb aligned surface */
+ if ((id == FOURCC_XVMC) && IS_I915(pI830))
+ pitchAlignMask = 0x3ff;
#endif
- } else {
- if (IS_I965G(pI830))
- pitchAlignMask = 255;
- else
- pitchAlignMask = 63;
- }
-
- /* Determine the desired destination pitch (representing the chroma's pitch,
- * in the planar case.
- */
- switch (id) {
- case FOURCC_YV12:
- case FOURCC_I420:
- if (pPriv->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
- *dstPitch = ((height / 2) + pitchAlignMask) & ~pitchAlignMask;
- *size = *dstPitch * width * 3;
} else {
- *dstPitch = ((width / 2) + pitchAlignMask) & ~pitchAlignMask;
- *size = *dstPitch * height * 3;
+ if (IS_I965G(pI830))
+ pitchAlignMask = 255;
+ else
+ pitchAlignMask = 63;
}
- break;
- case FOURCC_UYVY:
- case FOURCC_YUY2:
- if (pPriv->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
- *dstPitch = ((height << 1) + pitchAlignMask) & ~pitchAlignMask;
- *size = *dstPitch * width;
- } else {
- *dstPitch = ((width << 1) + pitchAlignMask) & ~pitchAlignMask;
- *size = *dstPitch * height;
- }
- break;
+ /* Determine the desired destination pitch (representing the chroma's pitch,
+ * in the planar case.
+ */
+ switch (id) {
+ case FOURCC_YV12:
+ case FOURCC_I420:
+ if (pPriv->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
+ *dstPitch =
+ ((height / 2) + pitchAlignMask) & ~pitchAlignMask;
+ *size = *dstPitch * width * 3;
+ } else {
+ *dstPitch =
+ ((width / 2) + pitchAlignMask) & ~pitchAlignMask;
+ *size = *dstPitch * height * 3;
+ }
+ break;
+ case FOURCC_UYVY:
+ case FOURCC_YUY2:
+
+ if (pPriv->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
+ *dstPitch =
+ ((height << 1) + pitchAlignMask) & ~pitchAlignMask;
+ *size = *dstPitch * width;
+ } else {
+ *dstPitch =
+ ((width << 1) + pitchAlignMask) & ~pitchAlignMask;
+ *size = *dstPitch * height;
+ }
+ break;
#ifdef INTEL_XVMC
- case FOURCC_XVMC:
- *dstPitch = ((width / 2) + pitchAlignMask ) & ~pitchAlignMask;
- *dstPitch2 = (width + pitchAlignMask ) & ~pitchAlignMask;
- *size = 0;
- break;
+ case FOURCC_XVMC:
+ *dstPitch = ((width / 2) + pitchAlignMask) & ~pitchAlignMask;
+ *dstPitch2 = (width + pitchAlignMask) & ~pitchAlignMask;
+ *size = 0;
+ break;
#endif
- default:
- *dstPitch = 0;
- *size = 0;
- break;
- }
+ default:
+ *dstPitch = 0;
+ *size = 0;
+ break;
+ }
#if 0
- ErrorF("srcPitch: %d, dstPitch: %d, size: %d\n", srcPitch, *dstPitch, size);
+ ErrorF("srcPitch: %d, dstPitch: %d, size: %d\n", srcPitch, *dstPitch,
+ size);
#endif
}
static Bool
i830_copy_video_data(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
- short width, short height, int *dstPitch, int *dstPitch2,
- INT32 x1, INT32 y1, INT32 x2, INT32 y2,
- int id, unsigned char *buf)
+ short width, short height, int *dstPitch, int *dstPitch2,
+ INT32 x1, INT32 y1, INT32 x2, INT32 y2,
+ int id, unsigned char *buf)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int srcPitch = 0, srcPitch2 = 0;
- int top, left, npixels, nlines, size;
+ I830Ptr pI830 = I830PTR(pScrn);
+ int srcPitch = 0, srcPitch2 = 0;
+ int top, left, npixels, nlines, size;
- if (is_planar_fourcc(id)) {
- srcPitch = (width + 0x3) & ~0x3;
- srcPitch2 = ((width >> 1) + 0x3) & ~0x3;
- } else {
- srcPitch = width << 1;
- }
+ if (is_planar_fourcc(id)) {
+ srcPitch = (width + 0x3) & ~0x3;
+ srcPitch2 = ((width >> 1) + 0x3) & ~0x3;
+ } else {
+ srcPitch = width << 1;
+ }
- i830_dst_pitch_and_size(pScrn, pPriv, width, height, dstPitch, dstPitch2,
- &size, id);
+ i830_dst_pitch_and_size(pScrn, pPriv, width, height, dstPitch,
+ dstPitch2, &size, id);
- if (!i830_setup_video_buffer(pScrn, pPriv, size, id))
- return FALSE;
+ if (!i830_setup_video_buffer(pScrn, pPriv, size, id))
+ return FALSE;
- /* fixup pointers */
+ /* fixup pointers */
#ifdef INTEL_XVMC
- if (id == FOURCC_XVMC && IS_I915(pI830)) {
- pPriv->YBufOffset = (uint32_t)((uintptr_t)buf);
- pPriv->VBufOffset = pPriv->YBufOffset + (*dstPitch2 * height);
- pPriv->UBufOffset = pPriv->VBufOffset + (*dstPitch * height / 2);
- } else {
-#endif
- pPriv->YBufOffset = 0;
-
- if (pPriv->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
- pPriv->UBufOffset = pPriv->YBufOffset + (*dstPitch * 2 * width);
- pPriv->VBufOffset = pPriv->UBufOffset + (*dstPitch * width / 2);
+ if (id == FOURCC_XVMC && IS_I915(pI830)) {
+ pPriv->YBufOffset = (uint32_t) ((uintptr_t) buf);
+ pPriv->VBufOffset = pPriv->YBufOffset + (*dstPitch2 * height);
+ pPriv->UBufOffset =
+ pPriv->VBufOffset + (*dstPitch * height / 2);
} else {
- pPriv->UBufOffset = pPriv->YBufOffset + (*dstPitch * 2 * height);
- pPriv->VBufOffset = pPriv->UBufOffset + (*dstPitch * height / 2);
- }
+#endif
+ pPriv->YBufOffset = 0;
+
+ if (pPriv->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
+ pPriv->UBufOffset =
+ pPriv->YBufOffset + (*dstPitch * 2 * width);
+ pPriv->VBufOffset =
+ pPriv->UBufOffset + (*dstPitch * width / 2);
+ } else {
+ pPriv->UBufOffset =
+ pPriv->YBufOffset + (*dstPitch * 2 * height);
+ pPriv->VBufOffset =
+ pPriv->UBufOffset + (*dstPitch * height / 2);
+ }
#ifdef INTEL_XVMC
- }
+ }
#endif
- /* copy data */
- top = y1 >> 16;
- left = (x1 >> 16) & ~1;
- npixels = ((((x2 + 0xffff) >> 16) + 1) & ~1) - left;
-
- if (is_planar_fourcc(id)) {
- if (!xvmc_passthrough(id, pPriv->rotation)) {
- top &= ~1;
- nlines = ((((y2 + 0xffff) >> 16) + 1) & ~1) - top;
- I830CopyPlanarData(pPriv, buf, srcPitch, srcPitch2, *dstPitch,
- height, top, left, nlines, npixels, id);
+ /* copy data */
+ top = y1 >> 16;
+ left = (x1 >> 16) & ~1;
+ npixels = ((((x2 + 0xffff) >> 16) + 1) & ~1) - left;
+
+ if (is_planar_fourcc(id)) {
+ if (!xvmc_passthrough(id, pPriv->rotation)) {
+ top &= ~1;
+ nlines = ((((y2 + 0xffff) >> 16) + 1) & ~1) - top;
+ I830CopyPlanarData(pPriv, buf, srcPitch, srcPitch2,
+ *dstPitch, height, top, left, nlines,
+ npixels, id);
+ }
+ } else {
+ nlines = ((y2 + 0xffff) >> 16) - top;
+ I830CopyPackedData(pPriv, buf, srcPitch, *dstPitch, top, left,
+ nlines, npixels);
}
- } else {
- nlines = ((y2 + 0xffff) >> 16) - top;
- I830CopyPackedData(pPriv, buf, srcPitch, *dstPitch, top, left,
- nlines, npixels);
- }
- return TRUE;
+ return TRUE;
}
/*
@@ -1585,108 +1599,112 @@ I830PutImage(ScrnInfoPtr pScrn,
short drw_w, short drw_h,
int id, unsigned char *buf,
short width, short height,
- Bool sync, RegionPtr clipBoxes, pointer data,
- DrawablePtr pDraw)
+ Bool sync, RegionPtr clipBoxes, pointer data, DrawablePtr pDraw)
{
- I830Ptr pI830 = I830PTR(pScrn);
- I830PortPrivPtr pPriv = (I830PortPrivPtr) data;
- ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
- PixmapPtr pPixmap = get_drawable_pixmap(pDraw);;
- INT32 x1, x2, y1, y2;
- int dstPitch;
- int dstPitch2 = 0;
- BoxRec dstBox;
- xf86CrtcPtr crtc;
+ I830Ptr pI830 = I830PTR(pScrn);
+ I830PortPrivPtr pPriv = (I830PortPrivPtr) data;
+ ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
+ PixmapPtr pPixmap = get_drawable_pixmap(pDraw);;
+ INT32 x1, x2, y1, y2;
+ int dstPitch;
+ int dstPitch2 = 0;
+ BoxRec dstBox;
+ xf86CrtcPtr crtc;
#if 0
- ErrorF("I830PutImage: src: (%d,%d)(%d,%d), dst: (%d,%d)(%d,%d)\n"
- "width %d, height %d\n", src_x, src_y, src_w, src_h, drw_x, drw_y,
- drw_w, drw_h, width, height);
+ ErrorF("I830PutImage: src: (%d,%d)(%d,%d), dst: (%d,%d)(%d,%d)\n"
+ "width %d, height %d\n", src_x, src_y, src_w, src_h, drw_x,
+ drw_y, drw_w, drw_h, width, height);
#endif
- if (!pPriv->textured) {
- /* If dst width and height are less than 1/8th the src size, the
- * src/dst scale factor becomes larger than 8 and doesn't fit in
- * the scale register. */
- if(src_w >= (drw_w * 8))
- drw_w = src_w/7;
-
- if(src_h >= (drw_h * 8))
- drw_h = src_h/7;
- }
-
- /* Clip */
- x1 = src_x;
- x2 = src_x + src_w;
- y1 = src_y;
- y2 = src_y + src_h;
-
- dstBox.x1 = drw_x;
- dstBox.x2 = drw_x + drw_w;
- dstBox.y1 = drw_y;
- dstBox.y2 = drw_y + drw_h;
-
- if (!i830_clip_video_helper(pScrn,
- pPriv,
- &crtc,
- &dstBox, &x1, &x2, &y1, &y2, clipBoxes,
- width, height))
- return Success;
+ if (!pPriv->textured) {
+ /* If dst width and height are less than 1/8th the src size, the
+ * src/dst scale factor becomes larger than 8 and doesn't fit in
+ * the scale register. */
+ if (src_w >= (drw_w * 8))
+ drw_w = src_w / 7;
- if (!pPriv->textured) {
- /* texture video handles rotation differently. */
- if (crtc)
- pPriv->rotation = crtc->rotation;
- else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Fail to clip video to any crtc!\n");
- return Success;
+ if (src_h >= (drw_h * 8))
+ drw_h = src_h / 7;
}
- }
-
- if (!i830_copy_video_data(pScrn, pPriv, width, height,
- &dstPitch, &dstPitch2,
- x1, y1, x2, y2, id, buf))
- return BadAlloc;
-
- if (!pPriv->textured) {
- if (!i830_display_overlay(pScrn, crtc, id, width, height, dstPitch,
- x1, y1, x2, y2, &dstBox, src_w, src_h,
- drw_w, drw_h))
- return BadAlloc;
-
- /* update cliplist */
- if (!REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes)) {
- REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
- i830_fill_colorkey (pScreen, pPriv->colorKey, clipBoxes);
+
+ /* Clip */
+ x1 = src_x;
+ x2 = src_x + src_w;
+ y1 = src_y;
+ y2 = src_y + src_h;
+
+ dstBox.x1 = drw_x;
+ dstBox.x2 = drw_x + drw_w;
+ dstBox.y1 = drw_y;
+ dstBox.y2 = drw_y + drw_h;
+
+ if (!i830_clip_video_helper(pScrn,
+ pPriv,
+ &crtc,
+ &dstBox, &x1, &x2, &y1, &y2, clipBoxes,
+ width, height))
+ return Success;
+
+ if (!pPriv->textured) {
+ /* texture video handles rotation differently. */
+ if (crtc)
+ pPriv->rotation = crtc->rotation;
+ else {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Fail to clip video to any crtc!\n");
+ return Success;
+ }
}
- } else {
- if (crtc && pPriv->SyncToVblank != 0) {
- i830_wait_for_scanline(pScrn, pPixmap, crtc, clipBoxes);
- }
-
- if (IS_I965G(pI830)) {
- if (xvmc_passthrough(id, pPriv->rotation)) {
- /* XXX: KMS */
- pPriv->YBufOffset = (uintptr_t)buf;
- pPriv->UBufOffset = pPriv->YBufOffset + height*width;
- pPriv->VBufOffset = pPriv->UBufOffset + height*width/4;
- }
- I965DisplayVideoTextured(pScrn, pPriv, id, clipBoxes, width, height,
- dstPitch, x1, y1, x2, y2,
- src_w, src_h, drw_w, drw_h, pPixmap);
- } else {
- I915DisplayVideoTextured(pScrn, pPriv, id, clipBoxes, width, height,
- dstPitch, dstPitch2, x1, y1, x2, y2,
- src_w, src_h, drw_w, drw_h, pPixmap);
- }
-
- DamageDamageRegion(pDraw, clipBoxes);
- }
-
- pPriv->videoStatus = CLIENT_VIDEO_ON;
-
- return Success;
+
+ if (!i830_copy_video_data(pScrn, pPriv, width, height,
+ &dstPitch, &dstPitch2,
+ x1, y1, x2, y2, id, buf))
+ return BadAlloc;
+
+ if (!pPriv->textured) {
+ if (!i830_display_overlay
+ (pScrn, crtc, id, width, height, dstPitch, x1, y1, x2, y2,
+ &dstBox, src_w, src_h, drw_w, drw_h))
+ return BadAlloc;
+
+ /* update cliplist */
+ if (!REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes)) {
+ REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
+ i830_fill_colorkey(pScreen, pPriv->colorKey, clipBoxes);
+ }
+ } else {
+ if (crtc && pPriv->SyncToVblank != 0) {
+ i830_wait_for_scanline(pScrn, pPixmap, crtc, clipBoxes);
+ }
+
+ if (IS_I965G(pI830)) {
+ if (xvmc_passthrough(id, pPriv->rotation)) {
+ /* XXX: KMS */
+ pPriv->YBufOffset = (uintptr_t) buf;
+ pPriv->UBufOffset =
+ pPriv->YBufOffset + height * width;
+ pPriv->VBufOffset =
+ pPriv->UBufOffset + height * width / 4;
+ }
+ I965DisplayVideoTextured(pScrn, pPriv, id, clipBoxes,
+ width, height, dstPitch, x1,
+ y1, x2, y2, src_w, src_h,
+ drw_w, drw_h, pPixmap);
+ } else {
+ I915DisplayVideoTextured(pScrn, pPriv, id, clipBoxes,
+ width, height, dstPitch,
+ dstPitch2, x1, y1, x2, y2,
+ src_w, src_h, drw_w, drw_h,
+ pPixmap);
+ }
+
+ DamageDamageRegion(pDraw, clipBoxes);
+ }
+
+ pPriv->videoStatus = CLIENT_VIDEO_ON;
+
+ return Success;
}
static int
@@ -1695,120 +1713,121 @@ I830QueryImageAttributes(ScrnInfoPtr pScrn,
unsigned short *w, unsigned short *h,
int *pitches, int *offsets)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int size, tmp;
+ I830Ptr pI830 = I830PTR(pScrn);
+ int size, tmp;
#if 0
- ErrorF("I830QueryImageAttributes: w is %d, h is %d\n", *w, *h);
+ ErrorF("I830QueryImageAttributes: w is %d, h is %d\n", *w, *h);
#endif
- if (IS_845G(pI830) || IS_I830(pI830)) {
- if (*w > IMAGE_MAX_WIDTH_LEGACY)
- *w = IMAGE_MAX_WIDTH_LEGACY;
- if (*h > IMAGE_MAX_HEIGHT_LEGACY)
- *h = IMAGE_MAX_HEIGHT_LEGACY;
- } else {
- if (*w > IMAGE_MAX_WIDTH)
- *w = IMAGE_MAX_WIDTH;
- if (*h > IMAGE_MAX_HEIGHT)
- *h = IMAGE_MAX_HEIGHT;
- }
-
- *w = (*w + 1) & ~1;
- if (offsets)
- offsets[0] = 0;
-
- switch (id) {
- /* IA44 is for XvMC only */
- case FOURCC_IA44:
- case FOURCC_AI44:
- if (pitches)
- pitches[0] = *w;
- size = *w * *h;
- break;
- case FOURCC_YV12:
- case FOURCC_I420:
- *h = (*h + 1) & ~1;
- size = (*w + 3) & ~3;
- if (pitches)
- pitches[0] = size;
- size *= *h;
- if (offsets)
- offsets[1] = size;
- tmp = ((*w >> 1) + 3) & ~3;
- if (pitches)
- pitches[1] = pitches[2] = tmp;
- tmp *= (*h >> 1);
- size += tmp;
+ if (IS_845G(pI830) || IS_I830(pI830)) {
+ if (*w > IMAGE_MAX_WIDTH_LEGACY)
+ *w = IMAGE_MAX_WIDTH_LEGACY;
+ if (*h > IMAGE_MAX_HEIGHT_LEGACY)
+ *h = IMAGE_MAX_HEIGHT_LEGACY;
+ } else {
+ if (*w > IMAGE_MAX_WIDTH)
+ *w = IMAGE_MAX_WIDTH;
+ if (*h > IMAGE_MAX_HEIGHT)
+ *h = IMAGE_MAX_HEIGHT;
+ }
+
+ *w = (*w + 1) & ~1;
if (offsets)
- offsets[2] = size;
- size += tmp;
+ offsets[0] = 0;
+
+ switch (id) {
+ /* IA44 is for XvMC only */
+ case FOURCC_IA44:
+ case FOURCC_AI44:
+ if (pitches)
+ pitches[0] = *w;
+ size = *w * *h;
+ break;
+ case FOURCC_YV12:
+ case FOURCC_I420:
+ *h = (*h + 1) & ~1;
+ size = (*w + 3) & ~3;
+ if (pitches)
+ pitches[0] = size;
+ size *= *h;
+ if (offsets)
+ offsets[1] = size;
+ tmp = ((*w >> 1) + 3) & ~3;
+ if (pitches)
+ pitches[1] = pitches[2] = tmp;
+ tmp *= (*h >> 1);
+ size += tmp;
+ if (offsets)
+ offsets[2] = size;
+ size += tmp;
#if 0
- if (pitches)
- ErrorF("pitch 0 is %d, pitch 1 is %d, pitch 2 is %d\n", pitches[0],
- pitches[1], pitches[2]);
- if (offsets)
- ErrorF("offset 1 is %d, offset 2 is %d\n", offsets[1], offsets[2]);
- if (offsets)
- ErrorF("size is %d\n", size);
+ if (pitches)
+ ErrorF("pitch 0 is %d, pitch 1 is %d, pitch 2 is %d\n",
+ pitches[0], pitches[1], pitches[2]);
+ if (offsets)
+ ErrorF("offset 1 is %d, offset 2 is %d\n", offsets[1],
+ offsets[2]);
+ if (offsets)
+ ErrorF("size is %d\n", size);
#endif
- break;
+ break;
#ifdef INTEL_XVMC
- case FOURCC_XVMC:
- *h = (*h + 1) & ~1;
- size = sizeof(struct intel_xvmc_command);
- if (pitches)
- pitches[0] = size;
- break;
+ case FOURCC_XVMC:
+ *h = (*h + 1) & ~1;
+ size = sizeof(struct intel_xvmc_command);
+ if (pitches)
+ pitches[0] = size;
+ break;
#endif
- case FOURCC_UYVY:
- case FOURCC_YUY2:
- default:
- size = *w << 1;
- if (pitches)
- pitches[0] = size;
- size *= *h;
- break;
- }
-
- return size;
+ case FOURCC_UYVY:
+ case FOURCC_YUY2:
+ default:
+ size = *w << 1;
+ if (pitches)
+ pitches[0] = size;
+ size *= *h;
+ break;
+ }
+
+ return size;
}
void
I830VideoBlockHandler(int i, pointer blockData, pointer pTimeout,
pointer pReadmask)
{
- ScrnInfoPtr pScrn = xf86Screens[i];
- I830Ptr pI830 = I830PTR(pScrn);
- I830PortPrivPtr pPriv;
+ ScrnInfoPtr pScrn = xf86Screens[i];
+ I830Ptr pI830 = I830PTR(pScrn);
+ I830PortPrivPtr pPriv;
- /* no overlay */
- if (pI830->adaptor == NULL)
- return;
+ /* no overlay */
+ if (pI830->adaptor == NULL)
+ return;
- pPriv = GET_PORT_PRIVATE(pScrn);
+ pPriv = GET_PORT_PRIVATE(pScrn);
- if (pPriv->videoStatus & TIMER_MASK) {
+ if (pPriv->videoStatus & TIMER_MASK) {
#if 1
- Time now = currentTime.milliseconds;
+ Time now = currentTime.milliseconds;
#else
- UpdateCurrentTime();
+ UpdateCurrentTime();
#endif
- if (pPriv->videoStatus & OFF_TIMER) {
- if (pPriv->offTime < now) {
- /* Turn off the overlay */
- OVERLAY_DEBUG("BLOCKHANDLER\n");
-
- drmmode_overlay_off(pScrn);
-
- pPriv->videoStatus = FREE_TIMER;
- pPriv->freeTime = now + FREE_DELAY;
- }
- } else { /* FREE_TIMER */
- if (pPriv->freeTime < now) {
- i830_free_video_buffers(pPriv);
- pPriv->videoStatus = 0;
- }
+ if (pPriv->videoStatus & OFF_TIMER) {
+ if (pPriv->offTime < now) {
+ /* Turn off the overlay */
+ OVERLAY_DEBUG("BLOCKHANDLER\n");
+
+ drmmode_overlay_off(pScrn);
+
+ pPriv->videoStatus = FREE_TIMER;
+ pPriv->freeTime = now + FREE_DELAY;
+ }
+ } else { /* FREE_TIMER */
+ if (pPriv->freeTime < now) {
+ i830_free_video_buffers(pPriv);
+ pPriv->videoStatus = 0;
+ }
+ }
}
- }
}
diff --git a/src/i830_video.h b/src/i830_video.h
index cdccd162..ac478018 100644
--- a/src/i830_video.h
+++ b/src/i830_video.h
@@ -28,41 +28,41 @@ THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "xf86_OSproc.h"
typedef struct {
- uint32_t YBufOffset;
- uint32_t UBufOffset;
- uint32_t VBufOffset;
-
- int brightness;
- int contrast;
- int saturation;
- xf86CrtcPtr current_crtc;
- xf86CrtcPtr desired_crtc;
-
- RegionRec clip;
- uint32_t colorKey;
-
- uint32_t gamma0;
- uint32_t gamma1;
- uint32_t gamma2;
- uint32_t gamma3;
- uint32_t gamma4;
- uint32_t gamma5;
-
- uint32_t videoStatus;
- Time offTime;
- Time freeTime;
+ uint32_t YBufOffset;
+ uint32_t UBufOffset;
+ uint32_t VBufOffset;
+
+ int brightness;
+ int contrast;
+ int saturation;
+ xf86CrtcPtr current_crtc;
+ xf86CrtcPtr desired_crtc;
+
+ RegionRec clip;
+ uint32_t colorKey;
+
+ uint32_t gamma0;
+ uint32_t gamma1;
+ uint32_t gamma2;
+ uint32_t gamma3;
+ uint32_t gamma4;
+ uint32_t gamma5;
+
+ uint32_t videoStatus;
+ Time offTime;
+ Time freeTime;
/** YUV data buffers */
- drm_intel_bo *buf; /* current buffer to draw into */
- drm_intel_bo *oldBuf; /* old buffer, may be in use by the overlay hw */
- Bool oldBuf_pinned; /* only actually pinned when in use by the overlay hw */
+ drm_intel_bo *buf; /* current buffer to draw into */
+ drm_intel_bo *oldBuf; /* old buffer, may be in use by the overlay hw */
+ Bool oldBuf_pinned; /* only actually pinned when in use by the overlay hw */
- Bool overlayOK;
- int oneLineMode;
- int scaleRatio;
- Bool textured;
- Rotation rotation; /* should remove I830->rotation later*/
+ Bool overlayOK;
+ int oneLineMode;
+ int scaleRatio;
+ Bool textured;
+ Rotation rotation; /* should remove I830->rotation later */
- int SyncToVblank; /* -1: auto, 0: off, 1: on */
+ int SyncToVblank; /* -1: auto, 0: off, 1: on */
} I830PortPrivRec, *I830PortPrivPtr;
#define GET_PORT_PRIVATE(pScrn) \
@@ -73,16 +73,14 @@ void I915DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
short height, int video_pitch, int video_pitch2,
int x1, int y1, int x2, int y2,
short src_w, short src_h,
- short drw_w, short drw_h,
- PixmapPtr pPixmap);
+ short drw_w, short drw_h, PixmapPtr pPixmap);
void I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
int id, RegionPtr dstRegion, short width,
short height, int video_pitch,
int x1, int y1, int x2, int y2,
short src_w, short src_h,
- short drw_w, short drw_h,
- PixmapPtr pPixmap);
+ short drw_w, short drw_h, PixmapPtr pPixmap);
void I830VideoBlockHandler(int i, pointer blockData, pointer pTimeout,
pointer pReadmask);
diff --git a/src/i915_3d.c b/src/i915_3d.c
index b2dbeed4..deee6968 100644
--- a/src/i915_3d.c
+++ b/src/i915_3d.c
@@ -34,78 +34,76 @@
#include "i915_reg.h"
-void I915EmitInvarientState( ScrnInfoPtr pScrn )
+void I915EmitInvarientState(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
-
- BEGIN_BATCH(24);
-
- OUT_BATCH(_3DSTATE_AA_CMD |
- AA_LINE_ECAAR_WIDTH_ENABLE |
- AA_LINE_ECAAR_WIDTH_1_0 |
- AA_LINE_REGION_WIDTH_ENABLE |
- AA_LINE_REGION_WIDTH_1_0);
-
- /* Disable independent alpha blend */
- OUT_BATCH(_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
- IAB_MODIFY_ENABLE |
- IAB_MODIFY_FUNC | (BLENDFUNC_ADD << IAB_FUNC_SHIFT) |
- IAB_MODIFY_SRC_FACTOR | (BLENDFACT_ONE << IAB_SRC_FACTOR_SHIFT) |
- IAB_MODIFY_DST_FACTOR | (BLENDFACT_ZERO << IAB_DST_FACTOR_SHIFT));
-
- OUT_BATCH(_3DSTATE_DFLT_DIFFUSE_CMD);
- OUT_BATCH(0);
-
- OUT_BATCH(_3DSTATE_DFLT_SPEC_CMD);
- OUT_BATCH(0);
-
- OUT_BATCH(_3DSTATE_DFLT_Z_CMD);
- OUT_BATCH(0);
-
- /* Don't support texture crossbar yet */
- OUT_BATCH(_3DSTATE_COORD_SET_BINDINGS |
- CSB_TCB(0, 0) |
- CSB_TCB(1, 1) |
- CSB_TCB(2, 2) |
- CSB_TCB(3, 3) |
- CSB_TCB(4, 4) |
- CSB_TCB(5, 5) |
- CSB_TCB(6, 6) |
- CSB_TCB(7, 7));
-
- OUT_BATCH(_3DSTATE_RASTER_RULES_CMD |
- ENABLE_POINT_RASTER_RULE |
- OGL_POINT_RASTER_RULE |
- ENABLE_LINE_STRIP_PROVOKE_VRTX |
- ENABLE_TRI_FAN_PROVOKE_VRTX |
- LINE_STRIP_PROVOKE_VRTX(1) |
- TRI_FAN_PROVOKE_VRTX(2) |
- ENABLE_TEXKILL_3D_4D |
- TEXKILL_4D);
-
- OUT_BATCH(_3DSTATE_MODES_4_CMD |
- ENABLE_LOGIC_OP_FUNC | LOGIC_OP_FUNC(LOGICOP_COPY) |
- ENABLE_STENCIL_WRITE_MASK | STENCIL_WRITE_MASK(0xff) |
- ENABLE_STENCIL_TEST_MASK | STENCIL_TEST_MASK(0xff));
-
- OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(3) | 0);
- OUT_BATCH(0x00000000); /* Disable texture coordinate wrap-shortest */
-
- OUT_BATCH(_3DSTATE_SCISSOR_ENABLE_CMD | DISABLE_SCISSOR_RECT);
- OUT_BATCH(_3DSTATE_SCISSOR_RECT_0_CMD);
- OUT_BATCH(0);
- OUT_BATCH(0);
-
- OUT_BATCH(_3DSTATE_DEPTH_SUBRECT_DISABLE);
-
- OUT_BATCH(_3DSTATE_LOAD_INDIRECT | 0); /* disable indirect state */
- OUT_BATCH(0);
-
- OUT_BATCH(_3DSTATE_STIPPLE);
- OUT_BATCH(0x00000000);
-
- OUT_BATCH(_3DSTATE_BACKFACE_STENCIL_OPS | BFO_ENABLE_STENCIL_TWO_SIDE | 0 );
- OUT_BATCH(MI_NOOP);
-
- ADVANCE_BATCH();
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ BEGIN_BATCH(24);
+
+ OUT_BATCH(_3DSTATE_AA_CMD |
+ AA_LINE_ECAAR_WIDTH_ENABLE |
+ AA_LINE_ECAAR_WIDTH_1_0 |
+ AA_LINE_REGION_WIDTH_ENABLE | AA_LINE_REGION_WIDTH_1_0);
+
+ /* Disable independent alpha blend */
+ OUT_BATCH(_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
+ IAB_MODIFY_ENABLE |
+ IAB_MODIFY_FUNC | (BLENDFUNC_ADD << IAB_FUNC_SHIFT) |
+ IAB_MODIFY_SRC_FACTOR | (BLENDFACT_ONE <<
+ IAB_SRC_FACTOR_SHIFT) |
+ IAB_MODIFY_DST_FACTOR | (BLENDFACT_ZERO <<
+ IAB_DST_FACTOR_SHIFT));
+
+ OUT_BATCH(_3DSTATE_DFLT_DIFFUSE_CMD);
+ OUT_BATCH(0);
+
+ OUT_BATCH(_3DSTATE_DFLT_SPEC_CMD);
+ OUT_BATCH(0);
+
+ OUT_BATCH(_3DSTATE_DFLT_Z_CMD);
+ OUT_BATCH(0);
+
+ /* Don't support texture crossbar yet */
+ OUT_BATCH(_3DSTATE_COORD_SET_BINDINGS |
+ CSB_TCB(0, 0) |
+ CSB_TCB(1, 1) |
+ CSB_TCB(2, 2) |
+ CSB_TCB(3, 3) |
+ CSB_TCB(4, 4) |
+ CSB_TCB(5, 5) | CSB_TCB(6, 6) | CSB_TCB(7, 7));
+
+ OUT_BATCH(_3DSTATE_RASTER_RULES_CMD |
+ ENABLE_POINT_RASTER_RULE |
+ OGL_POINT_RASTER_RULE |
+ ENABLE_LINE_STRIP_PROVOKE_VRTX |
+ ENABLE_TRI_FAN_PROVOKE_VRTX |
+ LINE_STRIP_PROVOKE_VRTX(1) |
+ TRI_FAN_PROVOKE_VRTX(2) | ENABLE_TEXKILL_3D_4D | TEXKILL_4D);
+
+ OUT_BATCH(_3DSTATE_MODES_4_CMD |
+ ENABLE_LOGIC_OP_FUNC | LOGIC_OP_FUNC(LOGICOP_COPY) |
+ ENABLE_STENCIL_WRITE_MASK | STENCIL_WRITE_MASK(0xff) |
+ ENABLE_STENCIL_TEST_MASK | STENCIL_TEST_MASK(0xff));
+
+ OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(3) | 0);
+ OUT_BATCH(0x00000000); /* Disable texture coordinate wrap-shortest */
+
+ OUT_BATCH(_3DSTATE_SCISSOR_ENABLE_CMD | DISABLE_SCISSOR_RECT);
+ OUT_BATCH(_3DSTATE_SCISSOR_RECT_0_CMD);
+ OUT_BATCH(0);
+ OUT_BATCH(0);
+
+ OUT_BATCH(_3DSTATE_DEPTH_SUBRECT_DISABLE);
+
+ OUT_BATCH(_3DSTATE_LOAD_INDIRECT | 0); /* disable indirect state */
+ OUT_BATCH(0);
+
+ OUT_BATCH(_3DSTATE_STIPPLE);
+ OUT_BATCH(0x00000000);
+
+ OUT_BATCH(_3DSTATE_BACKFACE_STENCIL_OPS | BFO_ENABLE_STENCIL_TWO_SIDE |
+ 0);
+ OUT_BATCH(MI_NOOP);
+
+ ADVANCE_BATCH();
}
diff --git a/src/i915_3d.h b/src/i915_3d.h
index d3330e5b..117712e5 100644
--- a/src/i915_3d.h
+++ b/src/i915_3d.h
@@ -88,7 +88,7 @@
#define REG_NR(reg) ((reg) & 0xff)
struct i915_fs_op {
- uint32_t ui[3];
+ uint32_t ui[3];
};
#define X_CHANNEL_VAL 1
@@ -106,15 +106,15 @@ struct i915_fs_op {
*/
struct i915_fs_operand {
/**< REG_TYPE_* register type */
- int reg;
+ int reg;
/**< *_CHANNEL_VAL swizzle value, with optional negation */
- int x;
+ int x;
/**< *_CHANNEL_VAL swizzle value, with optional negation */
- int y;
+ int y;
/**< *_CHANNEL_VAL swizzle value, with optional negation */
- int z;
+ int z;
/**< *_CHANNEL_VAL swizzle value, with optional negation */
- int w;
+ int w;
};
/**
@@ -144,24 +144,23 @@ struct i915_fs_operand {
static inline struct i915_fs_operand
_i915_fs_operand(int reg, int x, int y, int z, int w)
{
- struct i915_fs_operand operand;
+ struct i915_fs_operand operand;
- operand.reg = reg;
- operand.x = x;
- operand.y = y;
- operand.z = z;
- operand.w = w;
+ operand.reg = reg;
+ operand.x = x;
+ operand.y = y;
+ operand.z = z;
+ operand.w = w;
- return operand;
+ return operand;
}
/**
* Returns an operand containing (0.0, 0.0, 0.0, 0.0).
*/
-static inline struct i915_fs_operand
-i915_fs_operand_zero(void)
+static inline struct i915_fs_operand i915_fs_operand_zero(void)
{
- return i915_fs_operand(FS_R0, ZERO, ZERO, ZERO, ZERO);
+ return i915_fs_operand(FS_R0, ZERO, ZERO, ZERO, ZERO);
}
/**
@@ -172,33 +171,31 @@ i915_fs_operand_zero(void)
/**
* Returns an operand containing (1.0, 1.0, 1.0, 1.0).
*/
-static inline struct i915_fs_operand
-i915_fs_operand_one(void)
+static inline struct i915_fs_operand i915_fs_operand_one(void)
{
- return i915_fs_operand(FS_R0, ONE, ONE, ONE, ONE);
+ return i915_fs_operand(FS_R0, ONE, ONE, ONE, ONE);
}
-static inline int
-i915_get_hardware_channel_val(int channel_val)
+static inline int i915_get_hardware_channel_val(int channel_val)
{
- if (channel_val < 0)
- channel_val = -channel_val;
-
- switch (channel_val) {
- case X_CHANNEL_VAL:
- return SRC_X;
- case Y_CHANNEL_VAL:
- return SRC_Y;
- case Z_CHANNEL_VAL:
- return SRC_Z;
- case W_CHANNEL_VAL:
- return SRC_W;
- case ZERO_CHANNEL_VAL:
- return SRC_ZERO;
- case ONE_CHANNEL_VAL:
- return SRC_ONE;
- }
- FatalError("Bad channel value %d\n", channel_val);
+ if (channel_val < 0)
+ channel_val = -channel_val;
+
+ switch (channel_val) {
+ case X_CHANNEL_VAL:
+ return SRC_X;
+ case Y_CHANNEL_VAL:
+ return SRC_Y;
+ case Z_CHANNEL_VAL:
+ return SRC_Z;
+ case W_CHANNEL_VAL:
+ return SRC_W;
+ case ZERO_CHANNEL_VAL:
+ return SRC_ZERO;
+ case ONE_CHANNEL_VAL:
+ return SRC_ONE;
+ }
+ FatalError("Bad channel value %d\n", channel_val);
}
/**
@@ -213,19 +210,18 @@ do { \
* Constructs a fragment shader command to declare a sampler or texture
* register.
*/
-static inline struct i915_fs_op
-_i915_fs_dcl(int reg)
+static inline struct i915_fs_op _i915_fs_dcl(int reg)
{
- struct i915_fs_op op;
+ struct i915_fs_op op;
- op.ui[0] = D0_DCL | (REG_TYPE(reg) << D0_TYPE_SHIFT) |
- (REG_NR(reg) << D0_NR_SHIFT);
- op.ui[1] = 0;
- op.ui[2] = 0;
- if (REG_TYPE(reg) != REG_TYPE_S)
- op.ui[0] |= D0_CHANNEL_ALL;
+ op.ui[0] = D0_DCL | (REG_TYPE(reg) << D0_TYPE_SHIFT) |
+ (REG_NR(reg) << D0_NR_SHIFT);
+ op.ui[1] = 0;
+ op.ui[2] = 0;
+ if (REG_TYPE(reg) != REG_TYPE_S)
+ op.ui[0] |= D0_CHANNEL_ALL;
- return op;
+ return op;
}
/**
@@ -244,23 +240,23 @@ do { \
static inline struct i915_fs_op
_i915_fs_texld(int load_op, int dest_reg, int sampler_reg, int address_reg)
{
- struct i915_fs_op op;
+ struct i915_fs_op op;
- op.ui[0] = 0;
- op.ui[1] = 0;
- op.ui[2] = 0;
+ op.ui[0] = 0;
+ op.ui[1] = 0;
+ op.ui[2] = 0;
- if (REG_TYPE(sampler_reg) != REG_TYPE_S)
- FatalError("Bad sampler reg type\n");
+ if (REG_TYPE(sampler_reg) != REG_TYPE_S)
+ FatalError("Bad sampler reg type\n");
- op.ui[0] |= load_op;
- op.ui[0] |= REG_TYPE(dest_reg) << T0_DEST_TYPE_SHIFT;
- op.ui[0] |= REG_NR(dest_reg) << T0_DEST_NR_SHIFT;
- op.ui[0] |= REG_NR(sampler_reg) << T0_SAMPLER_NR_SHIFT;
- op.ui[1] |= REG_TYPE(address_reg) << T1_ADDRESS_REG_TYPE_SHIFT;
- op.ui[1] |= REG_NR(address_reg) << T1_ADDRESS_REG_NR_SHIFT;
+ op.ui[0] |= load_op;
+ op.ui[0] |= REG_TYPE(dest_reg) << T0_DEST_TYPE_SHIFT;
+ op.ui[0] |= REG_NR(dest_reg) << T0_DEST_NR_SHIFT;
+ op.ui[0] |= REG_NR(sampler_reg) << T0_SAMPLER_NR_SHIFT;
+ op.ui[1] |= REG_TYPE(address_reg) << T1_ADDRESS_REG_TYPE_SHIFT;
+ op.ui[1] |= REG_NR(address_reg) << T1_ADDRESS_REG_NR_SHIFT;
- return op;
+ return op;
}
#define i915_fs_arith(op, dest_reg, operand0, operand1, operand2) \
@@ -269,94 +265,93 @@ _i915_fs_texld(int load_op, int dest_reg, int sampler_reg, int address_reg)
static inline struct i915_fs_op
_i915_fs_arith(int cmd, int dest_reg,
struct i915_fs_operand operand0,
- struct i915_fs_operand operand1,
- struct i915_fs_operand operand2)
+ struct i915_fs_operand operand1, struct i915_fs_operand operand2)
{
- struct i915_fs_op op;
-
- op.ui[0] = 0;
- op.ui[1] = 0;
- op.ui[2] = 0;
-
- /* Set up destination register and write mask */
- op.ui[0] |= cmd;
- op.ui[0] |= REG_TYPE(dest_reg) << A0_DEST_TYPE_SHIFT;
- op.ui[0] |= REG_NR(dest_reg) << A0_DEST_NR_SHIFT;
- op.ui[0] |= A0_DEST_CHANNEL_ALL;
-
- /* Set up operand 0 */
- op.ui[0] |= REG_TYPE(operand0.reg) << A0_SRC0_TYPE_SHIFT;
- op.ui[0] |= REG_NR(operand0.reg) << A0_SRC0_NR_SHIFT;
-
- op.ui[1] |= i915_get_hardware_channel_val(operand0.x) <<
- A1_SRC0_CHANNEL_X_SHIFT;
- if (operand0.x < 0)
- op.ui[1] |= A1_SRC0_CHANNEL_X_NEGATE;
-
- op.ui[1] |= i915_get_hardware_channel_val(operand0.y) <<
- A1_SRC0_CHANNEL_Y_SHIFT;
- if (operand0.y < 0)
- op.ui[1] |= A1_SRC0_CHANNEL_Y_NEGATE;
-
- op.ui[1] |= i915_get_hardware_channel_val(operand0.z) <<
- A1_SRC0_CHANNEL_Z_SHIFT;
- if (operand0.z < 0)
- op.ui[1] |= A1_SRC0_CHANNEL_Z_NEGATE;
-
- op.ui[1] |= i915_get_hardware_channel_val(operand0.w) <<
- A1_SRC0_CHANNEL_W_SHIFT;
- if (operand0.w < 0)
- op.ui[1] |= A1_SRC0_CHANNEL_W_NEGATE;
-
- /* Set up operand 1 */
- op.ui[1] |= REG_TYPE(operand1.reg) << A1_SRC1_TYPE_SHIFT;
- op.ui[1] |= REG_NR(operand1.reg) << A1_SRC1_NR_SHIFT;
-
- op.ui[1] |= i915_get_hardware_channel_val(operand1.x) <<
- A1_SRC1_CHANNEL_X_SHIFT;
- if (operand1.x < 0)
- op.ui[1] |= A1_SRC1_CHANNEL_X_NEGATE;
-
- op.ui[1] |= i915_get_hardware_channel_val(operand1.y) <<
- A1_SRC1_CHANNEL_Y_SHIFT;
- if (operand1.y < 0)
- op.ui[1] |= A1_SRC1_CHANNEL_Y_NEGATE;
-
- op.ui[2] |= i915_get_hardware_channel_val(operand1.z) <<
- A2_SRC1_CHANNEL_Z_SHIFT;
- if (operand1.z < 0)
- op.ui[2] |= A2_SRC1_CHANNEL_Z_NEGATE;
-
- op.ui[2] |= i915_get_hardware_channel_val(operand1.w) <<
- A2_SRC1_CHANNEL_W_SHIFT;
- if (operand1.w < 0)
- op.ui[2] |= A2_SRC1_CHANNEL_W_NEGATE;
-
- /* Set up operand 2 */
- op.ui[2] |= REG_TYPE(operand2.reg) << A2_SRC2_TYPE_SHIFT;
- op.ui[2] |= REG_NR(operand2.reg) << A2_SRC2_NR_SHIFT;
-
- op.ui[2] |= i915_get_hardware_channel_val(operand2.x) <<
- A2_SRC2_CHANNEL_X_SHIFT;
- if (operand2.x < 0)
- op.ui[2] |= A2_SRC2_CHANNEL_X_NEGATE;
-
- op.ui[2] |= i915_get_hardware_channel_val(operand2.y) <<
- A2_SRC2_CHANNEL_Y_SHIFT;
- if (operand2.y < 0)
- op.ui[2] |= A2_SRC2_CHANNEL_Y_NEGATE;
-
- op.ui[2] |= i915_get_hardware_channel_val(operand2.z) <<
- A2_SRC2_CHANNEL_Z_SHIFT;
- if (operand2.z < 0)
- op.ui[2] |= A2_SRC2_CHANNEL_Z_NEGATE;
-
- op.ui[2] |= i915_get_hardware_channel_val(operand2.w) <<
- A2_SRC2_CHANNEL_W_SHIFT;
- if (operand2.w < 0)
- op.ui[2] |= A2_SRC2_CHANNEL_W_NEGATE;
-
- return op;
+ struct i915_fs_op op;
+
+ op.ui[0] = 0;
+ op.ui[1] = 0;
+ op.ui[2] = 0;
+
+ /* Set up destination register and write mask */
+ op.ui[0] |= cmd;
+ op.ui[0] |= REG_TYPE(dest_reg) << A0_DEST_TYPE_SHIFT;
+ op.ui[0] |= REG_NR(dest_reg) << A0_DEST_NR_SHIFT;
+ op.ui[0] |= A0_DEST_CHANNEL_ALL;
+
+ /* Set up operand 0 */
+ op.ui[0] |= REG_TYPE(operand0.reg) << A0_SRC0_TYPE_SHIFT;
+ op.ui[0] |= REG_NR(operand0.reg) << A0_SRC0_NR_SHIFT;
+
+ op.ui[1] |= i915_get_hardware_channel_val(operand0.x) <<
+ A1_SRC0_CHANNEL_X_SHIFT;
+ if (operand0.x < 0)
+ op.ui[1] |= A1_SRC0_CHANNEL_X_NEGATE;
+
+ op.ui[1] |= i915_get_hardware_channel_val(operand0.y) <<
+ A1_SRC0_CHANNEL_Y_SHIFT;
+ if (operand0.y < 0)
+ op.ui[1] |= A1_SRC0_CHANNEL_Y_NEGATE;
+
+ op.ui[1] |= i915_get_hardware_channel_val(operand0.z) <<
+ A1_SRC0_CHANNEL_Z_SHIFT;
+ if (operand0.z < 0)
+ op.ui[1] |= A1_SRC0_CHANNEL_Z_NEGATE;
+
+ op.ui[1] |= i915_get_hardware_channel_val(operand0.w) <<
+ A1_SRC0_CHANNEL_W_SHIFT;
+ if (operand0.w < 0)
+ op.ui[1] |= A1_SRC0_CHANNEL_W_NEGATE;
+
+ /* Set up operand 1 */
+ op.ui[1] |= REG_TYPE(operand1.reg) << A1_SRC1_TYPE_SHIFT;
+ op.ui[1] |= REG_NR(operand1.reg) << A1_SRC1_NR_SHIFT;
+
+ op.ui[1] |= i915_get_hardware_channel_val(operand1.x) <<
+ A1_SRC1_CHANNEL_X_SHIFT;
+ if (operand1.x < 0)
+ op.ui[1] |= A1_SRC1_CHANNEL_X_NEGATE;
+
+ op.ui[1] |= i915_get_hardware_channel_val(operand1.y) <<
+ A1_SRC1_CHANNEL_Y_SHIFT;
+ if (operand1.y < 0)
+ op.ui[1] |= A1_SRC1_CHANNEL_Y_NEGATE;
+
+ op.ui[2] |= i915_get_hardware_channel_val(operand1.z) <<
+ A2_SRC1_CHANNEL_Z_SHIFT;
+ if (operand1.z < 0)
+ op.ui[2] |= A2_SRC1_CHANNEL_Z_NEGATE;
+
+ op.ui[2] |= i915_get_hardware_channel_val(operand1.w) <<
+ A2_SRC1_CHANNEL_W_SHIFT;
+ if (operand1.w < 0)
+ op.ui[2] |= A2_SRC1_CHANNEL_W_NEGATE;
+
+ /* Set up operand 2 */
+ op.ui[2] |= REG_TYPE(operand2.reg) << A2_SRC2_TYPE_SHIFT;
+ op.ui[2] |= REG_NR(operand2.reg) << A2_SRC2_NR_SHIFT;
+
+ op.ui[2] |= i915_get_hardware_channel_val(operand2.x) <<
+ A2_SRC2_CHANNEL_X_SHIFT;
+ if (operand2.x < 0)
+ op.ui[2] |= A2_SRC2_CHANNEL_X_NEGATE;
+
+ op.ui[2] |= i915_get_hardware_channel_val(operand2.y) <<
+ A2_SRC2_CHANNEL_Y_SHIFT;
+ if (operand2.y < 0)
+ op.ui[2] |= A2_SRC2_CHANNEL_Y_NEGATE;
+
+ op.ui[2] |= i915_get_hardware_channel_val(operand2.z) <<
+ A2_SRC2_CHANNEL_Z_SHIFT;
+ if (operand2.z < 0)
+ op.ui[2] |= A2_SRC2_CHANNEL_Z_NEGATE;
+
+ op.ui[2] |= i915_get_hardware_channel_val(operand2.w) <<
+ A2_SRC2_CHANNEL_W_SHIFT;
+ if (operand2.w < 0)
+ op.ui[2] |= A2_SRC2_CHANNEL_W_NEGATE;
+
+ return op;
}
/** Move operand0 to dest_reg */
diff --git a/src/i915_hwmc.c b/src/i915_hwmc.c
index 152b42b3..02e5fe88 100644
--- a/src/i915_hwmc.c
+++ b/src/i915_hwmc.c
@@ -61,37 +61,34 @@
#define I915_XVMC_MAX_CONTEXTS 4
#define I915_XVMC_MAX_SURFACES 20
-typedef struct _I915XvMCSurfacePriv
-{
- i830_memory *surface;
- unsigned long offsets[I915_XVMC_MAX_BUFFERS];
- drm_handle_t surface_handle;
+typedef struct _I915XvMCSurfacePriv {
+ i830_memory *surface;
+ unsigned long offsets[I915_XVMC_MAX_BUFFERS];
+ drm_handle_t surface_handle;
} I915XvMCSurfacePriv;
-typedef struct _I915XvMCContextPriv
-{
- i830_memory *mcStaticIndirectState;
- drm_handle_t sis_handle;
- i830_memory *mcSamplerState;
- drm_handle_t ssb_handle;
- i830_memory *mcMapState;
- drm_handle_t msb_handle;
- i830_memory *mcPixelShaderProgram;
- drm_handle_t psp_handle;
- i830_memory *mcPixelShaderConstants;
- drm_handle_t psc_handle;
- i830_memory *mcCorrdata;
- drm_handle_t corrdata_handle;
+typedef struct _I915XvMCContextPriv {
+ i830_memory *mcStaticIndirectState;
+ drm_handle_t sis_handle;
+ i830_memory *mcSamplerState;
+ drm_handle_t ssb_handle;
+ i830_memory *mcMapState;
+ drm_handle_t msb_handle;
+ i830_memory *mcPixelShaderProgram;
+ drm_handle_t psp_handle;
+ i830_memory *mcPixelShaderConstants;
+ drm_handle_t psc_handle;
+ i830_memory *mcCorrdata;
+ drm_handle_t corrdata_handle;
} I915XvMCContextPriv;
-typedef struct _I915XvMC
-{
- XID contexts[I915_XVMC_MAX_CONTEXTS];
- XID surfaces[I915_XVMC_MAX_SURFACES];
- I915XvMCSurfacePriv *sfprivs[I915_XVMC_MAX_SURFACES];
- I915XvMCContextPriv *ctxprivs[I915_XVMC_MAX_CONTEXTS];
- int ncontexts,nsurfaces;
- PutImageFuncPtr savePutImage;
+typedef struct _I915XvMC {
+ XID contexts[I915_XVMC_MAX_CONTEXTS];
+ XID surfaces[I915_XVMC_MAX_SURFACES];
+ I915XvMCSurfacePriv *sfprivs[I915_XVMC_MAX_SURFACES];
+ I915XvMCContextPriv *ctxprivs[I915_XVMC_MAX_CONTEXTS];
+ int ncontexts, nsurfaces;
+ PutImageFuncPtr savePutImage;
} I915XvMC, *I915XvMCPtr;
/*
@@ -108,42 +105,39 @@ static XF86MCImageIDList yv12_subpicture_list =
};
*/
-static XF86MCSurfaceInfoRec i915_YV12_mpg2_surface =
-{
- SURFACE_TYPE_MPEG2_MPML,
- XVMC_CHROMA_FORMAT_420,
- 0,
- 720,
- 576,
- 720,
- 576,
- XVMC_MPEG_2,
- /* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING,*/
- 0,
- /* &yv12_subpicture_list*/
- NULL,
+static XF86MCSurfaceInfoRec i915_YV12_mpg2_surface = {
+ SURFACE_TYPE_MPEG2_MPML,
+ XVMC_CHROMA_FORMAT_420,
+ 0,
+ 720,
+ 576,
+ 720,
+ 576,
+ XVMC_MPEG_2,
+ /* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
+ 0,
+ /* &yv12_subpicture_list */
+ NULL,
};
-static XF86MCSurfaceInfoRec i915_YV12_mpg1_surface =
-{
- SURFACE_TYPE_MPEG1_MPML,
- XVMC_CHROMA_FORMAT_420,
- 0,
- 720,
- 576,
- 720,
- 576,
- XVMC_MPEG_1,
- /* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING,*/
- 0,
- /* &yv12_subpicture_list*/
- NULL,
+static XF86MCSurfaceInfoRec i915_YV12_mpg1_surface = {
+ SURFACE_TYPE_MPEG1_MPML,
+ XVMC_CHROMA_FORMAT_420,
+ 0,
+ 720,
+ 576,
+ 720,
+ 576,
+ XVMC_MPEG_1,
+ /* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
+ 0,
+ /* &yv12_subpicture_list */
+ NULL,
};
-static XF86MCSurfaceInfoPtr ppSI[2] =
-{
- (XF86MCSurfaceInfoPtr)&i915_YV12_mpg2_surface,
- (XF86MCSurfaceInfoPtr)&i915_YV12_mpg1_surface
+static XF86MCSurfaceInfoPtr ppSI[2] = {
+ (XF86MCSurfaceInfoPtr) & i915_YV12_mpg2_surface,
+ (XF86MCSurfaceInfoPtr) & i915_YV12_mpg1_surface
};
#if 0
@@ -151,27 +145,25 @@ static XF86MCSurfaceInfoPtr ppSI[2] =
static XF86ImageRec ia44_subpicture = XVIMAGE_IA44;
static XF86ImageRec ai44_subpicture = XVIMAGE_AI44;
-static XF86ImagePtr i915_subpicture_list[2] =
-{
- (XF86ImagePtr)&ia44_subpicture,
- (XF86ImagePtr)&ai44_subpicture
+static XF86ImagePtr i915_subpicture_list[2] = {
+ (XF86ImagePtr) & ia44_subpicture,
+ (XF86ImagePtr) & ai44_subpicture
};
#endif
/* Check context size not exceed surface type max */
-static void
-i915_check_context_size(XvMCContextPtr ctx)
+static void i915_check_context_size(XvMCContextPtr ctx)
{
- int i;
-
- for (i = 0; i < ARRAY_SIZE(ppSI); i++) {
- if (ctx->surface_type_id == ppSI[i]->surface_type_id) {
- if (ctx->width > ppSI[i]->max_width)
- ctx->width = ppSI[i]->max_width;
- if (ctx->height > ppSI[i]->max_height)
- ctx->height = ppSI[i]->max_height;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(ppSI); i++) {
+ if (ctx->surface_type_id == ppSI[i]->surface_type_id) {
+ if (ctx->width > ppSI[i]->max_width)
+ ctx->width = ppSI[i]->max_width;
+ if (ctx->height > ppSI[i]->max_height)
+ ctx->height = ppSI[i]->max_height;
+ }
}
- }
}
/*
@@ -179,222 +171,231 @@ i915_check_context_size(XvMCContextPtr ctx)
*/
static void initI915XvMC(I915XvMCPtr xvmc)
{
- unsigned int i;
-
- for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) {
- xvmc->contexts[i] = 0;
- xvmc->ctxprivs[i] = NULL;
- }
-
- for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) {
- xvmc->surfaces[i] = 0;
- xvmc->sfprivs[i] = NULL;
- }
- xvmc->ncontexts = 0;
- xvmc->nsurfaces = 0;
+ unsigned int i;
+
+ for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) {
+ xvmc->contexts[i] = 0;
+ xvmc->ctxprivs[i] = NULL;
+ }
+
+ for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) {
+ xvmc->surfaces[i] = 0;
+ xvmc->sfprivs[i] = NULL;
+ }
+ xvmc->ncontexts = 0;
+ xvmc->nsurfaces = 0;
}
static void cleanupI915XvMC(I915XvMCPtr xvmc)
{
- int i;
-
- for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) {
- xvmc->contexts[i] = 0;
- if (xvmc->ctxprivs[i]) {
- xfree(xvmc->ctxprivs[i]);
- xvmc->ctxprivs[i] = NULL;
- }
- }
-
- for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) {
- xvmc->surfaces[i] = 0;
- if (xvmc->sfprivs[i]) {
- xfree(xvmc->sfprivs[i]);
- xvmc->sfprivs[i] = NULL;
- }
- }
+ int i;
+
+ for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) {
+ xvmc->contexts[i] = 0;
+ if (xvmc->ctxprivs[i]) {
+ xfree(xvmc->ctxprivs[i]);
+ xvmc->ctxprivs[i] = NULL;
+ }
+ }
+
+ for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) {
+ xvmc->surfaces[i] = 0;
+ if (xvmc->sfprivs[i]) {
+ xfree(xvmc->sfprivs[i]);
+ xvmc->sfprivs[i] = NULL;
+ }
+ }
}
-static Bool i915_map_xvmc_buffers(ScrnInfoPtr pScrn, I915XvMCContextPriv *ctxpriv)
+static Bool i915_map_xvmc_buffers(ScrnInfoPtr pScrn,
+ I915XvMCContextPriv * ctxpriv)
{
- I830Ptr pI830 = I830PTR(pScrn);
-
- if (drmAddMap(pI830->drmSubFD,
- (drm_handle_t)(ctxpriv->mcStaticIndirectState->offset + pI830->LinearAddr),
- ctxpriv->mcStaticIndirectState->size, DRM_AGP, 0,
- (drmAddress)&ctxpriv->sis_handle) < 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] drmAddMap(sis_handle) failed!\n");
- return FALSE;
- }
-
- if (drmAddMap(pI830->drmSubFD,
- (drm_handle_t)(ctxpriv->mcSamplerState->offset + pI830->LinearAddr),
- ctxpriv->mcSamplerState->size, DRM_AGP, 0,
- (drmAddress)&ctxpriv->ssb_handle) < 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] drmAddMap(ssb_handle) failed!\n");
- return FALSE;
- }
-
- if (drmAddMap(pI830->drmSubFD,
- (drm_handle_t)(ctxpriv->mcMapState->offset + pI830->LinearAddr),
- ctxpriv->mcMapState->size, DRM_AGP, 0,
- (drmAddress)&ctxpriv->msb_handle) < 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] drmAddMap(msb_handle) failed!\n");
- return FALSE;
- }
-
- if (drmAddMap(pI830->drmSubFD,
- (drm_handle_t)(ctxpriv->mcPixelShaderProgram->offset + pI830->LinearAddr),
- ctxpriv->mcPixelShaderProgram->size, DRM_AGP, 0,
- (drmAddress)&ctxpriv->psp_handle) < 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] drmAddMap(psp_handle) failed!\n");
- return FALSE;
- }
-
- if (drmAddMap(pI830->drmSubFD,
- (drm_handle_t)(ctxpriv->mcPixelShaderConstants->offset + pI830->LinearAddr),
- ctxpriv->mcPixelShaderConstants->size, DRM_AGP, 0,
- (drmAddress)&ctxpriv->psc_handle) < 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] drmAddMap(psc_handle) failed!\n");
- return FALSE;
- }
-
- if (drmAddMap(pI830->drmSubFD,
- (drm_handle_t)(ctxpriv->mcCorrdata->offset + pI830->LinearAddr),
- ctxpriv->mcCorrdata->size, DRM_AGP, 0,
- (drmAddress)&ctxpriv->corrdata_handle) < 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] drmAddMap(corrdata_handle) failed!\n");
- return FALSE;
- }
-
-
- return TRUE;
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ if (drmAddMap(pI830->drmSubFD,
+ (drm_handle_t) (ctxpriv->mcStaticIndirectState->offset +
+ pI830->LinearAddr),
+ ctxpriv->mcStaticIndirectState->size, DRM_AGP, 0,
+ (drmAddress) & ctxpriv->sis_handle) < 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[drm] drmAddMap(sis_handle) failed!\n");
+ return FALSE;
+ }
+
+ if (drmAddMap(pI830->drmSubFD,
+ (drm_handle_t) (ctxpriv->mcSamplerState->offset +
+ pI830->LinearAddr),
+ ctxpriv->mcSamplerState->size, DRM_AGP, 0,
+ (drmAddress) & ctxpriv->ssb_handle) < 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[drm] drmAddMap(ssb_handle) failed!\n");
+ return FALSE;
+ }
+
+ if (drmAddMap(pI830->drmSubFD,
+ (drm_handle_t) (ctxpriv->mcMapState->offset +
+ pI830->LinearAddr),
+ ctxpriv->mcMapState->size, DRM_AGP, 0,
+ (drmAddress) & ctxpriv->msb_handle) < 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[drm] drmAddMap(msb_handle) failed!\n");
+ return FALSE;
+ }
+
+ if (drmAddMap(pI830->drmSubFD,
+ (drm_handle_t) (ctxpriv->mcPixelShaderProgram->offset +
+ pI830->LinearAddr),
+ ctxpriv->mcPixelShaderProgram->size, DRM_AGP, 0,
+ (drmAddress) & ctxpriv->psp_handle) < 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[drm] drmAddMap(psp_handle) failed!\n");
+ return FALSE;
+ }
+
+ if (drmAddMap(pI830->drmSubFD,
+ (drm_handle_t) (ctxpriv->mcPixelShaderConstants->offset +
+ pI830->LinearAddr),
+ ctxpriv->mcPixelShaderConstants->size, DRM_AGP, 0,
+ (drmAddress) & ctxpriv->psc_handle) < 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[drm] drmAddMap(psc_handle) failed!\n");
+ return FALSE;
+ }
+
+ if (drmAddMap(pI830->drmSubFD,
+ (drm_handle_t) (ctxpriv->mcCorrdata->offset +
+ pI830->LinearAddr),
+ ctxpriv->mcCorrdata->size, DRM_AGP, 0,
+ (drmAddress) & ctxpriv->corrdata_handle) < 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[drm] drmAddMap(corrdata_handle) failed!\n");
+ return FALSE;
+ }
+
+ return TRUE;
}
-static void i915_unmap_xvmc_buffers(ScrnInfoPtr pScrn, I915XvMCContextPriv *ctxpriv)
+static void i915_unmap_xvmc_buffers(ScrnInfoPtr pScrn,
+ I915XvMCContextPriv * ctxpriv)
{
- I830Ptr pI830 = I830PTR(pScrn);
-
- if (ctxpriv->sis_handle) {
- drmRmMap(pI830->drmSubFD, ctxpriv->sis_handle);
- ctxpriv->sis_handle = 0;
- }
-
- if (ctxpriv->ssb_handle) {
- drmRmMap(pI830->drmSubFD, ctxpriv->ssb_handle);
- ctxpriv->ssb_handle = 0;
- }
-
- if (ctxpriv->msb_handle) {
- drmRmMap(pI830->drmSubFD, ctxpriv->msb_handle);
- ctxpriv->msb_handle = 0;
- }
-
- if (ctxpriv->psp_handle) {
- drmRmMap(pI830->drmSubFD, ctxpriv->psp_handle);
- ctxpriv->psp_handle = 0;
- }
-
- if (ctxpriv->psc_handle) {
- drmRmMap(pI830->drmSubFD, ctxpriv->psc_handle);
- ctxpriv->psc_handle = 0;
- }
-
- if (ctxpriv->corrdata_handle) {
- drmRmMap(pI830->drmSubFD, ctxpriv->corrdata_handle);
- ctxpriv->corrdata_handle = 0;
- }
+ I830Ptr pI830 = I830PTR(pScrn);
+
+ if (ctxpriv->sis_handle) {
+ drmRmMap(pI830->drmSubFD, ctxpriv->sis_handle);
+ ctxpriv->sis_handle = 0;
+ }
+
+ if (ctxpriv->ssb_handle) {
+ drmRmMap(pI830->drmSubFD, ctxpriv->ssb_handle);
+ ctxpriv->ssb_handle = 0;
+ }
+
+ if (ctxpriv->msb_handle) {
+ drmRmMap(pI830->drmSubFD, ctxpriv->msb_handle);
+ ctxpriv->msb_handle = 0;
+ }
+
+ if (ctxpriv->psp_handle) {
+ drmRmMap(pI830->drmSubFD, ctxpriv->psp_handle);
+ ctxpriv->psp_handle = 0;
+ }
+
+ if (ctxpriv->psc_handle) {
+ drmRmMap(pI830->drmSubFD, ctxpriv->psc_handle);
+ ctxpriv->psc_handle = 0;
+ }
+
+ if (ctxpriv->corrdata_handle) {
+ drmRmMap(pI830->drmSubFD, ctxpriv->corrdata_handle);
+ ctxpriv->corrdata_handle = 0;
+ }
}
-static Bool i915_allocate_xvmc_buffers(ScrnInfoPtr pScrn, I915XvMCContextPriv *ctxpriv)
+static Bool i915_allocate_xvmc_buffers(ScrnInfoPtr pScrn,
+ I915XvMCContextPriv * ctxpriv)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int flags = ALIGN_BOTH_ENDS;
-
- /* on 915G/GM, load indirect can only use physical address...sigh */
- if (IS_I915G(pI830) || IS_I915GM(pI830))
- flags |= NEED_PHYSICAL_ADDR;
-
- if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Static Indirect State",
- &(ctxpriv->mcStaticIndirectState), 4 * 1024,
- flags)) {
- return FALSE;
- }
-
- if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Sampler State",
- &(ctxpriv->mcSamplerState), 4 * 1024,
- flags)) {
- return FALSE;
- }
-
- if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Map State",
- &(ctxpriv->mcMapState), 4 * 1024,
- flags)) {
- return FALSE;
- }
-
- if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Pixel Shader Program",
- &(ctxpriv->mcPixelShaderProgram), 4 * 1024,
- flags)) {
- return FALSE;
- }
-
- if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Pixel Shader Constants",
- &(ctxpriv->mcPixelShaderConstants), 4 * 1024,
- flags)) {
- return FALSE;
- }
-
- if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Correction Data Buffer",
- &(ctxpriv->mcCorrdata), 512 * 1024,
- ALIGN_BOTH_ENDS)) {
- return FALSE;
- }
-
- if (1)
- i830_describe_allocations(pScrn, 1, "i915_mc: ");
-
- return TRUE;
+ I830Ptr pI830 = I830PTR(pScrn);
+ int flags = ALIGN_BOTH_ENDS;
+
+ /* on 915G/GM, load indirect can only use physical address...sigh */
+ if (IS_I915G(pI830) || IS_I915GM(pI830))
+ flags |= NEED_PHYSICAL_ADDR;
+
+ if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Static Indirect State",
+ &(ctxpriv->mcStaticIndirectState),
+ 4 * 1024, flags)) {
+ return FALSE;
+ }
+
+ if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Sampler State",
+ &(ctxpriv->mcSamplerState), 4 * 1024,
+ flags)) {
+ return FALSE;
+ }
+
+ if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Map State",
+ &(ctxpriv->mcMapState), 4 * 1024,
+ flags)) {
+ return FALSE;
+ }
+
+ if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Pixel Shader Program",
+ &(ctxpriv->mcPixelShaderProgram),
+ 4 * 1024, flags)) {
+ return FALSE;
+ }
+
+ if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Pixel Shader Constants",
+ &(ctxpriv->mcPixelShaderConstants),
+ 4 * 1024, flags)) {
+ return FALSE;
+ }
+
+ if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Correction Data Buffer",
+ &(ctxpriv->mcCorrdata), 512 * 1024,
+ ALIGN_BOTH_ENDS)) {
+ return FALSE;
+ }
+
+ if (1)
+ i830_describe_allocations(pScrn, 1, "i915_mc: ");
+
+ return TRUE;
}
-static void i915_free_xvmc_buffers(ScrnInfoPtr pScrn, I915XvMCContextPriv *ctxpriv)
+static void i915_free_xvmc_buffers(ScrnInfoPtr pScrn,
+ I915XvMCContextPriv * ctxpriv)
{
- if (ctxpriv->mcStaticIndirectState) {
- i830_free_xvmc_buffer(pScrn, ctxpriv->mcStaticIndirectState);
- ctxpriv->mcStaticIndirectState = NULL;
- }
-
- if (ctxpriv->mcSamplerState) {
- i830_free_xvmc_buffer(pScrn, ctxpriv->mcSamplerState);
- ctxpriv->mcSamplerState = NULL;
- }
-
- if (ctxpriv->mcMapState) {
- i830_free_xvmc_buffer(pScrn, ctxpriv->mcMapState);
- ctxpriv->mcMapState = NULL;
- }
-
- if (ctxpriv->mcPixelShaderProgram) {
- i830_free_xvmc_buffer(pScrn, ctxpriv->mcPixelShaderProgram);
- ctxpriv->mcPixelShaderProgram = NULL;
- }
-
- if (ctxpriv->mcPixelShaderConstants) {
- i830_free_xvmc_buffer(pScrn, ctxpriv->mcPixelShaderConstants);
- ctxpriv->mcPixelShaderConstants = NULL;
- }
-
- if (ctxpriv->mcCorrdata) {
- i830_free_xvmc_buffer(pScrn, ctxpriv->mcCorrdata);
- ctxpriv->mcCorrdata = NULL;
- }
+ if (ctxpriv->mcStaticIndirectState) {
+ i830_free_xvmc_buffer(pScrn, ctxpriv->mcStaticIndirectState);
+ ctxpriv->mcStaticIndirectState = NULL;
+ }
+
+ if (ctxpriv->mcSamplerState) {
+ i830_free_xvmc_buffer(pScrn, ctxpriv->mcSamplerState);
+ ctxpriv->mcSamplerState = NULL;
+ }
+
+ if (ctxpriv->mcMapState) {
+ i830_free_xvmc_buffer(pScrn, ctxpriv->mcMapState);
+ ctxpriv->mcMapState = NULL;
+ }
+
+ if (ctxpriv->mcPixelShaderProgram) {
+ i830_free_xvmc_buffer(pScrn, ctxpriv->mcPixelShaderProgram);
+ ctxpriv->mcPixelShaderProgram = NULL;
+ }
+
+ if (ctxpriv->mcPixelShaderConstants) {
+ i830_free_xvmc_buffer(pScrn, ctxpriv->mcPixelShaderConstants);
+ ctxpriv->mcPixelShaderConstants = NULL;
+ }
+
+ if (ctxpriv->mcCorrdata) {
+ i830_free_xvmc_buffer(pScrn, ctxpriv->mcCorrdata);
+ ctxpriv->mcCorrdata = NULL;
+ }
}
@@ -411,444 +412,457 @@ static void i915_free_xvmc_buffers(ScrnInfoPtr pScrn, I915XvMCContextPriv *ctxpr
*
**************************************************************************/
-static int i915_xvmc_create_context (ScrnInfoPtr pScrn, XvMCContextPtr pContext,
- int *num_priv, long **priv )
+static int i915_xvmc_create_context(ScrnInfoPtr pScrn, XvMCContextPtr pContext,
+ int *num_priv, long **priv)
{
- I830Ptr pI830 = I830PTR(pScrn);
- I915XvMCCreateContextRec *contextRec = NULL;
- I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate;
- I915XvMCContextPriv *ctxpriv = NULL;
- int i;
-
- *priv = NULL;
- *num_priv = 0;
-
- if (!pI830->XvMCEnabled) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] i915: XvMC disabled!\n");
- return BadAlloc;
- }
-
- for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) {
- if (!pXvMC->contexts[i])
- break;
- }
-
- if (i == I915_XVMC_MAX_CONTEXTS ||
+ I830Ptr pI830 = I830PTR(pScrn);
+ I915XvMCCreateContextRec *contextRec = NULL;
+ I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
+ I915XvMCContextPriv *ctxpriv = NULL;
+ int i;
+
+ *priv = NULL;
+ *num_priv = 0;
+
+ if (!pI830->XvMCEnabled) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] i915: XvMC disabled!\n");
+ return BadAlloc;
+ }
+
+ for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) {
+ if (!pXvMC->contexts[i])
+ break;
+ }
+
+ if (i == I915_XVMC_MAX_CONTEXTS ||
pXvMC->ncontexts >= I915_XVMC_MAX_CONTEXTS) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] i915: Out of contexts.\n");
- return BadAlloc;
- }
-
- i915_check_context_size(pContext);
-
- *priv = xcalloc(1, sizeof(I915XvMCCreateContextRec));
- contextRec = (I915XvMCCreateContextRec *)*priv;
-
- if (!*priv) {
- *num_priv = 0;
- return BadAlloc;
- }
-
- *num_priv = sizeof(I915XvMCCreateContextRec) >> 2;
-
- ctxpriv = (I915XvMCContextPriv *)xcalloc(1, sizeof(I915XvMCContextPriv));
-
- if (!ctxpriv) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] i915: Unable to allocate memory!\n");
- xfree(*priv);
- *priv = NULL;
- *num_priv = 0;
- return BadAlloc;
- }
-
- if (!i915_allocate_xvmc_buffers(pScrn, ctxpriv)) {
- i915_free_xvmc_buffers(pScrn, ctxpriv);
- xfree(ctxpriv);
- ctxpriv = NULL;
- xfree(*priv);
- *priv = NULL;
- *num_priv = 0;
- return BadAlloc;
- }
-
- if (!i915_map_xvmc_buffers(pScrn, ctxpriv)) {
- i915_unmap_xvmc_buffers(pScrn, ctxpriv);
- i915_free_xvmc_buffers(pScrn, ctxpriv);
- xfree(ctxpriv);
- ctxpriv = NULL;
- xfree(*priv);
- *priv = NULL;
- *num_priv = 0;
- return BadAlloc;
- }
-
- /* common context items */
- contextRec->comm.type = xvmc_driver->flag;
- contextRec->comm.batchbuffer.offset = xvmc_driver->batch->offset;
- contextRec->comm.batchbuffer.size = xvmc_driver->batch->size;
- contextRec->comm.batchbuffer.handle = xvmc_driver->batch_handle;
-
- /* i915 private context */
- contextRec->ctxno = i;
- contextRec->sis.handle = ctxpriv->sis_handle;
- contextRec->sis.offset = ctxpriv->mcStaticIndirectState->offset;
- contextRec->sis.size = ctxpriv->mcStaticIndirectState->size;
- contextRec->ssb.handle = ctxpriv->ssb_handle;
- contextRec->ssb.offset = ctxpriv->mcSamplerState->offset;
- contextRec->ssb.size = ctxpriv->mcSamplerState->size;
- contextRec->msb.handle = ctxpriv->msb_handle;
- contextRec->msb.offset = ctxpriv->mcMapState->offset;
- contextRec->msb.size = ctxpriv->mcMapState->size;
- contextRec->psp.handle = ctxpriv->psp_handle;
- contextRec->psp.offset = ctxpriv->mcPixelShaderProgram->offset;
- contextRec->psp.size = ctxpriv->mcPixelShaderProgram->size;
- contextRec->psc.handle = ctxpriv->psc_handle;
- contextRec->psc.offset = ctxpriv->mcPixelShaderConstants->offset;
- contextRec->psc.size = ctxpriv->mcPixelShaderConstants->size;
- contextRec->corrdata.handle = ctxpriv->corrdata_handle;
- contextRec->corrdata.offset = ctxpriv->mcCorrdata->offset;
- contextRec->corrdata.size = ctxpriv->mcCorrdata->size;
- contextRec->deviceID = DEVICE_ID(pI830->PciInfo);
-
- /* XXX: KMS */
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] i915: Out of contexts.\n");
+ return BadAlloc;
+ }
+
+ i915_check_context_size(pContext);
+
+ *priv = xcalloc(1, sizeof(I915XvMCCreateContextRec));
+ contextRec = (I915XvMCCreateContextRec *) * priv;
+
+ if (!*priv) {
+ *num_priv = 0;
+ return BadAlloc;
+ }
+
+ *num_priv = sizeof(I915XvMCCreateContextRec) >> 2;
+
+ ctxpriv =
+ (I915XvMCContextPriv *) xcalloc(1, sizeof(I915XvMCContextPriv));
+
+ if (!ctxpriv) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] i915: Unable to allocate memory!\n");
+ xfree(*priv);
+ *priv = NULL;
+ *num_priv = 0;
+ return BadAlloc;
+ }
+
+ if (!i915_allocate_xvmc_buffers(pScrn, ctxpriv)) {
+ i915_free_xvmc_buffers(pScrn, ctxpriv);
+ xfree(ctxpriv);
+ ctxpriv = NULL;
+ xfree(*priv);
+ *priv = NULL;
+ *num_priv = 0;
+ return BadAlloc;
+ }
+
+ if (!i915_map_xvmc_buffers(pScrn, ctxpriv)) {
+ i915_unmap_xvmc_buffers(pScrn, ctxpriv);
+ i915_free_xvmc_buffers(pScrn, ctxpriv);
+ xfree(ctxpriv);
+ ctxpriv = NULL;
+ xfree(*priv);
+ *priv = NULL;
+ *num_priv = 0;
+ return BadAlloc;
+ }
+
+ /* common context items */
+ contextRec->comm.type = xvmc_driver->flag;
+ contextRec->comm.batchbuffer.offset = xvmc_driver->batch->offset;
+ contextRec->comm.batchbuffer.size = xvmc_driver->batch->size;
+ contextRec->comm.batchbuffer.handle = xvmc_driver->batch_handle;
+
+ /* i915 private context */
+ contextRec->ctxno = i;
+ contextRec->sis.handle = ctxpriv->sis_handle;
+ contextRec->sis.offset = ctxpriv->mcStaticIndirectState->offset;
+ contextRec->sis.size = ctxpriv->mcStaticIndirectState->size;
+ contextRec->ssb.handle = ctxpriv->ssb_handle;
+ contextRec->ssb.offset = ctxpriv->mcSamplerState->offset;
+ contextRec->ssb.size = ctxpriv->mcSamplerState->size;
+ contextRec->msb.handle = ctxpriv->msb_handle;
+ contextRec->msb.offset = ctxpriv->mcMapState->offset;
+ contextRec->msb.size = ctxpriv->mcMapState->size;
+ contextRec->psp.handle = ctxpriv->psp_handle;
+ contextRec->psp.offset = ctxpriv->mcPixelShaderProgram->offset;
+ contextRec->psp.size = ctxpriv->mcPixelShaderProgram->size;
+ contextRec->psc.handle = ctxpriv->psc_handle;
+ contextRec->psc.offset = ctxpriv->mcPixelShaderConstants->offset;
+ contextRec->psc.size = ctxpriv->mcPixelShaderConstants->size;
+ contextRec->corrdata.handle = ctxpriv->corrdata_handle;
+ contextRec->corrdata.offset = ctxpriv->mcCorrdata->offset;
+ contextRec->corrdata.size = ctxpriv->mcCorrdata->size;
+ contextRec->deviceID = DEVICE_ID(pI830->PciInfo);
+
+ /* XXX: KMS */
#if 0
- if (IS_I915G(pI830) || IS_I915GM(pI830)) {
- contextRec->sis.bus_addr = ctxpriv->mcStaticIndirectState->bus_addr;
- contextRec->ssb.bus_addr = ctxpriv->mcSamplerState->bus_addr;
- contextRec->msb.bus_addr = ctxpriv->mcMapState->bus_addr;
- contextRec->psp.bus_addr = ctxpriv->mcPixelShaderProgram->bus_addr;
- contextRec->psc.bus_addr = ctxpriv->mcPixelShaderConstants->bus_addr;
- }
+ if (IS_I915G(pI830) || IS_I915GM(pI830)) {
+ contextRec->sis.bus_addr =
+ ctxpriv->mcStaticIndirectState->bus_addr;
+ contextRec->ssb.bus_addr = ctxpriv->mcSamplerState->bus_addr;
+ contextRec->msb.bus_addr = ctxpriv->mcMapState->bus_addr;
+ contextRec->psp.bus_addr =
+ ctxpriv->mcPixelShaderProgram->bus_addr;
+ contextRec->psc.bus_addr =
+ ctxpriv->mcPixelShaderConstants->bus_addr;
+ }
#endif
- pXvMC->ncontexts++;
- pXvMC->contexts[i] = pContext->context_id;
- pXvMC->ctxprivs[i] = ctxpriv;
+ pXvMC->ncontexts++;
+ pXvMC->contexts[i] = pContext->context_id;
+ pXvMC->ctxprivs[i] = ctxpriv;
- return Success;
+ return Success;
}
-static int i915_xvmc_create_surface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf,
- int *num_priv, long **priv )
+static int i915_xvmc_create_surface(ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf,
+ int *num_priv, long **priv)
{
- I830Ptr pI830 = I830PTR(pScrn);
- I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate;
- I915XvMCSurfacePriv *sfpriv = NULL;
- I915XvMCCreateSurfaceRec *surfaceRec = NULL;
- XvMCContextPtr ctx = NULL;
- unsigned int srfno;
- unsigned long bufsize;
-
- if (!pI830->XvMCEnabled) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] i915: XvMC disabled!\n");
- return BadAlloc;
- }
-
- *priv = NULL;
- *num_priv = 0;
-
- for (srfno = 0; srfno < I915_XVMC_MAX_SURFACES; ++srfno) {
- if (!pXvMC->surfaces[srfno])
- break;
- }
-
- if (srfno == I915_XVMC_MAX_SURFACES ||
+ I830Ptr pI830 = I830PTR(pScrn);
+ I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
+ I915XvMCSurfacePriv *sfpriv = NULL;
+ I915XvMCCreateSurfaceRec *surfaceRec = NULL;
+ XvMCContextPtr ctx = NULL;
+ unsigned int srfno;
+ unsigned long bufsize;
+
+ if (!pI830->XvMCEnabled) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] i915: XvMC disabled!\n");
+ return BadAlloc;
+ }
+
+ *priv = NULL;
+ *num_priv = 0;
+
+ for (srfno = 0; srfno < I915_XVMC_MAX_SURFACES; ++srfno) {
+ if (!pXvMC->surfaces[srfno])
+ break;
+ }
+
+ if (srfno == I915_XVMC_MAX_SURFACES ||
pXvMC->nsurfaces >= I915_XVMC_MAX_SURFACES) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] i915: Too many surfaces !\n");
- return BadAlloc;
- }
-
- *priv = xcalloc(1, sizeof(I915XvMCCreateSurfaceRec));
- surfaceRec = (I915XvMCCreateSurfaceRec *)*priv;
-
- if (!*priv) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] i915:Unable to allocate surface priv ret memory!\n");
- return BadAlloc;
- }
-
- *num_priv = sizeof(I915XvMCCreateSurfaceRec) >> 2;
- sfpriv = (I915XvMCSurfacePriv *)xcalloc(1, sizeof(I915XvMCSurfacePriv));
-
- if (!sfpriv) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] i915: Unable to allocate surface priv memory!\n");
- xfree(*priv);
- *priv = NULL;
- *num_priv = 0;
- return BadAlloc;
- }
-
- ctx = pSurf->context;
- bufsize = SIZE_YUV420(ctx->width, ctx->height);
-
- if (!i830_allocate_xvmc_buffer(pScrn, "XvMC surface",
- &(sfpriv->surface), bufsize,
- ALIGN_BOTH_ENDS)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] i915 : Failed to allocate XvMC surface space!\n");
- xfree(sfpriv);
- xfree(*priv);
- *priv = NULL;
- *num_priv = 0;
- return BadAlloc;
- }
-
- if (0)
- i830_describe_allocations(pScrn, 1, "");
-
- if (drmAddMap(pI830->drmSubFD,
- (drm_handle_t)(sfpriv->surface->offset + pI830->LinearAddr),
- sfpriv->surface->size, DRM_AGP, 0,
- (drmAddress)&sfpriv->surface_handle) < 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] drmAddMap(surface_handle) failed!\n");
- i830_free_xvmc_buffer(pScrn, sfpriv->surface);
- xfree(sfpriv);
- xfree(*priv);
- *priv = NULL;
- *num_priv = 0;
- return BadAlloc;
- }
-
- surfaceRec->srfno = srfno;
- surfaceRec->srf.handle = sfpriv->surface_handle;
- surfaceRec->srf.offset = sfpriv->surface->offset;
- surfaceRec->srf.size = sfpriv->surface->size;
-
- pXvMC->surfaces[srfno] = pSurf->surface_id;
- pXvMC->sfprivs[srfno]= sfpriv;
- pXvMC->nsurfaces++;
-
- return Success;
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] i915: Too many surfaces !\n");
+ return BadAlloc;
+ }
+
+ *priv = xcalloc(1, sizeof(I915XvMCCreateSurfaceRec));
+ surfaceRec = (I915XvMCCreateSurfaceRec *) * priv;
+
+ if (!*priv) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] i915:Unable to allocate surface priv ret memory!\n");
+ return BadAlloc;
+ }
+
+ *num_priv = sizeof(I915XvMCCreateSurfaceRec) >> 2;
+ sfpriv =
+ (I915XvMCSurfacePriv *) xcalloc(1, sizeof(I915XvMCSurfacePriv));
+
+ if (!sfpriv) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] i915: Unable to allocate surface priv memory!\n");
+ xfree(*priv);
+ *priv = NULL;
+ *num_priv = 0;
+ return BadAlloc;
+ }
+
+ ctx = pSurf->context;
+ bufsize = SIZE_YUV420(ctx->width, ctx->height);
+
+ if (!i830_allocate_xvmc_buffer(pScrn, "XvMC surface",
+ &(sfpriv->surface), bufsize,
+ ALIGN_BOTH_ENDS)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] i915 : Failed to allocate XvMC surface space!\n");
+ xfree(sfpriv);
+ xfree(*priv);
+ *priv = NULL;
+ *num_priv = 0;
+ return BadAlloc;
+ }
+
+ if (0)
+ i830_describe_allocations(pScrn, 1, "");
+
+ if (drmAddMap(pI830->drmSubFD,
+ (drm_handle_t) (sfpriv->surface->offset +
+ pI830->LinearAddr), sfpriv->surface->size,
+ DRM_AGP, 0, (drmAddress) & sfpriv->surface_handle) < 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[drm] drmAddMap(surface_handle) failed!\n");
+ i830_free_xvmc_buffer(pScrn, sfpriv->surface);
+ xfree(sfpriv);
+ xfree(*priv);
+ *priv = NULL;
+ *num_priv = 0;
+ return BadAlloc;
+ }
+
+ surfaceRec->srfno = srfno;
+ surfaceRec->srf.handle = sfpriv->surface_handle;
+ surfaceRec->srf.offset = sfpriv->surface->offset;
+ surfaceRec->srf.size = sfpriv->surface->size;
+
+ pXvMC->surfaces[srfno] = pSurf->surface_id;
+ pXvMC->sfprivs[srfno] = sfpriv;
+ pXvMC->nsurfaces++;
+
+ return Success;
}
static int i915_xvmc_create_subpict(ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp,
- int *num_priv, long **priv )
+ int *num_priv, long **priv)
{
- I830Ptr pI830 = I830PTR(pScrn);
- I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate;
- I915XvMCSurfacePriv *sfpriv = NULL;
- I915XvMCCreateSurfaceRec *surfaceRec = NULL;
- XvMCContextPtr ctx = NULL;
- unsigned int srfno;
- unsigned int bufsize;
-
- *priv = NULL;
- *num_priv = 0;
-
- for (srfno = 0; srfno < I915_XVMC_MAX_SURFACES; ++srfno) {
- if (!pXvMC->surfaces[srfno])
- break;
- }
-
- if (srfno == I915_XVMC_MAX_SURFACES ||
+ I830Ptr pI830 = I830PTR(pScrn);
+ I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
+ I915XvMCSurfacePriv *sfpriv = NULL;
+ I915XvMCCreateSurfaceRec *surfaceRec = NULL;
+ XvMCContextPtr ctx = NULL;
+ unsigned int srfno;
+ unsigned int bufsize;
+
+ *priv = NULL;
+ *num_priv = 0;
+
+ for (srfno = 0; srfno < I915_XVMC_MAX_SURFACES; ++srfno) {
+ if (!pXvMC->surfaces[srfno])
+ break;
+ }
+
+ if (srfno == I915_XVMC_MAX_SURFACES ||
pXvMC->nsurfaces >= I915_XVMC_MAX_SURFACES) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] i915: Too many surfaces !\n");
- return BadAlloc;
- }
-
- *priv = xcalloc(1, sizeof(I915XvMCCreateSurfaceRec));
- surfaceRec = (I915XvMCCreateSurfaceRec *)*priv;
-
- if (!*priv) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] i915: Unable to allocate memory!\n");
- return BadAlloc;
- }
-
- *num_priv = sizeof(I915XvMCCreateSurfaceRec) >> 2;
- sfpriv = (I915XvMCSurfacePriv *)xcalloc(1, sizeof(I915XvMCSurfacePriv));
-
- if (!sfpriv) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] i915: Unable to allocate memory!\n");
- xfree(*priv);
- *priv = NULL;
- *num_priv = 0;
- return BadAlloc;
- }
-
- ctx = pSubp->context;
- bufsize = SIZE_XX44(ctx->width, ctx->height);
-
- if (!i830_allocate_xvmc_buffer(pScrn, "XvMC surface",
- &(sfpriv->surface), bufsize,
- ALIGN_BOTH_ENDS)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] I915XvMCCreateSurface: Failed to allocate XvMC surface space!\n");
- xfree(sfpriv);
- xfree(*priv);
- *priv = NULL;
- *num_priv = 0;
- return BadAlloc;
- }
-
- if (drmAddMap(pI830->drmSubFD,
- (drm_handle_t)(sfpriv->surface->offset + pI830->LinearAddr),
- sfpriv->surface->size, DRM_AGP, 0,
- (drmAddress)&sfpriv->surface_handle) < 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[drm] drmAddMap(surface_handle) failed!\n");
- i830_free_xvmc_buffer(pScrn, sfpriv->surface);
- xfree(sfpriv);
- xfree(*priv);
- *priv = NULL;
- *num_priv = 0;
- return BadAlloc;
- }
-
- surfaceRec->srfno = srfno;
- surfaceRec->srf.handle = sfpriv->surface_handle;
- surfaceRec->srf.offset = sfpriv->surface->offset;
- surfaceRec->srf.size = sfpriv->surface->size;
-
- pXvMC->sfprivs[srfno] = sfpriv;
- pXvMC->surfaces[srfno] = pSubp->subpicture_id;
- pXvMC->nsurfaces++;
-
- return Success;
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] i915: Too many surfaces !\n");
+ return BadAlloc;
+ }
+
+ *priv = xcalloc(1, sizeof(I915XvMCCreateSurfaceRec));
+ surfaceRec = (I915XvMCCreateSurfaceRec *) * priv;
+
+ if (!*priv) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] i915: Unable to allocate memory!\n");
+ return BadAlloc;
+ }
+
+ *num_priv = sizeof(I915XvMCCreateSurfaceRec) >> 2;
+ sfpriv =
+ (I915XvMCSurfacePriv *) xcalloc(1, sizeof(I915XvMCSurfacePriv));
+
+ if (!sfpriv) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] i915: Unable to allocate memory!\n");
+ xfree(*priv);
+ *priv = NULL;
+ *num_priv = 0;
+ return BadAlloc;
+ }
+
+ ctx = pSubp->context;
+ bufsize = SIZE_XX44(ctx->width, ctx->height);
+
+ if (!i830_allocate_xvmc_buffer(pScrn, "XvMC surface",
+ &(sfpriv->surface), bufsize,
+ ALIGN_BOTH_ENDS)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] I915XvMCCreateSurface: Failed to allocate XvMC surface space!\n");
+ xfree(sfpriv);
+ xfree(*priv);
+ *priv = NULL;
+ *num_priv = 0;
+ return BadAlloc;
+ }
+
+ if (drmAddMap(pI830->drmSubFD,
+ (drm_handle_t) (sfpriv->surface->offset +
+ pI830->LinearAddr), sfpriv->surface->size,
+ DRM_AGP, 0, (drmAddress) & sfpriv->surface_handle) < 0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[drm] drmAddMap(surface_handle) failed!\n");
+ i830_free_xvmc_buffer(pScrn, sfpriv->surface);
+ xfree(sfpriv);
+ xfree(*priv);
+ *priv = NULL;
+ *num_priv = 0;
+ return BadAlloc;
+ }
+
+ surfaceRec->srfno = srfno;
+ surfaceRec->srf.handle = sfpriv->surface_handle;
+ surfaceRec->srf.offset = sfpriv->surface->offset;
+ surfaceRec->srf.size = sfpriv->surface->size;
+
+ pXvMC->sfprivs[srfno] = sfpriv;
+ pXvMC->surfaces[srfno] = pSubp->subpicture_id;
+ pXvMC->nsurfaces++;
+
+ return Success;
}
-static void i915_xvmc_destroy_context (ScrnInfoPtr pScrn,
- XvMCContextPtr pContext)
+static void i915_xvmc_destroy_context(ScrnInfoPtr pScrn,
+ XvMCContextPtr pContext)
{
- I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate;
- int i;
-
- for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) {
- if (pXvMC->contexts[i] == pContext->context_id) {
- i915_unmap_xvmc_buffers(pScrn, pXvMC->ctxprivs[i]);
- i915_free_xvmc_buffers(pScrn, pXvMC->ctxprivs[i]);
- xfree(pXvMC->ctxprivs[i]);
- pXvMC->ctxprivs[i] = 0;
- pXvMC->ncontexts--;
- pXvMC->contexts[i] = 0;
- return;
- }
- }
-
- return;
+ I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
+ int i;
+
+ for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) {
+ if (pXvMC->contexts[i] == pContext->context_id) {
+ i915_unmap_xvmc_buffers(pScrn, pXvMC->ctxprivs[i]);
+ i915_free_xvmc_buffers(pScrn, pXvMC->ctxprivs[i]);
+ xfree(pXvMC->ctxprivs[i]);
+ pXvMC->ctxprivs[i] = 0;
+ pXvMC->ncontexts--;
+ pXvMC->contexts[i] = 0;
+ return;
+ }
+ }
+
+ return;
}
-static void i915_xvmc_destroy_surface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf)
+static void i915_xvmc_destroy_surface(ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf)
{
- I830Ptr pI830 = I830PTR(pScrn);
- I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate;
- int i;
-
- for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) {
- if (pXvMC->surfaces[i] == pSurf->surface_id) {
- drmRmMap(pI830->drmSubFD, pXvMC->sfprivs[i]->surface_handle);
- i830_free_xvmc_buffer(pScrn, pXvMC->sfprivs[i]->surface);
- xfree(pXvMC->sfprivs[i]);
- pXvMC->nsurfaces--;
- pXvMC->sfprivs[i] = 0;
- pXvMC->surfaces[i] = 0;
- return;
- }
- }
-
- return;
+ I830Ptr pI830 = I830PTR(pScrn);
+ I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
+ int i;
+
+ for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) {
+ if (pXvMC->surfaces[i] == pSurf->surface_id) {
+ drmRmMap(pI830->drmSubFD,
+ pXvMC->sfprivs[i]->surface_handle);
+ i830_free_xvmc_buffer(pScrn,
+ pXvMC->sfprivs[i]->surface);
+ xfree(pXvMC->sfprivs[i]);
+ pXvMC->nsurfaces--;
+ pXvMC->sfprivs[i] = 0;
+ pXvMC->surfaces[i] = 0;
+ return;
+ }
+ }
+
+ return;
}
-static void i915_xvmc_destroy_subpict (ScrnInfoPtr pScrn,
- XvMCSubpicturePtr pSubp)
+static void i915_xvmc_destroy_subpict(ScrnInfoPtr pScrn,
+ XvMCSubpicturePtr pSubp)
{
- I830Ptr pI830 = I830PTR(pScrn);
- I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate;
- int i;
-
- for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) {
- if (pXvMC->surfaces[i] == pSubp->subpicture_id) {
- drmRmMap(pI830->drmSubFD, pXvMC->sfprivs[i]->surface_handle);
- i830_free_xvmc_buffer(pScrn, pXvMC->sfprivs[i]->surface);
- xfree(pXvMC->sfprivs[i]);
- pXvMC->nsurfaces--;
- pXvMC->sfprivs[i] = 0;
- pXvMC->surfaces[i] = 0;
- return;
- }
- }
-
- return;
+ I830Ptr pI830 = I830PTR(pScrn);
+ I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
+ int i;
+
+ for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) {
+ if (pXvMC->surfaces[i] == pSubp->subpicture_id) {
+ drmRmMap(pI830->drmSubFD,
+ pXvMC->sfprivs[i]->surface_handle);
+ i830_free_xvmc_buffer(pScrn,
+ pXvMC->sfprivs[i]->surface);
+ xfree(pXvMC->sfprivs[i]);
+ pXvMC->nsurfaces--;
+ pXvMC->sfprivs[i] = 0;
+ pXvMC->surfaces[i] = 0;
+ return;
+ }
+ }
+
+ return;
}
static int i915_xvmc_put_image(ScrnInfoPtr pScrn,
- short src_x, short src_y,
- short drw_x, short drw_y, short src_w,
- short src_h, short drw_w, short drw_h,
- int id, unsigned char *buf, short width,
- short height, Bool sync, RegionPtr clipBoxes, pointer data,
- DrawablePtr pDraw)
+ short src_x, short src_y,
+ short drw_x, short drw_y, short src_w,
+ short src_h, short drw_w, short drw_h,
+ int id, unsigned char *buf, short width,
+ short height, Bool sync, RegionPtr clipBoxes,
+ pointer data, DrawablePtr pDraw)
{
- I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate;
- struct intel_xvmc_command *xvmc_cmd = (struct intel_xvmc_command *)buf;
- int ret;
-
- if (FOURCC_XVMC == id) {
- switch (xvmc_cmd->command) {
- case INTEL_XVMC_COMMAND_DISPLAY:
- if ((xvmc_cmd->srfNo >= I915_XVMC_MAX_SURFACES) ||
- !pXvMC->surfaces[xvmc_cmd->srfNo] ||
- !pXvMC->sfprivs[xvmc_cmd->srfNo]) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[XvMC] i915 put image: Invalid parameters!\n");
- return 1;
+ I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
+ struct intel_xvmc_command *xvmc_cmd = (struct intel_xvmc_command *)buf;
+ int ret;
+
+ if (FOURCC_XVMC == id) {
+ switch (xvmc_cmd->command) {
+ case INTEL_XVMC_COMMAND_DISPLAY:
+ if ((xvmc_cmd->srfNo >= I915_XVMC_MAX_SURFACES) ||
+ !pXvMC->surfaces[xvmc_cmd->srfNo] ||
+ !pXvMC->sfprivs[xvmc_cmd->srfNo]) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] i915 put image: Invalid parameters!\n");
+ return 1;
+ }
+
+ /* use char *buf to hold our surface offset...hacky! */
+ buf =
+ (unsigned char *)pXvMC->sfprivs[xvmc_cmd->srfNo]->
+ surface->offset;
+ break;
+ default:
+ return 0;
}
-
- /* use char *buf to hold our surface offset...hacky! */
- buf = (unsigned char *)pXvMC->sfprivs[xvmc_cmd->srfNo]->surface->offset;
- break;
- default:
- return 0;
}
- }
- ret = pXvMC->savePutImage(pScrn, src_x, src_y, drw_x, drw_y, src_w, src_h,
- drw_w, drw_h, id, buf, width, height, sync, clipBoxes,
- data, pDraw);
- return ret;
+ ret =
+ pXvMC->savePutImage(pScrn, src_x, src_y, drw_x, drw_y, src_w, src_h,
+ drw_w, drw_h, id, buf, width, height, sync,
+ clipBoxes, data, pDraw);
+ return ret;
}
static Bool i915_xvmc_init(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr XvAdapt)
{
- I915XvMCPtr pXvMC;
-
- pXvMC = (I915XvMCPtr)xcalloc(1, sizeof(I915XvMC));
- if (!pXvMC) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "[XvMC] alloc driver private failed!\n");
- return FALSE;
- }
- xvmc_driver->devPrivate = (void*)pXvMC;
- if (!intel_xvmc_init_batch(pScrn)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "[XvMC] fail to init batch buffer\n");
- xfree(pXvMC);
- return FALSE;
- }
- initI915XvMC(pXvMC);
-
- /* set up wrappers */
- pXvMC->savePutImage = XvAdapt->PutImage;
- XvAdapt->PutImage = i915_xvmc_put_image;
- return TRUE;
+ I915XvMCPtr pXvMC;
+
+ pXvMC = (I915XvMCPtr) xcalloc(1, sizeof(I915XvMC));
+ if (!pXvMC) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "[XvMC] alloc driver private failed!\n");
+ return FALSE;
+ }
+ xvmc_driver->devPrivate = (void *)pXvMC;
+ if (!intel_xvmc_init_batch(pScrn)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "[XvMC] fail to init batch buffer\n");
+ xfree(pXvMC);
+ return FALSE;
+ }
+ initI915XvMC(pXvMC);
+
+ /* set up wrappers */
+ pXvMC->savePutImage = XvAdapt->PutImage;
+ XvAdapt->PutImage = i915_xvmc_put_image;
+ return TRUE;
}
static void i915_xvmc_fini(ScrnInfoPtr pScrn)
{
- I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate;
+ I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
- cleanupI915XvMC(pXvMC);
- intel_xvmc_fini_batch(pScrn);
- xfree(xvmc_driver->devPrivate);
+ cleanupI915XvMC(pXvMC);
+ intel_xvmc_fini_batch(pScrn);
+ xfree(xvmc_driver->devPrivate);
}
/* Fill in the device dependent adaptor record.
@@ -858,30 +872,35 @@ static void i915_xvmc_fini(ScrnInfoPtr pScrn)
* Surface and Subpicture - see above
* Function pointers to functions below
*/
-static XF86MCAdaptorRec pAdapt =
-{
- .name = "Intel(R) Textured Video",
- .num_surfaces = ARRAY_SIZE(ppSI),
- .surfaces = ppSI,
+static XF86MCAdaptorRec pAdapt = {
+ .name = "Intel(R) Textured Video",
+ .num_surfaces = ARRAY_SIZE(ppSI),
+ .surfaces = ppSI,
#if 0
- .num_subpictures = ARRARY_SIZE(i915_subpicture_list),
- .subpictures = i915_subpicture_list,
+ .num_subpictures = ARRARY_SIZE(i915_subpicture_list),
+ .subpictures = i915_subpicture_list,
#endif
- .num_subpictures = 0,
- .subpictures = NULL,
- .CreateContext = (xf86XvMCCreateContextProcPtr) i915_xvmc_create_context,
- .DestroyContext = (xf86XvMCDestroyContextProcPtr) i915_xvmc_destroy_context,
- .CreateSurface = (xf86XvMCCreateSurfaceProcPtr) i915_xvmc_create_surface,
- .DestroySurface = (xf86XvMCDestroySurfaceProcPtr) i915_xvmc_destroy_surface,
- .CreateSubpicture = (xf86XvMCCreateSubpictureProcPtr) i915_xvmc_create_subpict,
- .DestroySubpicture = (xf86XvMCDestroySubpictureProcPtr) i915_xvmc_destroy_subpict,
+ .num_subpictures = 0,
+ .subpictures = NULL,
+ .CreateContext =
+ (xf86XvMCCreateContextProcPtr) i915_xvmc_create_context,
+ .DestroyContext =
+ (xf86XvMCDestroyContextProcPtr) i915_xvmc_destroy_context,
+ .CreateSurface =
+ (xf86XvMCCreateSurfaceProcPtr) i915_xvmc_create_surface,
+ .DestroySurface =
+ (xf86XvMCDestroySurfaceProcPtr) i915_xvmc_destroy_surface,
+ .CreateSubpicture =
+ (xf86XvMCCreateSubpictureProcPtr) i915_xvmc_create_subpict,
+ .DestroySubpicture =
+ (xf86XvMCDestroySubpictureProcPtr) i915_xvmc_destroy_subpict,
};
/* new xvmc driver interface */
struct intel_xvmc_driver i915_xvmc_driver = {
- .name = "i915_xvmc",
- .adaptor = &pAdapt,
- .flag = XVMC_I915_MPEG2_MC,
- .init = i915_xvmc_init,
- .fini = i915_xvmc_fini,
+ .name = "i915_xvmc",
+ .adaptor = &pAdapt,
+ .flag = XVMC_I915_MPEG2_MC,
+ .init = i915_xvmc_init,
+ .fini = i915_xvmc_fini,
};
diff --git a/src/i915_hwmc.h b/src/i915_hwmc.h
index abd3171e..59940ea1 100644
--- a/src/i915_hwmc.h
+++ b/src/i915_hwmc.h
@@ -39,23 +39,21 @@
#define I915_NUM_XVMC_ATTRIBUTES 0x02
#define I915_XVMC_VALID 0x80000000
-typedef struct
-{
- struct _intel_xvmc_common comm;
- unsigned int ctxno; /* XvMC private context reference number */
- struct hwmc_buffer sis;
- struct hwmc_buffer ssb;
- struct hwmc_buffer msb;
- struct hwmc_buffer psp;
- struct hwmc_buffer psc;
- struct hwmc_buffer corrdata;/* Correction Data Buffer */
- int deviceID;
+typedef struct {
+ struct _intel_xvmc_common comm;
+ unsigned int ctxno; /* XvMC private context reference number */
+ struct hwmc_buffer sis;
+ struct hwmc_buffer ssb;
+ struct hwmc_buffer msb;
+ struct hwmc_buffer psp;
+ struct hwmc_buffer psc;
+ struct hwmc_buffer corrdata; /* Correction Data Buffer */
+ int deviceID;
} I915XvMCCreateContextRec;
-typedef struct
-{
- unsigned int srfno;
- struct hwmc_buffer srf;
+typedef struct {
+ unsigned int srfno;
+ struct hwmc_buffer srf;
} I915XvMCCreateSurfaceRec;
#endif /* _I915_HWMC_H */
diff --git a/src/i915_reg.h b/src/i915_reg.h
index 4340de93..a61bc401 100644
--- a/src/i915_reg.h
+++ b/src/i915_reg.h
@@ -25,7 +25,6 @@
*
**************************************************************************/
-
#ifndef _I915_REG_H_
#define _I915_REG_H_
@@ -78,7 +77,6 @@
#define BFO_ENABLE_STENCIL_TWO_SIDE (1<<1)
#define BFO_STENCIL_TWO_SIDE (1<<0)
-
/* 3DSTATE_BACKFACE_STENCIL_MASKS, p140 */
#define _3DSTATE_BACKFACE_STENCIL_MASKS (CMD_3D | (0x9<<24))
#define BFM_ENABLE_STENCIL_TEST_MASK (1<<17)
@@ -88,8 +86,6 @@
#define BFM_STENCIL_WRITE_MASK_SHIFT 0
#define BFM_STENCIL_WRITE_MASK_MASK (0xff<<0)
-
-
/* 3DSTATE_BIN_CONTROL p141 */
/* p143 */
@@ -105,7 +101,6 @@
/* Dword 2 */
#define BUF_3D_ADDR(x) ((x) & ~0x3)
-
/* 3DSTATE_CHROMA_KEY */
/* 3DSTATE_CLEAR_PARAMETERS, p150 */
@@ -120,8 +115,6 @@
/* 3DSTATE_CONSTANT_BLEND_COLOR, p153 */
#define _3DSTATE_CONST_BLEND_COLOR_CMD (CMD_3D | (0x1d<<24) | (0x88<<16))
-
-
/* 3DSTATE_COORD_SET_BINDINGS, p154 */
#define _3DSTATE_COORD_SET_BINDINGS (CMD_3D | (0x16<<24))
#define CSB_TCB(iunit, eunit) ((eunit)<<(iunit*3))
@@ -135,7 +128,6 @@
/* p158 */
#define _3DSTATE_DFLT_Z_CMD (CMD_3D | (0x1d<<24) | (0x98<<16))
-
/* 3DSTATE_DEPTH_OFFSET_SCALE, p159 */
#define _3DSTATE_DEPTH_OFFSET_SCALE (CMD_3D | (0x1d<<24) | (0x97<<16))
/* scale in dword 1 */
@@ -195,12 +187,10 @@
#define DRAW_YORG(x) ((x)<<16)
#define DRAW_XORG(x) (x)
-
/* 3DSTATE_FILTER_COEFFICIENTS_4X4, p170 */
/* 3DSTATE_FILTER_COEFFICIENTS_6X5, p172 */
-
/* _3DSTATE_FOG_COLOR, p173 */
#define _3DSTATE_FOG_COLOR_CMD (CMD_3D|(0x15<<24))
#define FOG_COLOR_RED(x) ((x)<<16)
@@ -228,8 +218,6 @@
/* Dword 3 */
#define FMC3_D_ONE (1<<16)
-
-
/* _3DSTATE_INDEPENDENT_ALPHA_BLEND, p177 */
#define _3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD (CMD_3D|(0x0b<<24))
#define IAB_MODIFY_ENABLE (1<<23)
@@ -306,10 +294,6 @@
#define PSC0_BUFFER_VALID (1<<0)
#define PSC1_BUFFER_LENGTH(x) ((x)&0xff)
-
-
-
-
/* _3DSTATE_RASTERIZATION_RULES */
#define _3DSTATE_RASTER_RULES_CMD (CMD_3D|(0x07<<24))
#define ENABLE_POINT_RASTER_RULE (1<<15)
@@ -409,7 +393,6 @@
S4_VFMT_XYZW_MASK | \
S4_VFMT_FOG_PARAM)
-
#define S5_WRITEDISABLE_ALPHA (1<<31)
#define S5_WRITEDISABLE_RED (1<<30)
#define S5_WRITEDISABLE_GREEN (1<<29)
@@ -434,7 +417,6 @@
#define S5_COLOR_DITHER_ENABLE (1<<1)
#define S5_LOGICOP_ENABLE (1<<0)
-
#define S6_ALPHA_TEST_ENABLE (1<<31)
#define S6_ALPHA_TEST_FUNC_SHIFT 28
#define S6_ALPHA_TEST_FUNC_MASK (0x7<<28)
@@ -460,7 +442,6 @@
/* 3DSTATE_MAP_DEINTERLACER_PARAMETERS */
/* 3DSTATE_MAP_PALETTE_LOAD_32, p206 */
-
/* _3DSTATE_MODES_4, p218 */
#define _3DSTATE_MODES_4_CMD (CMD_3D|(0x0d<<24))
#define ENABLE_LOGIC_OP_FUNC (1<<23)
@@ -479,7 +460,6 @@
#define PIPELINE_FLUSH_RENDER_CACHE (1<<18)
#define PIPELINE_FLUSH_TEXTURE_CACHE (1<<16)
-
/* p221 */
#define _3DSTATE_PIXEL_SHADER_CONSTANTS (CMD_3D|(0x1d<<24)|(0x6<<16))
#define PS1_REG(n) (1<<(n))
@@ -490,51 +470,48 @@
/* p222 */
-
#define I915_MAX_TEX_INDIRECT 4
-#define I915_MAX_TEX_INSN 32
+#define I915_MAX_TEX_INSN 32
#define I915_MAX_ALU_INSN 64
#define I915_MAX_DECL_INSN 27
#define I915_MAX_TEMPORARY 16
-
/* Each instruction is 3 dwords long, though most don't require all
* this space. Maximum of 123 instructions. Smaller maxes per insn
* type.
*/
#define _3DSTATE_PIXEL_SHADER_PROGRAM (CMD_3D|(0x1d<<24)|(0x5<<16))
-#define REG_TYPE_R 0 /* temporary regs, no need to
- * dcl, must be written before
- * read -- Preserved between
- * phases.
- */
-#define REG_TYPE_T 1 /* Interpolated values, must be
- * dcl'ed before use.
- *
- * 0..7: texture coord,
- * 8: diffuse spec,
- * 9: specular color,
- * 10: fog parameter in w.
- */
-#define REG_TYPE_CONST 2 /* Restriction: only one const
- * can be referenced per
- * instruction, though it may be
- * selected for multiple inputs.
- * Constants not initialized
- * default to zero.
- */
-#define REG_TYPE_S 3 /* sampler */
-#define REG_TYPE_OC 4 /* output color (rgba) */
-#define REG_TYPE_OD 5 /* output depth (w), xyz are
- * temporaries. If not written,
- * interpolated depth is used?
- */
-#define REG_TYPE_U 6 /* unpreserved temporaries */
+#define REG_TYPE_R 0 /* temporary regs, no need to
+ * dcl, must be written before
+ * read -- Preserved between
+ * phases.
+ */
+#define REG_TYPE_T 1 /* Interpolated values, must be
+ * dcl'ed before use.
+ *
+ * 0..7: texture coord,
+ * 8: diffuse spec,
+ * 9: specular color,
+ * 10: fog parameter in w.
+ */
+#define REG_TYPE_CONST 2 /* Restriction: only one const
+ * can be referenced per
+ * instruction, though it may be
+ * selected for multiple inputs.
+ * Constants not initialized
+ * default to zero.
+ */
+#define REG_TYPE_S 3 /* sampler */
+#define REG_TYPE_OC 4 /* output color (rgba) */
+#define REG_TYPE_OD 5 /* output depth (w), xyz are
+ * temporaries. If not written,
+ * interpolated depth is used?
+ */
+#define REG_TYPE_U 6 /* unpreserved temporaries */
#define REG_TYPE_MASK 0x7
#define REG_NR_MASK 0xf
-
/* REG_TYPE_T:
*/
#define T_TEX0 0
@@ -552,29 +529,29 @@
/* Arithmetic instructions */
/* .replicate_swizzle == selection and replication of a particular
- * scalar channel, ie., .xxxx, .yyyy, .zzzz or .wwww
+ * scalar channel, ie., .xxxx, .yyyy, .zzzz or .wwww
*/
-#define A0_NOP (0x0<<24) /* no operation */
-#define A0_ADD (0x1<<24) /* dst = src0 + src1 */
-#define A0_MOV (0x2<<24) /* dst = src0 */
-#define A0_MUL (0x3<<24) /* dst = src0 * src1 */
-#define A0_MAD (0x4<<24) /* dst = src0 * src1 + src2 */
-#define A0_DP2ADD (0x5<<24) /* dst.xyzw = src0.xy dot src1.xy + src2.replicate_swizzle */
-#define A0_DP3 (0x6<<24) /* dst.xyzw = src0.xyz dot src1.xyz */
-#define A0_DP4 (0x7<<24) /* dst.xyzw = src0.xyzw dot src1.xyzw */
-#define A0_FRC (0x8<<24) /* dst = src0 - floor(src0) */
-#define A0_RCP (0x9<<24) /* dst.xyzw = 1/(src0.replicate_swizzle) */
-#define A0_RSQ (0xa<<24) /* dst.xyzw = 1/(sqrt(abs(src0.replicate_swizzle))) */
-#define A0_EXP (0xb<<24) /* dst.xyzw = exp2(src0.replicate_swizzle) */
-#define A0_LOG (0xc<<24) /* dst.xyzw = log2(abs(src0.replicate_swizzle)) */
-#define A0_CMP (0xd<<24) /* dst = (src0 >= 0.0) ? src1 : src2 */
-#define A0_MIN (0xe<<24) /* dst = (src0 < src1) ? src0 : src1 */
-#define A0_MAX (0xf<<24) /* dst = (src0 >= src1) ? src0 : src1 */
-#define A0_FLR (0x10<<24) /* dst = floor(src0) */
-#define A0_MOD (0x11<<24) /* dst = src0 fmod 1.0 */
-#define A0_TRC (0x12<<24) /* dst = int(src0) */
-#define A0_SGE (0x13<<24) /* dst = src0 >= src1 ? 1.0 : 0.0 */
-#define A0_SLT (0x14<<24) /* dst = src0 < src1 ? 1.0 : 0.0 */
+#define A0_NOP (0x0<<24) /* no operation */
+#define A0_ADD (0x1<<24) /* dst = src0 + src1 */
+#define A0_MOV (0x2<<24) /* dst = src0 */
+#define A0_MUL (0x3<<24) /* dst = src0 * src1 */
+#define A0_MAD (0x4<<24) /* dst = src0 * src1 + src2 */
+#define A0_DP2ADD (0x5<<24) /* dst.xyzw = src0.xy dot src1.xy + src2.replicate_swizzle */
+#define A0_DP3 (0x6<<24) /* dst.xyzw = src0.xyz dot src1.xyz */
+#define A0_DP4 (0x7<<24) /* dst.xyzw = src0.xyzw dot src1.xyzw */
+#define A0_FRC (0x8<<24) /* dst = src0 - floor(src0) */
+#define A0_RCP (0x9<<24) /* dst.xyzw = 1/(src0.replicate_swizzle) */
+#define A0_RSQ (0xa<<24) /* dst.xyzw = 1/(sqrt(abs(src0.replicate_swizzle))) */
+#define A0_EXP (0xb<<24) /* dst.xyzw = exp2(src0.replicate_swizzle) */
+#define A0_LOG (0xc<<24) /* dst.xyzw = log2(abs(src0.replicate_swizzle)) */
+#define A0_CMP (0xd<<24) /* dst = (src0 >= 0.0) ? src1 : src2 */
+#define A0_MIN (0xe<<24) /* dst = (src0 < src1) ? src0 : src1 */
+#define A0_MAX (0xf<<24) /* dst = (src0 >= src1) ? src0 : src1 */
+#define A0_FLR (0x10<<24) /* dst = floor(src0) */
+#define A0_MOD (0x11<<24) /* dst = src0 fmod 1.0 */
+#define A0_TRC (0x12<<24) /* dst = int(src0) */
+#define A0_SGE (0x13<<24) /* dst = src0 >= src1 ? 1.0 : 0.0 */
+#define A0_SLT (0x14<<24) /* dst = src0 < src1 ? 1.0 : 0.0 */
#define A0_DEST_SATURATE (1<<22)
#define A0_DEST_TYPE_SHIFT 19
/* Allow: R, OC, OD, U */
@@ -592,7 +569,6 @@
#define A0_DEST_CHANNEL_XY (A0_DEST_CHANNEL_X|A0_DEST_CHANNEL_Y)
#define A0_DEST_CHANNEL_XYZ (A0_DEST_CHANNEL_XY|A0_DEST_CHANNEL_Z)
-
#define SRC_X 0
#define SRC_Y 1
#define SRC_Z 2
@@ -630,8 +606,6 @@
#define A2_SRC2_CHANNEL_W_NEGATE (1<<3)
#define A2_SRC2_CHANNEL_W_SHIFT 0
-
-
/* Texture instructions */
#define T0_TEXLD (0x15<<24) /* Sample texture using predeclared
* sampler and address, and output
@@ -653,18 +627,18 @@
#define T0_DEST_TYPE_SHIFT 19
/* Allow: R, OC, OD, U */
/* Note: U (unpreserved) regs do not retain their values between
- * phases (cannot be used for feedback)
+ * phases (cannot be used for feedback)
*
* Note: oC and OD registers can only be used as the destination of a
* texture instruction once per phase (this is an implementation
- * restriction).
+ * restriction).
*/
#define T0_DEST_NR_SHIFT 14
/* Allow R: 0..15, OC,OD: 0..0, U: 0..2 */
-#define T0_SAMPLER_NR_SHIFT 0 /* This field ignored for TEXKILL */
+#define T0_SAMPLER_NR_SHIFT 0 /* This field ignored for TEXKILL */
#define T0_SAMPLER_NR_MASK (0xf<<0)
-#define T1_ADDRESS_REG_TYPE_SHIFT 24 /* Reg to use as texture coord */
+#define T1_ADDRESS_REG_TYPE_SHIFT 24 /* Reg to use as texture coord */
/* Allow R, T, OC, OD -- R, OC, OD are 'dependent' reads, new program phase */
#define T1_ADDRESS_REG_NR_SHIFT 17
#define T2_MBZ 0
@@ -694,17 +668,15 @@
#define D0_CHANNEL_XYZ (D0_CHANNEL_XY|D0_CHANNEL_Z)
/* I915 Errata: Do not allow (xz), (xw), (xzw) combinations for diffuse
- * or specular declarations.
+ * or specular declarations.
*
- * For T dcls, only allow: (x), (xy), (xyz), (w), (xyzw)
+ * For T dcls, only allow: (x), (xy), (xyz), (w), (xyzw)
*
* Must be zero for S (sampler) dcls
*/
#define D1_MBZ 0
#define D2_MBZ 0
-
-
/* p207.
* The DWORD count is 3 times the number of bits set in MS1_MAPMASK_MASK
*/
@@ -731,12 +703,12 @@
#define MAPSURF_4BIT_INDEXED (7<<7)
#define MS3_MT_FORMAT_MASK (0x7 << 3)
#define MS3_MT_FORMAT_SHIFT 3
-#define MT_4BIT_IDX_ARGB8888 (7<<3) /* SURFACE_4BIT_INDEXED */
-#define MT_8BIT_I8 (0<<3) /* SURFACE_8BIT */
+#define MT_4BIT_IDX_ARGB8888 (7<<3) /* SURFACE_4BIT_INDEXED */
+#define MT_8BIT_I8 (0<<3) /* SURFACE_8BIT */
#define MT_8BIT_L8 (1<<3)
#define MT_8BIT_A8 (4<<3)
#define MT_8BIT_MONO8 (5<<3)
-#define MT_16BIT_RGB565 (0<<3) /* SURFACE_16BIT */
+#define MT_16BIT_RGB565 (0<<3) /* SURFACE_16BIT */
#define MT_16BIT_ARGB1555 (1<<3)
#define MT_16BIT_ARGB4444 (2<<3)
#define MT_16BIT_AY88 (3<<3)
@@ -745,7 +717,7 @@
#define MT_16BIT_I16 (7<<3)
#define MT_16BIT_L16 (8<<3)
#define MT_16BIT_A16 (9<<3)
-#define MT_32BIT_ARGB8888 (0<<3) /* SURFACE_32BIT */
+#define MT_32BIT_ARGB8888 (0<<3) /* SURFACE_32BIT */
#define MT_32BIT_ABGR8888 (1<<3)
#define MT_32BIT_XRGB8888 (2<<3)
#define MT_32BIT_XBGR8888 (3<<3)
@@ -761,11 +733,11 @@
#define MT_32BIT_xI824 (0xD<<3)
#define MT_32BIT_xA824 (0xE<<3)
#define MT_32BIT_xL824 (0xF<<3)
-#define MT_422_YCRCB_SWAPY (0<<3) /* SURFACE_422 */
+#define MT_422_YCRCB_SWAPY (0<<3) /* SURFACE_422 */
#define MT_422_YCRCB_NORMAL (1<<3)
#define MT_422_YCRCB_SWAPUV (2<<3)
#define MT_422_YCRCB_SWAPUVY (3<<3)
-#define MT_COMPRESS_DXT1 (0<<3) /* SURFACE_COMPRESSED */
+#define MT_COMPRESS_DXT1 (0<<3) /* SURFACE_COMPRESSED */
#define MT_COMPRESS_DXT2_3 (1<<3)
#define MT_COMPRESS_DXT4_5 (2<<3)
#define MT_COMPRESS_FXT1 (3<<3)
@@ -788,7 +760,7 @@
#define MS4_MIP_LAYOUT_LEGACY (0<<8)
#define MS4_MIP_LAYOUT_BELOW_LPT (0<<8)
#define MS4_MIP_LAYOUT_RIGHT_LPT (1<<8)
-#define MS4_VOLUME_DEPTH_SHIFT 0
+#define MS4_VOLUME_DEPTH_SHIFT 0
#define MS4_VOLUME_DEPTH_MASK (0xff<<0)
/* p244.
@@ -818,7 +790,7 @@
#define FILTER_4X4_1 3
#define FILTER_4X4_2 4
#define FILTER_4X4_FLAT 5
-#define FILTER_6X5_MONO 6 /* XXX - check */
+#define FILTER_6X5_MONO 6 /* XXX - check */
#define SS2_MIN_FILTER_SHIFT 14
#define SS2_MIN_FILTER_MASK (0x7<<14)
#define SS2_LOD_BIAS_SHIFT 5
@@ -865,9 +837,7 @@
#define ST1_ENABLE (1<<16)
#define ST1_MASK (0xffff)
-
#define FLUSH_MAP_CACHE (1<<0)
#define FLUSH_RENDER_CACHE (1<<1)
-
#endif
diff --git a/src/i915_render.c b/src/i915_render.c
index a4c27688..5a578ab0 100644
--- a/src/i915_render.c
+++ b/src/i915_render.c
@@ -36,280 +36,283 @@
#include "i915_3d.h"
struct formatinfo {
- int fmt;
- uint32_t card_fmt;
+ int fmt;
+ uint32_t card_fmt;
};
struct blendinfo {
- Bool dst_alpha;
- Bool src_alpha;
- uint32_t src_blend;
- uint32_t dst_blend;
+ Bool dst_alpha;
+ Bool src_alpha;
+ uint32_t src_blend;
+ uint32_t dst_blend;
};
static struct blendinfo i915_blend_op[] = {
- /* Clear */
- {0, 0, BLENDFACT_ZERO, BLENDFACT_ZERO},
- /* Src */
- {0, 0, BLENDFACT_ONE, BLENDFACT_ZERO},
- /* Dst */
- {0, 0, BLENDFACT_ZERO, BLENDFACT_ONE},
- /* Over */
- {0, 1, BLENDFACT_ONE, BLENDFACT_INV_SRC_ALPHA},
- /* OverReverse */
- {1, 0, BLENDFACT_INV_DST_ALPHA, BLENDFACT_ONE},
- /* In */
- {1, 0, BLENDFACT_DST_ALPHA, BLENDFACT_ZERO},
- /* InReverse */
- {0, 1, BLENDFACT_ZERO, BLENDFACT_SRC_ALPHA},
- /* Out */
- {1, 0, BLENDFACT_INV_DST_ALPHA, BLENDFACT_ZERO},
- /* OutReverse */
- {0, 1, BLENDFACT_ZERO, BLENDFACT_INV_SRC_ALPHA},
- /* Atop */
- {1, 1, BLENDFACT_DST_ALPHA, BLENDFACT_INV_SRC_ALPHA},
- /* AtopReverse */
- {1, 1, BLENDFACT_INV_DST_ALPHA, BLENDFACT_SRC_ALPHA},
- /* Xor */
- {1, 1, BLENDFACT_INV_DST_ALPHA, BLENDFACT_INV_SRC_ALPHA},
- /* Add */
- {0, 0, BLENDFACT_ONE, BLENDFACT_ONE},
+ /* Clear */
+ {0, 0, BLENDFACT_ZERO, BLENDFACT_ZERO},
+ /* Src */
+ {0, 0, BLENDFACT_ONE, BLENDFACT_ZERO},
+ /* Dst */
+ {0, 0, BLENDFACT_ZERO, BLENDFACT_ONE},
+ /* Over */
+ {0, 1, BLENDFACT_ONE, BLENDFACT_INV_SRC_ALPHA},
+ /* OverReverse */
+ {1, 0, BLENDFACT_INV_DST_ALPHA, BLENDFACT_ONE},
+ /* In */
+ {1, 0, BLENDFACT_DST_ALPHA, BLENDFACT_ZERO},
+ /* InReverse */
+ {0, 1, BLENDFACT_ZERO, BLENDFACT_SRC_ALPHA},
+ /* Out */
+ {1, 0, BLENDFACT_INV_DST_ALPHA, BLENDFACT_ZERO},
+ /* OutReverse */
+ {0, 1, BLENDFACT_ZERO, BLENDFACT_INV_SRC_ALPHA},
+ /* Atop */
+ {1, 1, BLENDFACT_DST_ALPHA, BLENDFACT_INV_SRC_ALPHA},
+ /* AtopReverse */
+ {1, 1, BLENDFACT_INV_DST_ALPHA, BLENDFACT_SRC_ALPHA},
+ /* Xor */
+ {1, 1, BLENDFACT_INV_DST_ALPHA, BLENDFACT_INV_SRC_ALPHA},
+ /* Add */
+ {0, 0, BLENDFACT_ONE, BLENDFACT_ONE},
};
static struct formatinfo i915_tex_formats[] = {
- {PICT_a8r8g8b8, MAPSURF_32BIT | MT_32BIT_ARGB8888 },
- {PICT_x8r8g8b8, MAPSURF_32BIT | MT_32BIT_XRGB8888 },
- {PICT_a8b8g8r8, MAPSURF_32BIT | MT_32BIT_ABGR8888 },
- {PICT_x8b8g8r8, MAPSURF_32BIT | MT_32BIT_XBGR8888 },
- {PICT_r5g6b5, MAPSURF_16BIT | MT_16BIT_RGB565 },
- {PICT_a1r5g5b5, MAPSURF_16BIT | MT_16BIT_ARGB1555 },
- {PICT_x1r5g5b5, MAPSURF_16BIT | MT_16BIT_ARGB1555 },
- {PICT_a4r4g4b4, MAPSURF_16BIT | MT_16BIT_ARGB4444 },
- {PICT_x4r4g4b4, MAPSURF_16BIT | MT_16BIT_ARGB4444 },
- {PICT_a8, MAPSURF_8BIT | MT_8BIT_A8 },
+ {PICT_a8r8g8b8, MAPSURF_32BIT | MT_32BIT_ARGB8888},
+ {PICT_x8r8g8b8, MAPSURF_32BIT | MT_32BIT_XRGB8888},
+ {PICT_a8b8g8r8, MAPSURF_32BIT | MT_32BIT_ABGR8888},
+ {PICT_x8b8g8r8, MAPSURF_32BIT | MT_32BIT_XBGR8888},
+ {PICT_r5g6b5, MAPSURF_16BIT | MT_16BIT_RGB565},
+ {PICT_a1r5g5b5, MAPSURF_16BIT | MT_16BIT_ARGB1555},
+ {PICT_x1r5g5b5, MAPSURF_16BIT | MT_16BIT_ARGB1555},
+ {PICT_a4r4g4b4, MAPSURF_16BIT | MT_16BIT_ARGB4444},
+ {PICT_x4r4g4b4, MAPSURF_16BIT | MT_16BIT_ARGB4444},
+ {PICT_a8, MAPSURF_8BIT | MT_8BIT_A8},
};
static uint32_t i915_get_blend_cntl(int op, PicturePtr pMask,
uint32_t dst_format)
{
- uint32_t sblend, dblend;
-
- sblend = i915_blend_op[op].src_blend;
- dblend = i915_blend_op[op].dst_blend;
-
- /* If there's no dst alpha channel, adjust the blend op so that we'll treat
- * it as always 1.
- */
- if (PICT_FORMAT_A(dst_format) == 0 && i915_blend_op[op].dst_alpha) {
- if (sblend == BLENDFACT_DST_ALPHA)
- sblend = BLENDFACT_ONE;
- else if (sblend == BLENDFACT_INV_DST_ALPHA)
- sblend = BLENDFACT_ZERO;
- }
-
- /* i915 engine reads 8bit color buffer into green channel in cases
- like color buffer blending .etc, and also writes back green channel.
- So with dst_alpha blend we should use color factor. See spec on
- "8-bit rendering" */
- if ((dst_format == PICT_a8) && i915_blend_op[op].dst_alpha) {
- if (sblend == BLENDFACT_DST_ALPHA)
- sblend = BLENDFACT_DST_COLR;
- else if (sblend == BLENDFACT_INV_DST_ALPHA)
- sblend = BLENDFACT_INV_DST_COLR;
- }
-
- /* If the source alpha is being used, then we should only be in a case
- * where the source blend factor is 0, and the source blend value is the
- * mask channels multiplied by the source picture's alpha.
- */
- if (pMask && pMask->componentAlpha && PICT_FORMAT_RGB(pMask->format) &&
- i915_blend_op[op].src_alpha)
- {
- if (dblend == BLENDFACT_SRC_ALPHA) {
- dblend = BLENDFACT_SRC_COLR;
- } else if (dblend == BLENDFACT_INV_SRC_ALPHA) {
- dblend = BLENDFACT_INV_SRC_COLR;
- }
- }
-
- return (sblend << S6_CBUF_SRC_BLEND_FACT_SHIFT) |
- (dblend << S6_CBUF_DST_BLEND_FACT_SHIFT);
+ uint32_t sblend, dblend;
+
+ sblend = i915_blend_op[op].src_blend;
+ dblend = i915_blend_op[op].dst_blend;
+
+ /* If there's no dst alpha channel, adjust the blend op so that we'll
+ * treat it as always 1.
+ */
+ if (PICT_FORMAT_A(dst_format) == 0 && i915_blend_op[op].dst_alpha) {
+ if (sblend == BLENDFACT_DST_ALPHA)
+ sblend = BLENDFACT_ONE;
+ else if (sblend == BLENDFACT_INV_DST_ALPHA)
+ sblend = BLENDFACT_ZERO;
+ }
+
+ /* i915 engine reads 8bit color buffer into green channel in cases
+ like color buffer blending .etc, and also writes back green channel.
+ So with dst_alpha blend we should use color factor. See spec on
+ "8-bit rendering" */
+ if ((dst_format == PICT_a8) && i915_blend_op[op].dst_alpha) {
+ if (sblend == BLENDFACT_DST_ALPHA)
+ sblend = BLENDFACT_DST_COLR;
+ else if (sblend == BLENDFACT_INV_DST_ALPHA)
+ sblend = BLENDFACT_INV_DST_COLR;
+ }
+
+ /* If the source alpha is being used, then we should only be in a case
+ * where the source blend factor is 0, and the source blend value is the
+ * mask channels multiplied by the source picture's alpha.
+ */
+ if (pMask && pMask->componentAlpha && PICT_FORMAT_RGB(pMask->format) &&
+ i915_blend_op[op].src_alpha) {
+ if (dblend == BLENDFACT_SRC_ALPHA) {
+ dblend = BLENDFACT_SRC_COLR;
+ } else if (dblend == BLENDFACT_INV_SRC_ALPHA) {
+ dblend = BLENDFACT_INV_SRC_COLR;
+ }
+ }
+
+ return (sblend << S6_CBUF_SRC_BLEND_FACT_SHIFT) |
+ (dblend << S6_CBUF_DST_BLEND_FACT_SHIFT);
}
-static Bool i915_get_dest_format(PicturePtr pDstPicture, uint32_t *dst_format)
+static Bool i915_get_dest_format(PicturePtr pDstPicture, uint32_t * dst_format)
{
- switch (pDstPicture->format) {
- case PICT_a8r8g8b8:
- case PICT_x8r8g8b8:
- *dst_format = COLR_BUF_ARGB8888;
- break;
- case PICT_r5g6b5:
- *dst_format = COLR_BUF_RGB565;
- break;
- case PICT_a1r5g5b5:
- case PICT_x1r5g5b5:
- *dst_format = COLR_BUF_ARGB1555;
- break;
- case PICT_a8:
- *dst_format = COLR_BUF_8BIT;
- break;
- case PICT_a4r4g4b4:
- case PICT_x4r4g4b4:
- *dst_format = COLR_BUF_ARGB4444;
- break;
- default:
- {
- ScrnInfoPtr pScrn;
+ switch (pDstPicture->format) {
+ case PICT_a8r8g8b8:
+ case PICT_x8r8g8b8:
+ *dst_format = COLR_BUF_ARGB8888;
+ break;
+ case PICT_r5g6b5:
+ *dst_format = COLR_BUF_RGB565;
+ break;
+ case PICT_a1r5g5b5:
+ case PICT_x1r5g5b5:
+ *dst_format = COLR_BUF_ARGB1555;
+ break;
+ case PICT_a8:
+ *dst_format = COLR_BUF_8BIT;
+ break;
+ case PICT_a4r4g4b4:
+ case PICT_x4r4g4b4:
+ *dst_format = COLR_BUF_ARGB4444;
+ break;
+ default:
+ {
+ ScrnInfoPtr pScrn;
+
+ pScrn =
+ xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
+ I830FALLBACK("Unsupported dest format 0x%x\n",
+ (int)pDstPicture->format);
+ }
+ }
+ return TRUE;
+}
- pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
- I830FALLBACK("Unsupported dest format 0x%x\n",
- (int)pDstPicture->format);
+static Bool i915_check_composite_texture(ScrnInfoPtr pScrn, PicturePtr pPict,
+ int unit)
+{
+ if (pPict->repeatType > RepeatReflect)
+ I830FALLBACK("Unsupported picture repeat %d\n",
+ pPict->repeatType);
+
+ if (pPict->filter != PictFilterNearest &&
+ pPict->filter != PictFilterBilinear)
+ I830FALLBACK("Unsupported filter 0x%x\n", pPict->filter);
+
+ if (pPict->pDrawable) {
+ int w, h, i;
+
+ w = pPict->pDrawable->width;
+ h = pPict->pDrawable->height;
+ if ((w > 2048) || (h > 2048))
+ I830FALLBACK("Picture w/h too large (%dx%d)\n", w, h);
+
+ for (i = 0;
+ i < sizeof(i915_tex_formats) / sizeof(i915_tex_formats[0]);
+ i++) {
+ if (i915_tex_formats[i].fmt == pPict->format)
+ break;
+ }
+ if (i == sizeof(i915_tex_formats) / sizeof(i915_tex_formats[0]))
+ I830FALLBACK("Unsupported picture format 0x%x\n",
+ (int)pPict->format);
}
- }
- return TRUE;
+
+ return TRUE;
}
-static Bool i915_check_composite_texture(ScrnInfoPtr pScrn, PicturePtr pPict, int unit)
+Bool
+i915_check_composite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
+ PicturePtr pDstPicture)
{
- if (pPict->repeatType > RepeatReflect)
- I830FALLBACK("Unsupported picture repeat %d\n", pPict->repeatType);
+ ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
+ uint32_t tmp1;
+
+ /* Check for unsupported compositing operations. */
+ if (op >= sizeof(i915_blend_op) / sizeof(i915_blend_op[0]))
+ I830FALLBACK("Unsupported Composite op 0x%x\n", op);
+ if (pMaskPicture != NULL && pMaskPicture->componentAlpha &&
+ PICT_FORMAT_RGB(pMaskPicture->format)) {
+ /* Check if it's component alpha that relies on a source alpha
+ * and on the source value. We can only get one of those
+ * into the single source value that we get to blend with.
+ */
+ if (i915_blend_op[op].src_alpha &&
+ (i915_blend_op[op].src_blend != BLENDFACT_ZERO))
+ I830FALLBACK("Component alpha not supported with "
+ "source alpha and source value "
+ "blending.\n");
+ }
+
+ if (!i915_check_composite_texture(pScrn, pSrcPicture, 0))
+ I830FALLBACK("Check Src picture texture\n");
+ if (pMaskPicture != NULL
+ && !i915_check_composite_texture(pScrn, pMaskPicture, 1))
+ I830FALLBACK("Check Mask picture texture\n");
- if (pPict->filter != PictFilterNearest &&
- pPict->filter != PictFilterBilinear)
- I830FALLBACK("Unsupported filter 0x%x\n", pPict->filter);
+ if (!i915_get_dest_format(pDstPicture, &tmp1))
+ I830FALLBACK("Get Color buffer format\n");
- if (pPict->pDrawable)
- {
+ return TRUE;
+}
+
+static Bool i915_texture_setup(PicturePtr pPict, PixmapPtr pPix, int unit)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pPict->pDrawable->pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ uint32_t format, pitch, filter;
int w, h, i;
+ uint32_t wrap_mode;
+ pitch = intel_get_pixmap_pitch(pPix);
w = pPict->pDrawable->width;
h = pPict->pDrawable->height;
- if ((w > 2048) || (h > 2048))
- I830FALLBACK("Picture w/h too large (%dx%d)\n", w, h);
+ pI830->scale_units[unit][0] = pPix->drawable.width;
+ pI830->scale_units[unit][1] = pPix->drawable.height;
for (i = 0; i < sizeof(i915_tex_formats) / sizeof(i915_tex_formats[0]);
- i++)
- {
- if (i915_tex_formats[i].fmt == pPict->format)
- break;
+ i++) {
+ if (i915_tex_formats[i].fmt == pPict->format)
+ break;
}
if (i == sizeof(i915_tex_formats) / sizeof(i915_tex_formats[0]))
- I830FALLBACK("Unsupported picture format 0x%x\n",
- (int)pPict->format);
- }
+ I830FALLBACK("unknown texture format\n");
+ format = i915_tex_formats[i].card_fmt;
- return TRUE;
-}
+ switch (pPict->repeatType) {
+ case RepeatNone:
+ wrap_mode = TEXCOORDMODE_CLAMP_BORDER;
+ break;
+ case RepeatNormal:
+ wrap_mode = TEXCOORDMODE_WRAP;
+ break;
+ case RepeatPad:
+ wrap_mode = TEXCOORDMODE_CLAMP_EDGE;
+ break;
+ case RepeatReflect:
+ wrap_mode = TEXCOORDMODE_MIRROR;
+ break;
+ default:
+ FatalError("Unknown repeat type %d\n", pPict->repeatType);
+ }
-Bool
-i915_check_composite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
- PicturePtr pDstPicture)
-{
- ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
- uint32_t tmp1;
-
- /* Check for unsupported compositing operations. */
- if (op >= sizeof(i915_blend_op) / sizeof(i915_blend_op[0]))
- I830FALLBACK("Unsupported Composite op 0x%x\n", op);
- if (pMaskPicture != NULL && pMaskPicture->componentAlpha &&
- PICT_FORMAT_RGB(pMaskPicture->format))
- {
- /* Check if it's component alpha that relies on a source alpha and on
- * the source value. We can only get one of those into the single
- * source value that we get to blend with.
- */
- if (i915_blend_op[op].src_alpha &&
- (i915_blend_op[op].src_blend != BLENDFACT_ZERO))
- I830FALLBACK("Component alpha not supported with source "
- "alpha and source value blending.\n");
- }
-
- if (!i915_check_composite_texture(pScrn, pSrcPicture, 0))
- I830FALLBACK("Check Src picture texture\n");
- if (pMaskPicture != NULL && !i915_check_composite_texture(pScrn, pMaskPicture, 1))
- I830FALLBACK("Check Mask picture texture\n");
-
- if (!i915_get_dest_format(pDstPicture, &tmp1))
- I830FALLBACK("Get Color buffer format\n");
-
- return TRUE;
-}
+ switch (pPict->filter) {
+ case PictFilterNearest:
+ filter = (FILTER_NEAREST << SS2_MAG_FILTER_SHIFT) |
+ (FILTER_NEAREST << SS2_MIN_FILTER_SHIFT);
+ break;
+ case PictFilterBilinear:
+ filter = (FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
+ (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT);
+ break;
+ default:
+ filter = 0;
+ I830FALLBACK("Bad filter 0x%x\n", pPict->filter);
+ }
-static Bool
-i915_texture_setup(PicturePtr pPict, PixmapPtr pPix, int unit)
-{
- ScrnInfoPtr pScrn = xf86Screens[pPict->pDrawable->pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- uint32_t format, pitch, filter;
- int w, h, i;
- uint32_t wrap_mode;
-
- pitch = intel_get_pixmap_pitch(pPix);
- w = pPict->pDrawable->width;
- h = pPict->pDrawable->height;
- pI830->scale_units[unit][0] = pPix->drawable.width;
- pI830->scale_units[unit][1] = pPix->drawable.height;
-
- for (i = 0; i < sizeof(i915_tex_formats) / sizeof(i915_tex_formats[0]);
- i++)
- {
- if (i915_tex_formats[i].fmt == pPict->format)
- break;
- }
- if (i == sizeof(i915_tex_formats)/ sizeof(i915_tex_formats[0]))
- I830FALLBACK("unknown texture format\n");
- format = i915_tex_formats[i].card_fmt;
-
- switch (pPict->repeatType) {
- case RepeatNone:
- wrap_mode = TEXCOORDMODE_CLAMP_BORDER;
- break;
- case RepeatNormal:
- wrap_mode = TEXCOORDMODE_WRAP;
- break;
- case RepeatPad:
- wrap_mode = TEXCOORDMODE_CLAMP_EDGE;
- break;
- case RepeatReflect:
- wrap_mode = TEXCOORDMODE_MIRROR;
- break;
- default:
- FatalError("Unknown repeat type %d\n", pPict->repeatType);
- }
-
- switch (pPict->filter) {
- case PictFilterNearest:
- filter = (FILTER_NEAREST << SS2_MAG_FILTER_SHIFT) |
- (FILTER_NEAREST << SS2_MIN_FILTER_SHIFT);
- break;
- case PictFilterBilinear:
- filter = (FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
- (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT);
- break;
- default:
- filter = 0;
- I830FALLBACK("Bad filter 0x%x\n", pPict->filter);
- }
-
- pI830->mapstate[unit * 3 + 0] = 0; /* offset filled in at emit time */
- pI830->mapstate[unit * 3 + 1] = format |
- MS3_USE_FENCE_REGS |
- ((pPix->drawable.height - 1) << MS3_HEIGHT_SHIFT) |
- ((pPix->drawable.width - 1) << MS3_WIDTH_SHIFT);
- pI830->mapstate[unit * 3 + 2] = ((pitch / 4) - 1) << MS4_PITCH_SHIFT;
-
- pI830->samplerstate[unit * 3 + 0] = (MIPFILTER_NONE <<
- SS2_MIP_FILTER_SHIFT);
- pI830->samplerstate[unit * 3 + 0] |= filter;
- pI830->samplerstate[unit * 3 + 1] = SS3_NORMALIZED_COORDS;
- pI830->samplerstate[unit * 3 + 1] |= wrap_mode << SS3_TCX_ADDR_MODE_SHIFT;
- pI830->samplerstate[unit * 3 + 1] |= wrap_mode << SS3_TCY_ADDR_MODE_SHIFT;
- pI830->samplerstate[unit * 3 + 1] |= unit << SS3_TEXTUREMAP_INDEX_SHIFT;
- pI830->samplerstate[unit * 3 + 2] = 0x00000000; /* border color */
-
- pI830->transform[unit] = pPict->transform;
-
- return TRUE;
+ /* offset filled in at emit time */
+ pI830->mapstate[unit * 3 + 0] = 0;
+ pI830->mapstate[unit * 3 + 1] = format |
+ MS3_USE_FENCE_REGS |
+ ((pPix->drawable.height - 1) << MS3_HEIGHT_SHIFT) |
+ ((pPix->drawable.width - 1) << MS3_WIDTH_SHIFT);
+ pI830->mapstate[unit * 3 + 2] = ((pitch / 4) - 1) << MS4_PITCH_SHIFT;
+
+ pI830->samplerstate[unit * 3 + 0] = (MIPFILTER_NONE <<
+ SS2_MIP_FILTER_SHIFT);
+ pI830->samplerstate[unit * 3 + 0] |= filter;
+ pI830->samplerstate[unit * 3 + 1] = SS3_NORMALIZED_COORDS;
+ pI830->samplerstate[unit * 3 + 1] |=
+ wrap_mode << SS3_TCX_ADDR_MODE_SHIFT;
+ pI830->samplerstate[unit * 3 + 1] |=
+ wrap_mode << SS3_TCY_ADDR_MODE_SHIFT;
+ pI830->samplerstate[unit * 3 + 1] |= unit << SS3_TEXTUREMAP_INDEX_SHIFT;
+ pI830->samplerstate[unit * 3 + 2] = 0x00000000; /* border color */
+
+ pI830->transform[unit] = pPict->transform;
+
+ return TRUE;
}
Bool
@@ -317,237 +320,245 @@ i915_prepare_composite(int op, PicturePtr pSrcPicture,
PicturePtr pMaskPicture, PicturePtr pDstPicture,
PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst)
{
- ScrnInfoPtr pScrn = xf86Screens[pSrcPicture->pDrawable->pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- drm_intel_bo *bo_table[] = {
- NULL, /* batch_bo */
- i830_get_pixmap_bo(pSrc),
- pMask ? i830_get_pixmap_bo(pMask) : NULL,
- i830_get_pixmap_bo(pDst),
- };
-
- pI830->render_src_picture = pSrcPicture;
- pI830->render_src = pSrc;
- pI830->render_mask_picture = pMaskPicture;
- pI830->render_mask = pMask;
- pI830->render_dst_picture = pDstPicture;
- pI830->render_dst = pDst;
-
- i830_exa_check_pitch_3d(pSrc);
- if (pMask)
- i830_exa_check_pitch_3d(pMask);
- i830_exa_check_pitch_3d(pDst);
-
- if (!i915_get_dest_format(pDstPicture,
- &pI830->i915_render_state.dst_format))
- return FALSE;
-
- if (!i830_get_aperture_space(pScrn, bo_table, ARRAY_SIZE(bo_table)))
- return FALSE;
-
- if (!i915_texture_setup(pSrcPicture, pSrc, 0))
- I830FALLBACK("fail to setup src texture\n");
-
- pI830->dst_coord_adjust = 0;
- pI830->src_coord_adjust = 0;
- pI830->mask_coord_adjust = 0;
- if (pSrcPicture->filter == PictFilterNearest)
- pI830->dst_coord_adjust = -0.125;
- if (pMask != NULL) {
- if (!i915_texture_setup(pMaskPicture, pMask, 1))
- I830FALLBACK("fail to setup mask texture\n");
-
- if (pMaskPicture->filter == PictFilterNearest)
- pI830->dst_coord_adjust = -0.125;
- } else {
- pI830->transform[1] = NULL;
- pI830->scale_units[1][0] = -1;
- pI830->scale_units[1][1] = -1;
- }
-
- pI830->i915_render_state.op = op;
- pI830->i915_render_state.needs_emit = TRUE;
-
- return TRUE;
+ ScrnInfoPtr pScrn = xf86Screens[pSrcPicture->pDrawable->pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ drm_intel_bo *bo_table[] = {
+ NULL, /* batch_bo */
+ i830_get_pixmap_bo(pSrc),
+ pMask ? i830_get_pixmap_bo(pMask) : NULL,
+ i830_get_pixmap_bo(pDst),
+ };
+
+ pI830->render_src_picture = pSrcPicture;
+ pI830->render_src = pSrc;
+ pI830->render_mask_picture = pMaskPicture;
+ pI830->render_mask = pMask;
+ pI830->render_dst_picture = pDstPicture;
+ pI830->render_dst = pDst;
+
+ i830_exa_check_pitch_3d(pSrc);
+ if (pMask)
+ i830_exa_check_pitch_3d(pMask);
+ i830_exa_check_pitch_3d(pDst);
+
+ if (!i915_get_dest_format(pDstPicture,
+ &pI830->i915_render_state.dst_format))
+ return FALSE;
+
+ if (!i830_get_aperture_space(pScrn, bo_table, ARRAY_SIZE(bo_table)))
+ return FALSE;
+
+ if (!i915_texture_setup(pSrcPicture, pSrc, 0))
+ I830FALLBACK("fail to setup src texture\n");
+
+ pI830->dst_coord_adjust = 0;
+ pI830->src_coord_adjust = 0;
+ pI830->mask_coord_adjust = 0;
+ if (pSrcPicture->filter == PictFilterNearest)
+ pI830->dst_coord_adjust = -0.125;
+ if (pMask != NULL) {
+ if (!i915_texture_setup(pMaskPicture, pMask, 1))
+ I830FALLBACK("fail to setup mask texture\n");
+
+ if (pMaskPicture->filter == PictFilterNearest)
+ pI830->dst_coord_adjust = -0.125;
+ } else {
+ pI830->transform[1] = NULL;
+ pI830->scale_units[1][0] = -1;
+ pI830->scale_units[1][1] = -1;
+ }
+
+ pI830->i915_render_state.op = op;
+ pI830->i915_render_state.needs_emit = TRUE;
+
+ return TRUE;
}
-static void
-i915_emit_composite_setup(ScrnInfoPtr pScrn)
+static void i915_emit_composite_setup(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int op = pI830->i915_render_state.op;
- PicturePtr pSrcPicture = pI830->render_src_picture;
- PicturePtr pMaskPicture = pI830->render_mask_picture;
- PicturePtr pDstPicture = pI830->render_dst_picture;
- PixmapPtr pSrc = pI830->render_src;
- PixmapPtr pMask = pI830->render_mask;
- PixmapPtr pDst = pI830->render_dst;
- uint32_t dst_format = pI830->i915_render_state.dst_format, dst_pitch;
- uint32_t blendctl;
- int out_reg = FS_OC;
- FS_LOCALS(20);
- Bool is_affine_src, is_affine_mask;
-
- pI830->i915_render_state.needs_emit = FALSE;
-
- IntelEmitInvarientState(pScrn);
- pI830->last_3d = LAST_3D_RENDER;
-
- dst_pitch = intel_get_pixmap_pitch(pDst);
-
- is_affine_src = i830_transform_is_affine (pI830->transform[0]);
- is_affine_mask = i830_transform_is_affine (pI830->transform[1]);
-
- if (pMask == NULL) {
- BEGIN_BATCH(10);
- OUT_BATCH(_3DSTATE_MAP_STATE | 3);
- OUT_BATCH(0x00000001); /* map 0 */
- OUT_RELOC_PIXMAP(pSrc, I915_GEM_DOMAIN_SAMPLER, 0, 0);
- OUT_BATCH(pI830->mapstate[1]);
- OUT_BATCH(pI830->mapstate[2]);
-
- OUT_BATCH(_3DSTATE_SAMPLER_STATE | 3);
- OUT_BATCH(0x00000001); /* sampler 0 */
- OUT_BATCH(pI830->samplerstate[0]);
- OUT_BATCH(pI830->samplerstate[1]);
- OUT_BATCH(pI830->samplerstate[2]);
- ADVANCE_BATCH();
- } else {
- BEGIN_BATCH(16);
- OUT_BATCH(_3DSTATE_MAP_STATE | 6);
- OUT_BATCH(0x00000003); /* map 0,1 */
- OUT_RELOC_PIXMAP(pSrc, I915_GEM_DOMAIN_SAMPLER, 0, 0);
- OUT_BATCH(pI830->mapstate[1]);
- OUT_BATCH(pI830->mapstate[2]);
- OUT_RELOC_PIXMAP(pMask, I915_GEM_DOMAIN_SAMPLER, 0, 0);
- OUT_BATCH(pI830->mapstate[4]);
- OUT_BATCH(pI830->mapstate[5]);
-
- OUT_BATCH(_3DSTATE_SAMPLER_STATE | 6);
- OUT_BATCH(0x00000003); /* sampler 0,1 */
- OUT_BATCH(pI830->samplerstate[0]);
- OUT_BATCH(pI830->samplerstate[1]);
- OUT_BATCH(pI830->samplerstate[2]);
- OUT_BATCH(pI830->samplerstate[3]);
- OUT_BATCH(pI830->samplerstate[4]);
- OUT_BATCH(pI830->samplerstate[5]);
- ADVANCE_BATCH();
- }
- {
- uint32_t ss2;
-
- BEGIN_BATCH(16);
- OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
- OUT_BATCH(BUF_3D_ID_COLOR_BACK| BUF_3D_USE_FENCE|
- BUF_3D_PITCH(dst_pitch));
- OUT_RELOC_PIXMAP(pDst, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
-
- OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
- OUT_BATCH(dst_format);
-
- OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(2) |
- I1_LOAD_S(4) | I1_LOAD_S(5) | I1_LOAD_S(6) | 3);
- ss2 = S2_TEXCOORD_FMT(0, is_affine_src ? TEXCOORDFMT_2D : TEXCOORDFMT_4D);
- if (pMask)
- ss2 |= S2_TEXCOORD_FMT(1, is_affine_mask ? TEXCOORDFMT_2D : TEXCOORDFMT_4D);
- else
- ss2 |= S2_TEXCOORD_FMT(1, TEXCOORDFMT_NOT_PRESENT);
- ss2 |= S2_TEXCOORD_FMT(2, TEXCOORDFMT_NOT_PRESENT);
- ss2 |= S2_TEXCOORD_FMT(3, TEXCOORDFMT_NOT_PRESENT);
- ss2 |= S2_TEXCOORD_FMT(4, TEXCOORDFMT_NOT_PRESENT);
- ss2 |= S2_TEXCOORD_FMT(5, TEXCOORDFMT_NOT_PRESENT);
- ss2 |= S2_TEXCOORD_FMT(6, TEXCOORDFMT_NOT_PRESENT);
- ss2 |= S2_TEXCOORD_FMT(7, TEXCOORDFMT_NOT_PRESENT);
- OUT_BATCH(ss2);
- OUT_BATCH((1 << S4_POINT_WIDTH_SHIFT) | S4_LINE_WIDTH_ONE |
- S4_CULLMODE_NONE| S4_VFMT_XY);
- blendctl = i915_get_blend_cntl(op, pMaskPicture, pDstPicture->format);
- OUT_BATCH(0x00000000); /* Disable stencil buffer */
- OUT_BATCH(S6_CBUF_BLEND_ENABLE | S6_COLOR_WRITE_ENABLE |
- (BLENDFUNC_ADD << S6_CBUF_BLEND_FUNC_SHIFT) | blendctl);
-
- /* draw rect is unconditional */
- OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
- OUT_BATCH(0x00000000);
- OUT_BATCH(0x00000000); /* ymin, xmin*/
- OUT_BATCH(DRAW_YMAX(pDst->drawable.height - 1) |
- DRAW_XMAX(pDst->drawable.width - 1));
- OUT_BATCH(0x00000000); /* yorig, xorig (relate to color buffer?)*/
- OUT_BATCH(MI_NOOP);
- ADVANCE_BATCH();
- }
-
- if (dst_format == COLR_BUF_8BIT)
- out_reg = FS_U0;
-
- FS_BEGIN();
-
- /* Declare the registers necessary for our program. I don't think the
- * S then T ordering is necessary.
- */
- i915_fs_dcl(FS_S0);
- if (pMask)
- i915_fs_dcl(FS_S1);
- i915_fs_dcl(FS_T0);
- if (pMask)
- i915_fs_dcl(FS_T1);
-
- /* Load the pSrcPicture texel */
- if (is_affine_src) {
- i915_fs_texld(FS_R0, FS_S0, FS_T0);
- } else {
- i915_fs_texldp(FS_R0, FS_S0, FS_T0);
- }
-
- /* If the texture lacks an alpha channel, force the alpha to 1. */
- if (PICT_FORMAT_A(pSrcPicture->format) == 0)
- i915_fs_mov_masked(FS_R0, MASK_W, i915_fs_operand_one());
-
- if (!pMask) {
- /* No mask, so move to output color */
- i915_fs_mov(out_reg, i915_fs_operand_reg(FS_R0));
- } else {
- /* Load the pMaskPicture texel */
- if (is_affine_mask) {
- i915_fs_texld(FS_R1, FS_S1, FS_T1);
+ I830Ptr pI830 = I830PTR(pScrn);
+ int op = pI830->i915_render_state.op;
+ PicturePtr pSrcPicture = pI830->render_src_picture;
+ PicturePtr pMaskPicture = pI830->render_mask_picture;
+ PicturePtr pDstPicture = pI830->render_dst_picture;
+ PixmapPtr pSrc = pI830->render_src;
+ PixmapPtr pMask = pI830->render_mask;
+ PixmapPtr pDst = pI830->render_dst;
+ uint32_t dst_format = pI830->i915_render_state.dst_format, dst_pitch;
+ uint32_t blendctl;
+ int out_reg = FS_OC;
+ FS_LOCALS(20);
+ Bool is_affine_src, is_affine_mask;
+
+ pI830->i915_render_state.needs_emit = FALSE;
+
+ IntelEmitInvarientState(pScrn);
+ pI830->last_3d = LAST_3D_RENDER;
+
+ dst_pitch = intel_get_pixmap_pitch(pDst);
+
+ is_affine_src = i830_transform_is_affine(pI830->transform[0]);
+ is_affine_mask = i830_transform_is_affine(pI830->transform[1]);
+
+ if (pMask == NULL) {
+ BEGIN_BATCH(10);
+ OUT_BATCH(_3DSTATE_MAP_STATE | 3);
+ OUT_BATCH(0x00000001); /* map 0 */
+ OUT_RELOC_PIXMAP(pSrc, I915_GEM_DOMAIN_SAMPLER, 0, 0);
+ OUT_BATCH(pI830->mapstate[1]);
+ OUT_BATCH(pI830->mapstate[2]);
+
+ OUT_BATCH(_3DSTATE_SAMPLER_STATE | 3);
+ OUT_BATCH(0x00000001); /* sampler 0 */
+ OUT_BATCH(pI830->samplerstate[0]);
+ OUT_BATCH(pI830->samplerstate[1]);
+ OUT_BATCH(pI830->samplerstate[2]);
+ ADVANCE_BATCH();
} else {
- i915_fs_texldp(FS_R1, FS_S1, FS_T1);
+ BEGIN_BATCH(16);
+ OUT_BATCH(_3DSTATE_MAP_STATE | 6);
+ OUT_BATCH(0x00000003); /* map 0,1 */
+ OUT_RELOC_PIXMAP(pSrc, I915_GEM_DOMAIN_SAMPLER, 0, 0);
+ OUT_BATCH(pI830->mapstate[1]);
+ OUT_BATCH(pI830->mapstate[2]);
+ OUT_RELOC_PIXMAP(pMask, I915_GEM_DOMAIN_SAMPLER, 0, 0);
+ OUT_BATCH(pI830->mapstate[4]);
+ OUT_BATCH(pI830->mapstate[5]);
+
+ OUT_BATCH(_3DSTATE_SAMPLER_STATE | 6);
+ OUT_BATCH(0x00000003); /* sampler 0,1 */
+ OUT_BATCH(pI830->samplerstate[0]);
+ OUT_BATCH(pI830->samplerstate[1]);
+ OUT_BATCH(pI830->samplerstate[2]);
+ OUT_BATCH(pI830->samplerstate[3]);
+ OUT_BATCH(pI830->samplerstate[4]);
+ OUT_BATCH(pI830->samplerstate[5]);
+ ADVANCE_BATCH();
}
- /* If the texture lacks an alpha channel, force the alpha to 1. */
- if (PICT_FORMAT_A(pMaskPicture->format) == 0)
- i915_fs_mov_masked(FS_R1, MASK_W, i915_fs_operand_one());
-
- /* If component alpha is active in the mask and the blend operation
- * uses the source alpha, then we know we don't need the source
- * value (otherwise we would have hit a fallback earlier), so we
- * provide the source alpha (src.A * mask.X) as output color.
- * Conversely, if CA is set and we don't need the source alpha, then
- * we produce the source value (src.X * mask.X) and the source alpha
- * is unused.. Otherwise, we provide the non-CA source value
- * (src.X * mask.A).
- */
- if (pMaskPicture->componentAlpha &&
- PICT_FORMAT_RGB(pMaskPicture->format))
{
- if (i915_blend_op[op].src_alpha) {
- i915_fs_mul(out_reg, i915_fs_operand(FS_R0, W, W, W, W),
- i915_fs_operand_reg(FS_R1));
- } else {
- i915_fs_mul(out_reg, i915_fs_operand_reg(FS_R0),
- i915_fs_operand_reg(FS_R1));
- }
+ uint32_t ss2;
+
+ BEGIN_BATCH(16);
+ OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
+ OUT_BATCH(BUF_3D_ID_COLOR_BACK | BUF_3D_USE_FENCE |
+ BUF_3D_PITCH(dst_pitch));
+ OUT_RELOC_PIXMAP(pDst, I915_GEM_DOMAIN_RENDER,
+ I915_GEM_DOMAIN_RENDER, 0);
+
+ OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
+ OUT_BATCH(dst_format);
+
+ OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(2) |
+ I1_LOAD_S(4) | I1_LOAD_S(5) | I1_LOAD_S(6) | 3);
+ ss2 = S2_TEXCOORD_FMT(0,
+ is_affine_src ? TEXCOORDFMT_2D :
+ TEXCOORDFMT_4D);
+ if (pMask)
+ ss2 |= S2_TEXCOORD_FMT(1,
+ is_affine_mask ? TEXCOORDFMT_2D :
+ TEXCOORDFMT_4D);
+ else
+ ss2 |= S2_TEXCOORD_FMT(1, TEXCOORDFMT_NOT_PRESENT);
+ ss2 |= S2_TEXCOORD_FMT(2, TEXCOORDFMT_NOT_PRESENT);
+ ss2 |= S2_TEXCOORD_FMT(3, TEXCOORDFMT_NOT_PRESENT);
+ ss2 |= S2_TEXCOORD_FMT(4, TEXCOORDFMT_NOT_PRESENT);
+ ss2 |= S2_TEXCOORD_FMT(5, TEXCOORDFMT_NOT_PRESENT);
+ ss2 |= S2_TEXCOORD_FMT(6, TEXCOORDFMT_NOT_PRESENT);
+ ss2 |= S2_TEXCOORD_FMT(7, TEXCOORDFMT_NOT_PRESENT);
+ OUT_BATCH(ss2);
+ OUT_BATCH((1 << S4_POINT_WIDTH_SHIFT) | S4_LINE_WIDTH_ONE |
+ S4_CULLMODE_NONE | S4_VFMT_XY);
+ blendctl =
+ i915_get_blend_cntl(op, pMaskPicture, pDstPicture->format);
+ OUT_BATCH(0x00000000); /* Disable stencil buffer */
+ OUT_BATCH(S6_CBUF_BLEND_ENABLE | S6_COLOR_WRITE_ENABLE |
+ (BLENDFUNC_ADD << S6_CBUF_BLEND_FUNC_SHIFT) |
+ blendctl);
+
+ /* draw rect is unconditional */
+ OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
+ OUT_BATCH(0x00000000);
+ OUT_BATCH(0x00000000); /* ymin, xmin */
+ OUT_BATCH(DRAW_YMAX(pDst->drawable.height - 1) |
+ DRAW_XMAX(pDst->drawable.width - 1));
+ /* yorig, xorig (relate to color buffer?) */
+ OUT_BATCH(0x00000000);
+ OUT_BATCH(MI_NOOP);
+ ADVANCE_BATCH();
+ }
+
+ if (dst_format == COLR_BUF_8BIT)
+ out_reg = FS_U0;
+
+ FS_BEGIN();
+
+ /* Declare the registers necessary for our program. I don't think the
+ * S then T ordering is necessary.
+ */
+ i915_fs_dcl(FS_S0);
+ if (pMask)
+ i915_fs_dcl(FS_S1);
+ i915_fs_dcl(FS_T0);
+ if (pMask)
+ i915_fs_dcl(FS_T1);
+
+ /* Load the pSrcPicture texel */
+ if (is_affine_src) {
+ i915_fs_texld(FS_R0, FS_S0, FS_T0);
} else {
- i915_fs_mul(out_reg, i915_fs_operand_reg(FS_R0),
- i915_fs_operand(FS_R1, W, W, W, W));
+ i915_fs_texldp(FS_R0, FS_S0, FS_T0);
}
- }
- if (dst_format == COLR_BUF_8BIT)
- i915_fs_mov(FS_OC, i915_fs_operand(out_reg, W, W, W, W));
- FS_END();
-}
+ /* If the texture lacks an alpha channel, force the alpha to 1. */
+ if (PICT_FORMAT_A(pSrcPicture->format) == 0)
+ i915_fs_mov_masked(FS_R0, MASK_W, i915_fs_operand_one());
+ if (!pMask) {
+ /* No mask, so move to output color */
+ i915_fs_mov(out_reg, i915_fs_operand_reg(FS_R0));
+ } else {
+ /* Load the pMaskPicture texel */
+ if (is_affine_mask) {
+ i915_fs_texld(FS_R1, FS_S1, FS_T1);
+ } else {
+ i915_fs_texldp(FS_R1, FS_S1, FS_T1);
+ }
+ /* If the texture lacks an alpha channel, force the alpha to 1.
+ */
+ if (PICT_FORMAT_A(pMaskPicture->format) == 0)
+ i915_fs_mov_masked(FS_R1, MASK_W,
+ i915_fs_operand_one());
+
+ /* If component alpha is active in the mask and the blend
+ * operation uses the source alpha, then we know we don't
+ * need the source value (otherwise we would have hit a
+ * fallback earlier), so we provide the source alpha (src.A *
+ * mask.X) as output color.
+ * Conversely, if CA is set and we don't need the source alpha,
+ * then we produce the source value (src.X * mask.X) and the
+ * source alpha is unused. Otherwise, we provide the non-CA
+ * source value (src.X * mask.A).
+ */
+ if (pMaskPicture->componentAlpha &&
+ PICT_FORMAT_RGB(pMaskPicture->format)) {
+ if (i915_blend_op[op].src_alpha) {
+ i915_fs_mul(out_reg,
+ i915_fs_operand(FS_R0, W, W, W, W),
+ i915_fs_operand_reg(FS_R1));
+ } else {
+ i915_fs_mul(out_reg, i915_fs_operand_reg(FS_R0),
+ i915_fs_operand_reg(FS_R1));
+ }
+ } else {
+ i915_fs_mul(out_reg, i915_fs_operand_reg(FS_R0),
+ i915_fs_operand(FS_R1, W, W, W, W));
+ }
+ }
+ if (dst_format == COLR_BUF_8BIT)
+ i915_fs_mov(FS_OC, i915_fs_operand(out_reg, W, W, W, W));
+ FS_END();
+}
/* Emit the vertices for a single composite rectangle.
*
@@ -557,194 +568,210 @@ static void
i915_emit_composite_primitive(PixmapPtr pDst,
int srcX, int srcY,
int maskX, int maskY,
- int dstX, int dstY,
- int w, int h)
+ int dstX, int dstY, int w, int h)
{
- ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- Bool is_affine_src, is_affine_mask = TRUE;
- int per_vertex, num_floats;
- float src_x[3], src_y[3], src_w[3], mask_x[3], mask_y[3], mask_w[3];
+ ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ Bool is_affine_src, is_affine_mask = TRUE;
+ int per_vertex, num_floats;
+ float src_x[3], src_y[3], src_w[3], mask_x[3], mask_y[3], mask_w[3];
- per_vertex = 2; /* dest x/y */
+ per_vertex = 2; /* dest x/y */
- {
- float x = srcX + pI830->src_coord_adjust;
- float y = srcY + pI830->src_coord_adjust;
+ {
+ float x = srcX + pI830->src_coord_adjust;
+ float y = srcY + pI830->src_coord_adjust;
+
+ is_affine_src = i830_transform_is_affine(pI830->transform[0]);
+ if (is_affine_src) {
+ if (!i830_get_transformed_coordinates(x, y,
+ pI830->
+ transform[0],
+ &src_x[0],
+ &src_y[0]))
+ return;
+
+ if (!i830_get_transformed_coordinates(x, y + h,
+ pI830->
+ transform[0],
+ &src_x[1],
+ &src_y[1]))
+ return;
+
+ if (!i830_get_transformed_coordinates(x + w, y + h,
+ pI830->
+ transform[0],
+ &src_x[2],
+ &src_y[2]))
+ return;
+
+ per_vertex += 2; /* src x/y */
+ } else {
+ if (!i830_get_transformed_coordinates_3d(x, y,
+ pI830->
+ transform[0],
+ &src_x[0],
+ &src_y[0],
+ &src_w[0]))
+ return;
+
+ if (!i830_get_transformed_coordinates_3d(x, y + h,
+ pI830->
+ transform[0],
+ &src_x[1],
+ &src_y[1],
+ &src_w[1]))
+ return;
+
+ if (!i830_get_transformed_coordinates_3d(x + w, y + h,
+ pI830->
+ transform[0],
+ &src_x[2],
+ &src_y[2],
+ &src_w[2]))
+ return;
+
+ per_vertex += 4; /* src x/y/z/w */
+ }
+ }
- is_affine_src = i830_transform_is_affine (pI830->transform[0]);
- if (is_affine_src) {
- if (!i830_get_transformed_coordinates(x, y,
- pI830->transform[0],
- &src_x[0], &src_y[0]))
- return;
-
- if (!i830_get_transformed_coordinates(x, y + h,
- pI830->transform[0],
- &src_x[1], &src_y[1]))
- return;
-
- if (!i830_get_transformed_coordinates(x + w, y + h,
- pI830->transform[0],
- &src_x[2], &src_y[2]))
- return;
-
- per_vertex += 2; /* src x/y */
- } else {
- if (!i830_get_transformed_coordinates_3d(x, y,
- pI830->transform[0],
- &src_x[0],
- &src_y[0],
- &src_w[0]))
- return;
-
- if (!i830_get_transformed_coordinates_3d(x, y + h,
- pI830->transform[0],
- &src_x[1],
- &src_y[1],
- &src_w[1]))
- return;
-
- if (!i830_get_transformed_coordinates_3d(x + w, y + h,
- pI830->transform[0],
- &src_x[2],
- &src_y[2],
- &src_w[2]))
- return;
-
- per_vertex += 4; /* src x/y/z/w */
+ if (pI830->render_mask) {
+ float x = maskX + pI830->mask_coord_adjust;
+ float y = maskY + pI830->mask_coord_adjust;
+
+ is_affine_mask = i830_transform_is_affine(pI830->transform[1]);
+ if (is_affine_mask) {
+ if (!i830_get_transformed_coordinates(x, y,
+ pI830->
+ transform[1],
+ &mask_x[0],
+ &mask_y[0]))
+ return;
+
+ if (!i830_get_transformed_coordinates(x, y + h,
+ pI830->
+ transform[1],
+ &mask_x[1],
+ &mask_y[1]))
+ return;
+
+ if (!i830_get_transformed_coordinates(x + w, y + h,
+ pI830->
+ transform[1],
+ &mask_x[2],
+ &mask_y[2]))
+ return;
+
+ per_vertex += 2; /* mask x/y */
+ } else {
+ if (!i830_get_transformed_coordinates_3d(x, y,
+ pI830->
+ transform[1],
+ &mask_x[0],
+ &mask_y[0],
+ &mask_w[0]))
+ return;
+
+ if (!i830_get_transformed_coordinates_3d(x, y + h,
+ pI830->
+ transform[1],
+ &mask_x[1],
+ &mask_y[1],
+ &mask_w[1]))
+ return;
+
+ if (!i830_get_transformed_coordinates_3d(x + w, y + h,
+ pI830->
+ transform[1],
+ &mask_x[2],
+ &mask_y[2],
+ &mask_w[2]))
+ return;
+
+ per_vertex += 4; /* mask x/y/z/w */
+ }
}
- }
-
- if (pI830->render_mask) {
- float x = maskX + pI830->mask_coord_adjust;
- float y = maskY + pI830->mask_coord_adjust;
-
- is_affine_mask = i830_transform_is_affine (pI830->transform[1]);
- if (is_affine_mask) {
- if (!i830_get_transformed_coordinates(x, y,
- pI830->transform[1],
- &mask_x[0], &mask_y[0]))
- return;
-
- if (!i830_get_transformed_coordinates(x, y + h,
- pI830->transform[1],
- &mask_x[1], &mask_y[1]))
- return;
-
- if (!i830_get_transformed_coordinates(x + w, y + h,
- pI830->transform[1],
- &mask_x[2], &mask_y[2]))
- return;
-
- per_vertex += 2; /* mask x/y */
- } else {
- if (!i830_get_transformed_coordinates_3d(x, y,
- pI830->transform[1],
- &mask_x[0],
- &mask_y[0],
- &mask_w[0]))
- return;
-
- if (!i830_get_transformed_coordinates_3d(x, y + h,
- pI830->transform[1],
- &mask_x[1],
- &mask_y[1],
- &mask_w[1]))
- return;
-
- if (!i830_get_transformed_coordinates_3d(x + w, y + h,
- pI830->transform[1],
- &mask_x[2],
- &mask_y[2],
- &mask_w[2]))
- return;
-
- per_vertex += 4; /* mask x/y/z/w */
+
+ num_floats = 3 * per_vertex;
+
+ BEGIN_BATCH(1 + num_floats);
+
+ OUT_BATCH(PRIM3D_INLINE | PRIM3D_RECTLIST | (num_floats - 1));
+ OUT_BATCH_F(pI830->dst_coord_adjust + dstX + w);
+ OUT_BATCH_F(pI830->dst_coord_adjust + dstY + h);
+ OUT_BATCH_F(src_x[2] / pI830->scale_units[0][0]);
+ OUT_BATCH_F(src_y[2] / pI830->scale_units[0][1]);
+ if (!is_affine_src) {
+ OUT_BATCH_F(0.0);
+ OUT_BATCH_F(src_w[2]);
+ }
+ if (pI830->render_mask) {
+ OUT_BATCH_F(mask_x[2] / pI830->scale_units[1][0]);
+ OUT_BATCH_F(mask_y[2] / pI830->scale_units[1][1]);
+ if (!is_affine_mask) {
+ OUT_BATCH_F(0.0);
+ OUT_BATCH_F(mask_w[2]);
+ }
}
- }
-
- num_floats = 3 * per_vertex;
-
- BEGIN_BATCH(1 + num_floats);
-
- OUT_BATCH(PRIM3D_INLINE | PRIM3D_RECTLIST | (num_floats-1));
- OUT_BATCH_F(pI830->dst_coord_adjust + dstX + w);
- OUT_BATCH_F(pI830->dst_coord_adjust + dstY + h);
- OUT_BATCH_F(src_x[2] / pI830->scale_units[0][0]);
- OUT_BATCH_F(src_y[2] / pI830->scale_units[0][1]);
- if (!is_affine_src) {
- OUT_BATCH_F(0.0);
- OUT_BATCH_F(src_w[2]);
- }
- if (pI830->render_mask) {
- OUT_BATCH_F(mask_x[2] / pI830->scale_units[1][0]);
- OUT_BATCH_F(mask_y[2] / pI830->scale_units[1][1]);
- if (!is_affine_mask) {
- OUT_BATCH_F(0.0);
- OUT_BATCH_F(mask_w[2]);
+
+ OUT_BATCH_F(pI830->dst_coord_adjust + dstX);
+ OUT_BATCH_F(pI830->dst_coord_adjust + dstY + h);
+ OUT_BATCH_F(src_x[1] / pI830->scale_units[0][0]);
+ OUT_BATCH_F(src_y[1] / pI830->scale_units[0][1]);
+ if (!is_affine_src) {
+ OUT_BATCH_F(0.0);
+ OUT_BATCH_F(src_w[1]);
+ }
+ if (pI830->render_mask) {
+ OUT_BATCH_F(mask_x[1] / pI830->scale_units[1][0]);
+ OUT_BATCH_F(mask_y[1] / pI830->scale_units[1][1]);
+ if (!is_affine_mask) {
+ OUT_BATCH_F(0.0);
+ OUT_BATCH_F(mask_w[1]);
+ }
}
- }
-
- OUT_BATCH_F(pI830->dst_coord_adjust + dstX);
- OUT_BATCH_F(pI830->dst_coord_adjust + dstY + h);
- OUT_BATCH_F(src_x[1] / pI830->scale_units[0][0]);
- OUT_BATCH_F(src_y[1] / pI830->scale_units[0][1]);
- if (!is_affine_src) {
- OUT_BATCH_F(0.0);
- OUT_BATCH_F(src_w[1]);
- }
- if (pI830->render_mask) {
- OUT_BATCH_F(mask_x[1] / pI830->scale_units[1][0]);
- OUT_BATCH_F(mask_y[1] / pI830->scale_units[1][1]);
- if (!is_affine_mask) {
- OUT_BATCH_F(0.0);
- OUT_BATCH_F(mask_w[1]);
+
+ OUT_BATCH_F(pI830->dst_coord_adjust + dstX);
+ OUT_BATCH_F(pI830->dst_coord_adjust + dstY);
+ OUT_BATCH_F(src_x[0] / pI830->scale_units[0][0]);
+ OUT_BATCH_F(src_y[0] / pI830->scale_units[0][1]);
+ if (!is_affine_src) {
+ OUT_BATCH_F(0.0);
+ OUT_BATCH_F(src_w[0]);
}
- }
-
- OUT_BATCH_F(pI830->dst_coord_adjust + dstX);
- OUT_BATCH_F(pI830->dst_coord_adjust + dstY);
- OUT_BATCH_F(src_x[0] / pI830->scale_units[0][0]);
- OUT_BATCH_F(src_y[0] / pI830->scale_units[0][1]);
- if (!is_affine_src) {
- OUT_BATCH_F(0.0);
- OUT_BATCH_F(src_w[0]);
- }
- if (pI830->render_mask) {
- OUT_BATCH_F(mask_x[0] / pI830->scale_units[1][0]);
- OUT_BATCH_F(mask_y[0] / pI830->scale_units[1][1]);
- if (!is_affine_mask) {
- OUT_BATCH_F(0.0);
- OUT_BATCH_F(mask_w[0]);
+ if (pI830->render_mask) {
+ OUT_BATCH_F(mask_x[0] / pI830->scale_units[1][0]);
+ OUT_BATCH_F(mask_y[0] / pI830->scale_units[1][1]);
+ if (!is_affine_mask) {
+ OUT_BATCH_F(0.0);
+ OUT_BATCH_F(mask_w[0]);
+ }
}
- }
- ADVANCE_BATCH();
+ ADVANCE_BATCH();
}
void
i915_composite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY,
int dstX, int dstY, int w, int h)
{
- ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
+ ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
- intel_batch_start_atomic(pScrn, 150);
+ intel_batch_start_atomic(pScrn, 150);
- if (pI830->i915_render_state.needs_emit)
- i915_emit_composite_setup(pScrn);
+ if (pI830->i915_render_state.needs_emit)
+ i915_emit_composite_setup(pScrn);
- i915_emit_composite_primitive(pDst, srcX, srcY, maskX, maskY, dstX, dstY,
- w, h);
+ i915_emit_composite_primitive(pDst, srcX, srcY, maskX, maskY, dstX,
+ dstY, w, h);
- intel_batch_end_atomic(pScrn);
+ intel_batch_end_atomic(pScrn);
}
-void
-i915_batch_flush_notify(ScrnInfoPtr pScrn)
+void i915_batch_flush_notify(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
+ I830Ptr pI830 = I830PTR(pScrn);
- pI830->i915_render_state.needs_emit = TRUE;
+ pI830->i915_render_state.needs_emit = TRUE;
}
diff --git a/src/i915_video.c b/src/i915_video.c
index 8e8e9626..59118319 100644
--- a/src/i915_video.c
+++ b/src/i915_video.c
@@ -42,390 +42,417 @@
void
I915DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
RegionPtr dstRegion,
- short width, short height, int video_pitch, int video_pitch2,
- int x1, int y1, int x2, int y2,
+ short width, short height, int video_pitch,
+ int video_pitch2, int x1, int y1, int x2, int y2,
short src_w, short src_h, short drw_w, short drw_h,
PixmapPtr pPixmap)
{
- I830Ptr pI830 = I830PTR(pScrn);
- uint32_t format, ms3, s5;
- BoxPtr pbox = REGION_RECTS(dstRegion);
- int nbox_total = REGION_NUM_RECTS(dstRegion);
- int nbox_this_time;
- int dxo, dyo, pix_xoff, pix_yoff;
+ I830Ptr pI830 = I830PTR(pScrn);
+ uint32_t format, ms3, s5;
+ BoxPtr pbox = REGION_RECTS(dstRegion);
+ int nbox_total = REGION_NUM_RECTS(dstRegion);
+ int nbox_this_time;
+ int dxo, dyo, pix_xoff, pix_yoff;
#if 0
- ErrorF("I915DisplayVideo: %dx%d (pitch %d)\n", width, height,
- video_pitch);
+ ErrorF("I915DisplayVideo: %dx%d (pitch %d)\n", width, height,
+ video_pitch);
#endif
#define BYTES_FOR_BOXES(n) ((200 + (n) * 20) * 4)
#define BOXES_IN_BYTES(s) ((((s)/4) - 200) / 20)
#define BATCH_BYTES(p) ((p)->batch_bo->size - 16)
- while (nbox_total) {
- nbox_this_time = nbox_total;
- if (BYTES_FOR_BOXES(nbox_this_time) > BATCH_BYTES(pI830))
- nbox_this_time = BOXES_IN_BYTES(BATCH_BYTES(pI830));
- nbox_total -= nbox_this_time;
-
- intel_batch_start_atomic(pScrn, 200 + 20 * nbox_this_time);
-
- IntelEmitInvarientState(pScrn);
- pI830->last_3d = LAST_3D_VIDEO;
-
- BEGIN_BATCH(20);
-
- /* flush map & render cache */
- OUT_BATCH(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE);
- OUT_BATCH(0x00000000);
-
- /* draw rect -- just clipping */
- OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
- OUT_BATCH(DRAW_DITHER_OFS_X(pPixmap->drawable.x & 3) |
- DRAW_DITHER_OFS_Y(pPixmap->drawable.y & 3));
- OUT_BATCH(0x00000000); /* ymin, xmin */
- OUT_BATCH((pPixmap->drawable.width - 1) |
- (pPixmap->drawable.height - 1) << 16); /* ymax, xmax */
- OUT_BATCH(0x00000000); /* yorigin, xorigin */
- OUT_BATCH(MI_NOOP);
-
- OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(2) |
- I1_LOAD_S(4) | I1_LOAD_S(5) | I1_LOAD_S(6) | 3);
- OUT_BATCH(S2_TEXCOORD_FMT(0, TEXCOORDFMT_2D) |
- S2_TEXCOORD_FMT(1, TEXCOORDFMT_NOT_PRESENT) |
- S2_TEXCOORD_FMT(2, TEXCOORDFMT_NOT_PRESENT) |
- S2_TEXCOORD_FMT(3, TEXCOORDFMT_NOT_PRESENT) |
- S2_TEXCOORD_FMT(4, TEXCOORDFMT_NOT_PRESENT) |
- S2_TEXCOORD_FMT(5, TEXCOORDFMT_NOT_PRESENT) |
- S2_TEXCOORD_FMT(6, TEXCOORDFMT_NOT_PRESENT) |
- S2_TEXCOORD_FMT(7, TEXCOORDFMT_NOT_PRESENT));
- OUT_BATCH((1 << S4_POINT_WIDTH_SHIFT) | S4_LINE_WIDTH_ONE |
- S4_CULLMODE_NONE | S4_VFMT_XY);
- s5 = 0x0;
- if (pI830->cpp == 2)
- s5 |= S5_COLOR_DITHER_ENABLE;
- OUT_BATCH(s5); /* S5 - enable bits */
- OUT_BATCH((2 << S6_DEPTH_TEST_FUNC_SHIFT) |
- (2 << S6_CBUF_SRC_BLEND_FACT_SHIFT) |
- (1 << S6_CBUF_DST_BLEND_FACT_SHIFT) | S6_COLOR_WRITE_ENABLE |
- (2 << S6_TRISTRIP_PV_SHIFT));
-
- OUT_BATCH(_3DSTATE_CONST_BLEND_COLOR_CMD);
- OUT_BATCH(0x00000000);
-
- OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
- if (pI830->cpp == 2)
- format = COLR_BUF_RGB565;
- else
- format = COLR_BUF_ARGB8888 | DEPTH_FRMT_24_FIXED_8_OTHER;
-
- OUT_BATCH(LOD_PRECLAMP_OGL |
- DSTORG_HORT_BIAS(0x8) |
- DSTORG_VERT_BIAS(0x8) |
- format);
-
- /* front buffer, pitch, offset */
- OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
- OUT_BATCH(BUF_3D_ID_COLOR_BACK | BUF_3D_USE_FENCE |
- BUF_3D_PITCH(intel_get_pixmap_pitch(pPixmap)));
- OUT_RELOC_PIXMAP(pPixmap, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
- ADVANCE_BATCH();
-
- if (!is_planar_fourcc(id)) {
- FS_LOCALS(10);
-
- BEGIN_BATCH(16);
- OUT_BATCH(_3DSTATE_PIXEL_SHADER_CONSTANTS | 4);
- OUT_BATCH(0x0000001); /* constant 0 */
- /* constant 0: brightness/contrast */
- OUT_BATCH_F(pPriv->brightness / 128.0);
- OUT_BATCH_F(pPriv->contrast / 255.0);
- OUT_BATCH_F(0.0);
- OUT_BATCH_F(0.0);
-
- OUT_BATCH(_3DSTATE_SAMPLER_STATE | 3);
- OUT_BATCH(0x00000001);
- OUT_BATCH(SS2_COLORSPACE_CONVERSION |
- (FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
- (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT));
- OUT_BATCH((TEXCOORDMODE_CLAMP_EDGE << SS3_TCX_ADDR_MODE_SHIFT) |
- (TEXCOORDMODE_CLAMP_EDGE << SS3_TCY_ADDR_MODE_SHIFT) |
- (0 << SS3_TEXTUREMAP_INDEX_SHIFT) |
- SS3_NORMALIZED_COORDS);
- OUT_BATCH(0x00000000);
-
- OUT_BATCH(_3DSTATE_MAP_STATE | 3);
- OUT_BATCH(0x00000001); /* texture map #1 */
- if (pPriv->buf)
- OUT_RELOC(pPriv->buf, I915_GEM_DOMAIN_SAMPLER, 0, pPriv->YBufOffset);
- else
- OUT_BATCH(pPriv->YBufOffset);
-
- ms3 = MAPSURF_422 | MS3_USE_FENCE_REGS;
- switch (id) {
- case FOURCC_YUY2:
- ms3 |= MT_422_YCRCB_NORMAL;
- break;
- case FOURCC_UYVY:
- ms3 |= MT_422_YCRCB_SWAPY;
- break;
- }
- ms3 |= (height - 1) << MS3_HEIGHT_SHIFT;
- ms3 |= (width - 1) << MS3_WIDTH_SHIFT;
- OUT_BATCH(ms3);
- OUT_BATCH(((video_pitch / 4) - 1) << MS4_PITCH_SHIFT);
-
- ADVANCE_BATCH();
-
- FS_BEGIN();
- i915_fs_dcl(FS_S0);
- i915_fs_dcl(FS_T0);
- i915_fs_texld(FS_OC, FS_S0, FS_T0);
- if (pPriv->brightness != 0) {
- i915_fs_add(FS_OC,
- i915_fs_operand_reg(FS_OC),
- i915_fs_operand(FS_C0, X, X, X, ZERO));
- }
- FS_END();
- } else {
- FS_LOCALS(16);
-
- BEGIN_BATCH(22 + 11 + 11);
- /* For the planar formats, we set up three samplers -- one for each plane,
- * in a Y8 format. Because I couldn't get the special PLANAR_TO_PACKED
- * shader setup to work, I did the manual pixel shader:
- *
- * y' = y - .0625
- * u' = u - .5
- * v' = v - .5;
- *
- * r = 1.1643 * y' + 0.0 * u' + 1.5958 * v'
- * g = 1.1643 * y' - 0.39173 * u' - 0.81290 * v'
- * b = 1.1643 * y' + 2.017 * u' + 0.0 * v'
- *
- * register assignment:
- * r0 = (y',u',v',0)
- * r1 = (y,y,y,y)
- * r2 = (u,u,u,u)
- * r3 = (v,v,v,v)
- * OC = (r,g,b,1)
- */
- OUT_BATCH(_3DSTATE_PIXEL_SHADER_CONSTANTS | (22 - 2));
- OUT_BATCH(0x000001f); /* constants 0-4 */
- /* constant 0: normalization offsets */
- OUT_BATCH_F(-0.0625);
- OUT_BATCH_F(-0.5);
- OUT_BATCH_F(-0.5);
- OUT_BATCH_F(0.0);
- /* constant 1: r coefficients*/
- OUT_BATCH_F(1.1643);
- OUT_BATCH_F(0.0);
- OUT_BATCH_F(1.5958);
- OUT_BATCH_F(0.0);
- /* constant 2: g coefficients */
- OUT_BATCH_F(1.1643);
- OUT_BATCH_F(-0.39173);
- OUT_BATCH_F(-0.81290);
- OUT_BATCH_F(0.0);
- /* constant 3: b coefficients */
- OUT_BATCH_F(1.1643);
- OUT_BATCH_F(2.017);
- OUT_BATCH_F(0.0);
- OUT_BATCH_F(0.0);
- /* constant 4: brightness/contrast */
- OUT_BATCH_F(pPriv->brightness / 128.0);
- OUT_BATCH_F(pPriv->contrast / 255.0);
- OUT_BATCH_F(0.0);
- OUT_BATCH_F(0.0);
-
- OUT_BATCH(_3DSTATE_SAMPLER_STATE | 9);
- OUT_BATCH(0x00000007);
- /* sampler 0 */
- OUT_BATCH((FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
- (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT));
- OUT_BATCH((TEXCOORDMODE_CLAMP_EDGE << SS3_TCX_ADDR_MODE_SHIFT) |
- (TEXCOORDMODE_CLAMP_EDGE << SS3_TCY_ADDR_MODE_SHIFT) |
- (0 << SS3_TEXTUREMAP_INDEX_SHIFT) |
- SS3_NORMALIZED_COORDS);
- OUT_BATCH(0x00000000);
- /* sampler 1 */
- OUT_BATCH((FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
- (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT));
- OUT_BATCH((TEXCOORDMODE_CLAMP_EDGE << SS3_TCX_ADDR_MODE_SHIFT) |
- (TEXCOORDMODE_CLAMP_EDGE << SS3_TCY_ADDR_MODE_SHIFT) |
- (1 << SS3_TEXTUREMAP_INDEX_SHIFT) |
- SS3_NORMALIZED_COORDS);
- OUT_BATCH(0x00000000);
- /* sampler 2 */
- OUT_BATCH((FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
- (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT));
- OUT_BATCH((TEXCOORDMODE_CLAMP_EDGE << SS3_TCX_ADDR_MODE_SHIFT) |
- (TEXCOORDMODE_CLAMP_EDGE << SS3_TCY_ADDR_MODE_SHIFT) |
- (2 << SS3_TEXTUREMAP_INDEX_SHIFT) |
- SS3_NORMALIZED_COORDS);
- OUT_BATCH(0x00000000);
-
- OUT_BATCH(_3DSTATE_MAP_STATE | 9);
- OUT_BATCH(0x00000007);
-
- if (pPriv->buf)
- OUT_RELOC(pPriv->buf, I915_GEM_DOMAIN_SAMPLER, 0, pPriv->YBufOffset);
- else
- OUT_BATCH(pPriv->YBufOffset);
-
- ms3 = MAPSURF_8BIT | MT_8BIT_I8 | MS3_USE_FENCE_REGS;
- ms3 |= (height - 1) << MS3_HEIGHT_SHIFT;
- ms3 |= (width - 1) << MS3_WIDTH_SHIFT;
- OUT_BATCH(ms3);
- /* check to see if Y has special pitch than normal double u/v pitch,
- * e.g i915 XvMC hw requires at least 1K alignment, so Y pitch might
- * be same as U/V's.*/
- if (video_pitch2)
- OUT_BATCH(((video_pitch2 / 4) - 1) << MS4_PITCH_SHIFT);
- else
- OUT_BATCH(((video_pitch * 2 / 4) - 1) << MS4_PITCH_SHIFT);
-
- if (pPriv->buf)
- OUT_RELOC(pPriv->buf, I915_GEM_DOMAIN_SAMPLER, 0, pPriv->UBufOffset);
- else
- OUT_BATCH(pPriv->UBufOffset);
-
- ms3 = MAPSURF_8BIT | MT_8BIT_I8 | MS3_USE_FENCE_REGS;
- ms3 |= (height / 2 - 1) << MS3_HEIGHT_SHIFT;
- ms3 |= (width / 2 - 1) << MS3_WIDTH_SHIFT;
- OUT_BATCH(ms3);
- OUT_BATCH(((video_pitch / 4) - 1) << MS4_PITCH_SHIFT);
-
- if (pPriv->buf)
- OUT_RELOC(pPriv->buf, I915_GEM_DOMAIN_SAMPLER, 0, pPriv->VBufOffset);
- else
- OUT_BATCH(pPriv->VBufOffset);
-
- ms3 = MAPSURF_8BIT | MT_8BIT_I8 | MS3_USE_FENCE_REGS;
- ms3 |= (height / 2 - 1) << MS3_HEIGHT_SHIFT;
- ms3 |= (width / 2 - 1) << MS3_WIDTH_SHIFT;
- OUT_BATCH(ms3);
- OUT_BATCH(((video_pitch / 4) - 1) << MS4_PITCH_SHIFT);
- ADVANCE_BATCH();
-
- FS_BEGIN();
- /* Declare samplers */
- i915_fs_dcl(FS_S0); /* Y */
- i915_fs_dcl(FS_S1); /* U */
- i915_fs_dcl(FS_S2); /* V */
- i915_fs_dcl(FS_T0); /* normalized coords */
-
- /* Load samplers to temporaries. */
- i915_fs_texld(FS_R1, FS_S0, FS_T0);
- i915_fs_texld(FS_R2, FS_S1, FS_T0);
- i915_fs_texld(FS_R3, FS_S2, FS_T0);
-
- /* Move the sampled YUV data in R[123] to the first 3 channels of R0. */
- i915_fs_mov_masked(FS_R0, MASK_X, i915_fs_operand_reg(FS_R1));
- i915_fs_mov_masked(FS_R0, MASK_Y, i915_fs_operand_reg(FS_R2));
- i915_fs_mov_masked(FS_R0, MASK_Z, i915_fs_operand_reg(FS_R3));
-
- /* Normalize the YUV data */
- i915_fs_add(FS_R0, i915_fs_operand_reg(FS_R0),
- i915_fs_operand_reg(FS_C0));
- /* dot-product the YUV data in R0 by the vectors of coefficients for
- * calculating R, G, and B, storing the results in the R, G, or B
- * channels of the output color. The OC results are implicitly clamped
- * at the end of the program.
- */
- i915_fs_dp3_masked(FS_OC, MASK_X,
- i915_fs_operand_reg(FS_R0),
- i915_fs_operand_reg(FS_C1));
- i915_fs_dp3_masked(FS_OC, MASK_Y,
- i915_fs_operand_reg(FS_R0),
- i915_fs_operand_reg(FS_C2));
- i915_fs_dp3_masked(FS_OC, MASK_Z,
- i915_fs_operand_reg(FS_R0),
- i915_fs_operand_reg(FS_C3));
- /* Set alpha of the output to 1.0, by wiring W to 1 and not actually using
- * the source.
- */
- i915_fs_mov_masked(FS_OC, MASK_W, i915_fs_operand_one());
-
- if (pPriv->brightness != 0) {
- i915_fs_add(FS_OC,
- i915_fs_operand_reg(FS_OC),
- i915_fs_operand(FS_C4, X, X, X, ZERO));
- }
- FS_END();
- }
-
- {
- BEGIN_BATCH(2);
- OUT_BATCH(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE);
- OUT_BATCH(0x00000000);
- ADVANCE_BATCH();
- }
-
- /* Set up the offset for translating from the given region (in screen
- * coordinates) to the backing pixmap.
- */
+ while (nbox_total) {
+ nbox_this_time = nbox_total;
+ if (BYTES_FOR_BOXES(nbox_this_time) > BATCH_BYTES(pI830))
+ nbox_this_time = BOXES_IN_BYTES(BATCH_BYTES(pI830));
+ nbox_total -= nbox_this_time;
+
+ intel_batch_start_atomic(pScrn, 200 + 20 * nbox_this_time);
+
+ IntelEmitInvarientState(pScrn);
+ pI830->last_3d = LAST_3D_VIDEO;
+
+ BEGIN_BATCH(20);
+
+ /* flush map & render cache */
+ OUT_BATCH(MI_FLUSH | MI_WRITE_DIRTY_STATE |
+ MI_INVALIDATE_MAP_CACHE);
+ OUT_BATCH(0x00000000);
+
+ /* draw rect -- just clipping */
+ OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
+ OUT_BATCH(DRAW_DITHER_OFS_X(pPixmap->drawable.x & 3) |
+ DRAW_DITHER_OFS_Y(pPixmap->drawable.y & 3));
+ OUT_BATCH(0x00000000); /* ymin, xmin */
+ /* ymax, xmax */
+ OUT_BATCH((pPixmap->drawable.width - 1) |
+ (pPixmap->drawable.height - 1) << 16);
+ OUT_BATCH(0x00000000); /* yorigin, xorigin */
+ OUT_BATCH(MI_NOOP);
+
+ OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(2) |
+ I1_LOAD_S(4) | I1_LOAD_S(5) | I1_LOAD_S(6) | 3);
+ OUT_BATCH(S2_TEXCOORD_FMT(0, TEXCOORDFMT_2D) |
+ S2_TEXCOORD_FMT(1, TEXCOORDFMT_NOT_PRESENT) |
+ S2_TEXCOORD_FMT(2, TEXCOORDFMT_NOT_PRESENT) |
+ S2_TEXCOORD_FMT(3, TEXCOORDFMT_NOT_PRESENT) |
+ S2_TEXCOORD_FMT(4, TEXCOORDFMT_NOT_PRESENT) |
+ S2_TEXCOORD_FMT(5, TEXCOORDFMT_NOT_PRESENT) |
+ S2_TEXCOORD_FMT(6, TEXCOORDFMT_NOT_PRESENT) |
+ S2_TEXCOORD_FMT(7, TEXCOORDFMT_NOT_PRESENT));
+ OUT_BATCH((1 << S4_POINT_WIDTH_SHIFT) | S4_LINE_WIDTH_ONE |
+ S4_CULLMODE_NONE | S4_VFMT_XY);
+ s5 = 0x0;
+ if (pI830->cpp == 2)
+ s5 |= S5_COLOR_DITHER_ENABLE;
+ OUT_BATCH(s5); /* S5 - enable bits */
+ OUT_BATCH((2 << S6_DEPTH_TEST_FUNC_SHIFT) |
+ (2 << S6_CBUF_SRC_BLEND_FACT_SHIFT) |
+ (1 << S6_CBUF_DST_BLEND_FACT_SHIFT) |
+ S6_COLOR_WRITE_ENABLE | (2 << S6_TRISTRIP_PV_SHIFT));
+
+ OUT_BATCH(_3DSTATE_CONST_BLEND_COLOR_CMD);
+ OUT_BATCH(0x00000000);
+
+ OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
+ if (pI830->cpp == 2)
+ format = COLR_BUF_RGB565;
+ else
+ format =
+ COLR_BUF_ARGB8888 | DEPTH_FRMT_24_FIXED_8_OTHER;
+
+ OUT_BATCH(LOD_PRECLAMP_OGL |
+ DSTORG_HORT_BIAS(0x8) |
+ DSTORG_VERT_BIAS(0x8) | format);
+
+ /* front buffer, pitch, offset */
+ OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
+ OUT_BATCH(BUF_3D_ID_COLOR_BACK | BUF_3D_USE_FENCE |
+ BUF_3D_PITCH(intel_get_pixmap_pitch(pPixmap)));
+ OUT_RELOC_PIXMAP(pPixmap, I915_GEM_DOMAIN_RENDER,
+ I915_GEM_DOMAIN_RENDER, 0);
+ ADVANCE_BATCH();
+
+ if (!is_planar_fourcc(id)) {
+ FS_LOCALS(10);
+
+ BEGIN_BATCH(16);
+ OUT_BATCH(_3DSTATE_PIXEL_SHADER_CONSTANTS | 4);
+ OUT_BATCH(0x0000001); /* constant 0 */
+ /* constant 0: brightness/contrast */
+ OUT_BATCH_F(pPriv->brightness / 128.0);
+ OUT_BATCH_F(pPriv->contrast / 255.0);
+ OUT_BATCH_F(0.0);
+ OUT_BATCH_F(0.0);
+
+ OUT_BATCH(_3DSTATE_SAMPLER_STATE | 3);
+ OUT_BATCH(0x00000001);
+ OUT_BATCH(SS2_COLORSPACE_CONVERSION |
+ (FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
+ (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT));
+ OUT_BATCH((TEXCOORDMODE_CLAMP_EDGE <<
+ SS3_TCX_ADDR_MODE_SHIFT) |
+ (TEXCOORDMODE_CLAMP_EDGE <<
+ SS3_TCY_ADDR_MODE_SHIFT) |
+ (0 << SS3_TEXTUREMAP_INDEX_SHIFT) |
+ SS3_NORMALIZED_COORDS);
+ OUT_BATCH(0x00000000);
+
+ OUT_BATCH(_3DSTATE_MAP_STATE | 3);
+ OUT_BATCH(0x00000001); /* texture map #1 */
+ if (pPriv->buf)
+ OUT_RELOC(pPriv->buf, I915_GEM_DOMAIN_SAMPLER,
+ 0, pPriv->YBufOffset);
+ else
+ OUT_BATCH(pPriv->YBufOffset);
+
+ ms3 = MAPSURF_422 | MS3_USE_FENCE_REGS;
+ switch (id) {
+ case FOURCC_YUY2:
+ ms3 |= MT_422_YCRCB_NORMAL;
+ break;
+ case FOURCC_UYVY:
+ ms3 |= MT_422_YCRCB_SWAPY;
+ break;
+ }
+ ms3 |= (height - 1) << MS3_HEIGHT_SHIFT;
+ ms3 |= (width - 1) << MS3_WIDTH_SHIFT;
+ OUT_BATCH(ms3);
+ OUT_BATCH(((video_pitch / 4) - 1) << MS4_PITCH_SHIFT);
+
+ ADVANCE_BATCH();
+
+ FS_BEGIN();
+ i915_fs_dcl(FS_S0);
+ i915_fs_dcl(FS_T0);
+ i915_fs_texld(FS_OC, FS_S0, FS_T0);
+ if (pPriv->brightness != 0) {
+ i915_fs_add(FS_OC,
+ i915_fs_operand_reg(FS_OC),
+ i915_fs_operand(FS_C0, X, X, X,
+ ZERO));
+ }
+ FS_END();
+ } else {
+ FS_LOCALS(16);
+
+ BEGIN_BATCH(22 + 11 + 11);
+ /* For the planar formats, we set up three samplers --
+ * one for each plane, in a Y8 format. Because I
+ * couldn't get the special PLANAR_TO_PACKED
+ * shader setup to work, I did the manual pixel shader:
+ *
+ * y' = y - .0625
+ * u' = u - .5
+ * v' = v - .5;
+ *
+ * r = 1.1643 * y' + 0.0 * u' + 1.5958 * v'
+ * g = 1.1643 * y' - 0.39173 * u' - 0.81290 * v'
+ * b = 1.1643 * y' + 2.017 * u' + 0.0 * v'
+ *
+ * register assignment:
+ * r0 = (y',u',v',0)
+ * r1 = (y,y,y,y)
+ * r2 = (u,u,u,u)
+ * r3 = (v,v,v,v)
+ * OC = (r,g,b,1)
+ */
+ OUT_BATCH(_3DSTATE_PIXEL_SHADER_CONSTANTS | (22 - 2));
+ OUT_BATCH(0x000001f); /* constants 0-4 */
+ /* constant 0: normalization offsets */
+ OUT_BATCH_F(-0.0625);
+ OUT_BATCH_F(-0.5);
+ OUT_BATCH_F(-0.5);
+ OUT_BATCH_F(0.0);
+ /* constant 1: r coefficients */
+ OUT_BATCH_F(1.1643);
+ OUT_BATCH_F(0.0);
+ OUT_BATCH_F(1.5958);
+ OUT_BATCH_F(0.0);
+ /* constant 2: g coefficients */
+ OUT_BATCH_F(1.1643);
+ OUT_BATCH_F(-0.39173);
+ OUT_BATCH_F(-0.81290);
+ OUT_BATCH_F(0.0);
+ /* constant 3: b coefficients */
+ OUT_BATCH_F(1.1643);
+ OUT_BATCH_F(2.017);
+ OUT_BATCH_F(0.0);
+ OUT_BATCH_F(0.0);
+ /* constant 4: brightness/contrast */
+ OUT_BATCH_F(pPriv->brightness / 128.0);
+ OUT_BATCH_F(pPriv->contrast / 255.0);
+ OUT_BATCH_F(0.0);
+ OUT_BATCH_F(0.0);
+
+ OUT_BATCH(_3DSTATE_SAMPLER_STATE | 9);
+ OUT_BATCH(0x00000007);
+ /* sampler 0 */
+ OUT_BATCH((FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
+ (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT));
+ OUT_BATCH((TEXCOORDMODE_CLAMP_EDGE <<
+ SS3_TCX_ADDR_MODE_SHIFT) |
+ (TEXCOORDMODE_CLAMP_EDGE <<
+ SS3_TCY_ADDR_MODE_SHIFT) |
+ (0 << SS3_TEXTUREMAP_INDEX_SHIFT) |
+ SS3_NORMALIZED_COORDS);
+ OUT_BATCH(0x00000000);
+ /* sampler 1 */
+ OUT_BATCH((FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
+ (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT));
+ OUT_BATCH((TEXCOORDMODE_CLAMP_EDGE <<
+ SS3_TCX_ADDR_MODE_SHIFT) |
+ (TEXCOORDMODE_CLAMP_EDGE <<
+ SS3_TCY_ADDR_MODE_SHIFT) |
+ (1 << SS3_TEXTUREMAP_INDEX_SHIFT) |
+ SS3_NORMALIZED_COORDS);
+ OUT_BATCH(0x00000000);
+ /* sampler 2 */
+ OUT_BATCH((FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
+ (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT));
+ OUT_BATCH((TEXCOORDMODE_CLAMP_EDGE <<
+ SS3_TCX_ADDR_MODE_SHIFT) |
+ (TEXCOORDMODE_CLAMP_EDGE <<
+ SS3_TCY_ADDR_MODE_SHIFT) |
+ (2 << SS3_TEXTUREMAP_INDEX_SHIFT) |
+ SS3_NORMALIZED_COORDS);
+ OUT_BATCH(0x00000000);
+
+ OUT_BATCH(_3DSTATE_MAP_STATE | 9);
+ OUT_BATCH(0x00000007);
+
+ if (pPriv->buf)
+ OUT_RELOC(pPriv->buf, I915_GEM_DOMAIN_SAMPLER,
+ 0, pPriv->YBufOffset);
+ else
+ OUT_BATCH(pPriv->YBufOffset);
+
+ ms3 = MAPSURF_8BIT | MT_8BIT_I8 | MS3_USE_FENCE_REGS;
+ ms3 |= (height - 1) << MS3_HEIGHT_SHIFT;
+ ms3 |= (width - 1) << MS3_WIDTH_SHIFT;
+ OUT_BATCH(ms3);
+ /* check to see if Y has special pitch than normal
+ * double u/v pitch, e.g i915 XvMC hw requires at
+ * least 1K alignment, so Y pitch might
+ * be same as U/V's.*/
+ if (video_pitch2)
+ OUT_BATCH(((video_pitch2 / 4) -
+ 1) << MS4_PITCH_SHIFT);
+ else
+ OUT_BATCH(((video_pitch * 2 / 4) -
+ 1) << MS4_PITCH_SHIFT);
+
+ if (pPriv->buf)
+ OUT_RELOC(pPriv->buf, I915_GEM_DOMAIN_SAMPLER,
+ 0, pPriv->UBufOffset);
+ else
+ OUT_BATCH(pPriv->UBufOffset);
+
+ ms3 = MAPSURF_8BIT | MT_8BIT_I8 | MS3_USE_FENCE_REGS;
+ ms3 |= (height / 2 - 1) << MS3_HEIGHT_SHIFT;
+ ms3 |= (width / 2 - 1) << MS3_WIDTH_SHIFT;
+ OUT_BATCH(ms3);
+ OUT_BATCH(((video_pitch / 4) - 1) << MS4_PITCH_SHIFT);
+
+ if (pPriv->buf)
+ OUT_RELOC(pPriv->buf, I915_GEM_DOMAIN_SAMPLER,
+ 0, pPriv->VBufOffset);
+ else
+ OUT_BATCH(pPriv->VBufOffset);
+
+ ms3 = MAPSURF_8BIT | MT_8BIT_I8 | MS3_USE_FENCE_REGS;
+ ms3 |= (height / 2 - 1) << MS3_HEIGHT_SHIFT;
+ ms3 |= (width / 2 - 1) << MS3_WIDTH_SHIFT;
+ OUT_BATCH(ms3);
+ OUT_BATCH(((video_pitch / 4) - 1) << MS4_PITCH_SHIFT);
+ ADVANCE_BATCH();
+
+ FS_BEGIN();
+ /* Declare samplers */
+ i915_fs_dcl(FS_S0); /* Y */
+ i915_fs_dcl(FS_S1); /* U */
+ i915_fs_dcl(FS_S2); /* V */
+ i915_fs_dcl(FS_T0); /* normalized coords */
+
+ /* Load samplers to temporaries. */
+ i915_fs_texld(FS_R1, FS_S0, FS_T0);
+ i915_fs_texld(FS_R2, FS_S1, FS_T0);
+ i915_fs_texld(FS_R3, FS_S2, FS_T0);
+
+ /* Move the sampled YUV data in R[123] to the first
+ * 3 channels of R0.
+ */
+ i915_fs_mov_masked(FS_R0, MASK_X,
+ i915_fs_operand_reg(FS_R1));
+ i915_fs_mov_masked(FS_R0, MASK_Y,
+ i915_fs_operand_reg(FS_R2));
+ i915_fs_mov_masked(FS_R0, MASK_Z,
+ i915_fs_operand_reg(FS_R3));
+
+ /* Normalize the YUV data */
+ i915_fs_add(FS_R0, i915_fs_operand_reg(FS_R0),
+ i915_fs_operand_reg(FS_C0));
+ /* dot-product the YUV data in R0 by the vectors of
+ * coefficients for calculating R, G, and B, storing
+ * the results in the R, G, or B channels of the output
+ * color. The OC results are implicitly clamped
+ * at the end of the program.
+ */
+ i915_fs_dp3_masked(FS_OC, MASK_X,
+ i915_fs_operand_reg(FS_R0),
+ i915_fs_operand_reg(FS_C1));
+ i915_fs_dp3_masked(FS_OC, MASK_Y,
+ i915_fs_operand_reg(FS_R0),
+ i915_fs_operand_reg(FS_C2));
+ i915_fs_dp3_masked(FS_OC, MASK_Z,
+ i915_fs_operand_reg(FS_R0),
+ i915_fs_operand_reg(FS_C3));
+ /* Set alpha of the output to 1.0, by wiring W to 1
+ * and not actually using the source.
+ */
+ i915_fs_mov_masked(FS_OC, MASK_W,
+ i915_fs_operand_one());
+
+ if (pPriv->brightness != 0) {
+ i915_fs_add(FS_OC,
+ i915_fs_operand_reg(FS_OC),
+ i915_fs_operand(FS_C4, X, X, X,
+ ZERO));
+ }
+ FS_END();
+ }
+
+ {
+ BEGIN_BATCH(2);
+ OUT_BATCH(MI_FLUSH | MI_WRITE_DIRTY_STATE |
+ MI_INVALIDATE_MAP_CACHE);
+ OUT_BATCH(0x00000000);
+ ADVANCE_BATCH();
+ }
+
+ /* Set up the offset for translating from the given region
+ * (in screen coordinates) to the backing pixmap.
+ */
#ifdef COMPOSITE
- pix_xoff = -pPixmap->screen_x + pPixmap->drawable.x;
- pix_yoff = -pPixmap->screen_y + pPixmap->drawable.y;
+ pix_xoff = -pPixmap->screen_x + pPixmap->drawable.x;
+ pix_yoff = -pPixmap->screen_y + pPixmap->drawable.y;
#else
- pix_xoff = 0;
- pix_yoff = 0;
+ pix_xoff = 0;
+ pix_yoff = 0;
#endif
- dxo = dstRegion->extents.x1;
- dyo = dstRegion->extents.y1;
-
- while (nbox_this_time--)
- {
- int box_x1 = pbox->x1;
- int box_y1 = pbox->y1;
- int box_x2 = pbox->x2;
- int box_y2 = pbox->y2;
- float src_scale_x, src_scale_y;
-
- pbox++;
-
- src_scale_x = ((float)src_w / width) / drw_w;
- src_scale_y = ((float)src_h / height) / drw_h;
-
- BEGIN_BATCH(8 + 12);
- OUT_BATCH(MI_NOOP);
- OUT_BATCH(MI_NOOP);
- OUT_BATCH(MI_NOOP);
- OUT_BATCH(MI_NOOP);
- OUT_BATCH(MI_NOOP);
- OUT_BATCH(MI_NOOP);
- OUT_BATCH(MI_NOOP);
-
- /* vertex data - rect list consists of bottom right, bottom left, and top
- * left vertices.
- */
- OUT_BATCH(PRIM3D_INLINE | PRIM3D_RECTLIST | (12 - 1));
-
- /* bottom right */
- OUT_BATCH_F(box_x2 + pix_xoff);
- OUT_BATCH_F(box_y2 + pix_yoff);
- OUT_BATCH_F((box_x2 - dxo) * src_scale_x);
- OUT_BATCH_F((box_y2 - dyo) * src_scale_y);
-
- /* bottom left */
- OUT_BATCH_F(box_x1 + pix_xoff);
- OUT_BATCH_F(box_y2 + pix_yoff);
- OUT_BATCH_F((box_x1 - dxo) * src_scale_x);
- OUT_BATCH_F((box_y2 - dyo) * src_scale_y);
-
- /* top left */
- OUT_BATCH_F(box_x1 + pix_xoff);
- OUT_BATCH_F(box_y1 + pix_yoff);
- OUT_BATCH_F((box_x1 - dxo) * src_scale_x);
- OUT_BATCH_F((box_y1 - dyo) * src_scale_y);
-
- ADVANCE_BATCH();
- }
-
- intel_batch_end_atomic(pScrn);
- }
+ dxo = dstRegion->extents.x1;
+ dyo = dstRegion->extents.y1;
+
+ while (nbox_this_time--) {
+ int box_x1 = pbox->x1;
+ int box_y1 = pbox->y1;
+ int box_x2 = pbox->x2;
+ int box_y2 = pbox->y2;
+ float src_scale_x, src_scale_y;
+
+ pbox++;
+
+ src_scale_x = ((float)src_w / width) / drw_w;
+ src_scale_y = ((float)src_h / height) / drw_h;
+
+ BEGIN_BATCH(8 + 12);
+ OUT_BATCH(MI_NOOP);
+ OUT_BATCH(MI_NOOP);
+ OUT_BATCH(MI_NOOP);
+ OUT_BATCH(MI_NOOP);
+ OUT_BATCH(MI_NOOP);
+ OUT_BATCH(MI_NOOP);
+ OUT_BATCH(MI_NOOP);
+
+ /* vertex data - rect list consists of bottom right,
+ * bottom left, and top left vertices.
+ */
+ OUT_BATCH(PRIM3D_INLINE | PRIM3D_RECTLIST | (12 - 1));
+
+ /* bottom right */
+ OUT_BATCH_F(box_x2 + pix_xoff);
+ OUT_BATCH_F(box_y2 + pix_yoff);
+ OUT_BATCH_F((box_x2 - dxo) * src_scale_x);
+ OUT_BATCH_F((box_y2 - dyo) * src_scale_y);
+
+ /* bottom left */
+ OUT_BATCH_F(box_x1 + pix_xoff);
+ OUT_BATCH_F(box_y2 + pix_yoff);
+ OUT_BATCH_F((box_x1 - dxo) * src_scale_x);
+ OUT_BATCH_F((box_y2 - dyo) * src_scale_y);
+
+ /* top left */
+ OUT_BATCH_F(box_x1 + pix_xoff);
+ OUT_BATCH_F(box_y1 + pix_yoff);
+ OUT_BATCH_F((box_x1 - dxo) * src_scale_x);
+ OUT_BATCH_F((box_y1 - dyo) * src_scale_y);
+
+ ADVANCE_BATCH();
+ }
+
+ intel_batch_end_atomic(pScrn);
+ }
}
-
diff --git a/src/i965_hwmc.c b/src/i965_hwmc.c
index 7f00ba63..3c10f4e8 100644
--- a/src/i965_hwmc.c
+++ b/src/i965_hwmc.c
@@ -50,97 +50,98 @@
static PutImageFuncPtr XvPutImage;
-
-static int create_context(ScrnInfoPtr pScrn,
- XvMCContextPtr context, int *num_privates, CARD32 **private)
+static int create_context(ScrnInfoPtr pScrn,
+ XvMCContextPtr context, int *num_privates,
+ CARD32 ** private)
{
- struct i965_xvmc_context *private_context, *context_dup;
- I830Ptr I830 = I830PTR(pScrn);
-
- unsigned int blocknum =
- (((context->width + 15)/16)*((context->height+15)/16));
- unsigned int blocksize = 6*blocknum*64*sizeof(short);
- blocksize = (blocksize + 4095)&(~4095);
- if ((private_context = Xcalloc(sizeof(*private_context))) == NULL) {
- ErrorF("XVMC Can not allocate private context\n");
- return BadAlloc;
- }
-
- if ((context_dup = Xcalloc(sizeof(*private_context))) == NULL) {
- ErrorF("XVMC Can not allocate private context\n");
- return BadAlloc;
- }
-
- private_context->is_g4x = IS_G4X(I830);
- private_context->is_965_q = IS_965_Q(I830);
- private_context->is_igdng = IS_IGDNG(I830);
- private_context->comm.kernel_exec_fencing = 1;
- private_context->comm.type = xvmc_driver->flag;
-
- *num_privates = sizeof(*private_context)/sizeof(CARD32);
- *private = (CARD32 *)private_context;
- memcpy(context_dup, private_context, sizeof(*private_context));
- context->driver_priv = context_dup;
-
- return Success;
+ struct i965_xvmc_context *private_context, *context_dup;
+ I830Ptr I830 = I830PTR(pScrn);
+
+ unsigned int blocknum =
+ (((context->width + 15) / 16) * ((context->height + 15) / 16));
+ unsigned int blocksize = 6 * blocknum * 64 * sizeof(short);
+ blocksize = (blocksize + 4095) & (~4095);
+ if ((private_context = Xcalloc(sizeof(*private_context))) == NULL) {
+ ErrorF("XVMC Can not allocate private context\n");
+ return BadAlloc;
+ }
+
+ if ((context_dup = Xcalloc(sizeof(*private_context))) == NULL) {
+ ErrorF("XVMC Can not allocate private context\n");
+ return BadAlloc;
+ }
+
+ private_context->is_g4x = IS_G4X(I830);
+ private_context->is_965_q = IS_965_Q(I830);
+ private_context->is_igdng = IS_IGDNG(I830);
+ private_context->comm.kernel_exec_fencing = 1;
+ private_context->comm.type = xvmc_driver->flag;
+
+ *num_privates = sizeof(*private_context) / sizeof(CARD32);
+ *private = (CARD32 *) private_context;
+ memcpy(context_dup, private_context, sizeof(*private_context));
+ context->driver_priv = context_dup;
+
+ return Success;
}
static void destroy_context(ScrnInfoPtr pScrn, XvMCContextPtr context)
{
- struct i965_xvmc_context *private_context;
- private_context = context->driver_priv;
- Xfree(private_context);
+ struct i965_xvmc_context *private_context;
+ private_context = context->driver_priv;
+ Xfree(private_context);
}
static int create_surface(ScrnInfoPtr pScrn, XvMCSurfacePtr surface,
- int *num_priv, CARD32 **priv)
+ int *num_priv, CARD32 ** priv)
{
XvMCContextPtr ctx = surface->context;
struct i965_xvmc_surface *priv_surface, *surface_dup;
struct i965_xvmc_context *priv_ctx = ctx->driver_priv;
int i;
- for (i = 0 ; i < I965_MAX_SURFACES; i++) {
- if (priv_ctx->surfaces[i] == NULL) {
- priv_surface = Xcalloc(sizeof(*priv_surface));
- if (priv_surface == NULL)
- return BadAlloc;
- surface_dup = Xcalloc(sizeof(*priv_surface));
- if (surface_dup == NULL)
- return BadAlloc;
-
- priv_surface->no = i;
- priv_surface->handle = priv_surface;
- priv_surface->w = ctx->width;
- priv_surface->h = ctx->height;
- priv_ctx->surfaces[i] = surface->driver_priv
- = priv_surface;
- memcpy(surface_dup, priv_surface, sizeof(*priv_surface));
- *num_priv = sizeof(*priv_surface)/sizeof(CARD32);
- *priv = (CARD32 *)surface_dup;
- break;
- }
+ for (i = 0; i < I965_MAX_SURFACES; i++) {
+ if (priv_ctx->surfaces[i] == NULL) {
+ priv_surface = Xcalloc(sizeof(*priv_surface));
+ if (priv_surface == NULL)
+ return BadAlloc;
+ surface_dup = Xcalloc(sizeof(*priv_surface));
+ if (surface_dup == NULL)
+ return BadAlloc;
+
+ priv_surface->no = i;
+ priv_surface->handle = priv_surface;
+ priv_surface->w = ctx->width;
+ priv_surface->h = ctx->height;
+ priv_ctx->surfaces[i] = surface->driver_priv
+ = priv_surface;
+ memcpy(surface_dup, priv_surface,
+ sizeof(*priv_surface));
+ *num_priv = sizeof(*priv_surface) / sizeof(CARD32);
+ *priv = (CARD32 *) surface_dup;
+ break;
+ }
}
if (i >= I965_MAX_SURFACES) {
- ErrorF("I965 XVMC too many surfaces in one context\n");
- return BadAlloc;
+ ErrorF("I965 XVMC too many surfaces in one context\n");
+ return BadAlloc;
}
-
+
return Success;
}
static void destory_surface(ScrnInfoPtr pScrn, XvMCSurfacePtr surface)
{
XvMCContextPtr ctx = surface->context;
- struct i965_xvmc_surface *priv_surface = surface->driver_priv;
+ struct i965_xvmc_surface *priv_surface = surface->driver_priv;
struct i965_xvmc_context *priv_ctx = ctx->driver_priv;
priv_ctx->surfaces[priv_surface->no] = NULL;
Xfree(priv_surface);
}
static int create_subpicture(ScrnInfoPtr pScrn, XvMCSubpicturePtr subpicture,
- int *num_priv, CARD32 **priv)
+ int *num_priv, CARD32 ** priv)
{
return Success;
}
@@ -150,32 +151,33 @@ static void destroy_subpicture(ScrnInfoPtr pScrn, XvMCSubpicturePtr subpicture)
}
static int put_image(ScrnInfoPtr pScrn,
- short src_x, short src_y,
- short drw_x, short drw_y, short src_w,
- short src_h, short drw_w, short drw_h,
- int id, unsigned char *buf, short width,
- short height, Bool sync, RegionPtr clipBoxes, pointer data,
- DrawablePtr pDraw)
+ short src_x, short src_y,
+ short drw_x, short drw_y, short src_w,
+ short src_h, short drw_w, short drw_h,
+ int id, unsigned char *buf, short width,
+ short height, Bool sync, RegionPtr clipBoxes, pointer data,
+ DrawablePtr pDraw)
{
I830Ptr pI830 = I830PTR(pScrn);
struct intel_xvmc_command *cmd = (struct intel_xvmc_command *)buf;
dri_bo *bo;
if (id == FOURCC_XVMC) {
- bo = intel_bo_gem_create_from_name(pI830->bufmgr, "surface", cmd->handle);
- dri_bo_pin(bo, 0x1000);
- /* XXX: KMS */
+ bo = intel_bo_gem_create_from_name(pI830->bufmgr, "surface",
+ cmd->handle);
+ dri_bo_pin(bo, 0x1000);
+ /* XXX: KMS */
#if 0
- buf = pI830->FbBase + bo->offset;
+ buf = pI830->FbBase + bo->offset;
#endif
}
XvPutImage(pScrn, src_x, src_y, drw_x, drw_y, src_w, src_h,
- drw_w, drw_h, id, buf, width, height, sync, clipBoxes,
- data, pDraw);
+ drw_w, drw_h, id, buf, width, height, sync, clipBoxes,
+ data, pDraw);
if (id == FOURCC_XVMC) {
- dri_bo_unpin(bo);
- dri_bo_unreference(bo);
+ dri_bo_unpin(bo);
+ dri_bo_unreference(bo);
}
return Success;
@@ -183,113 +185,109 @@ static int put_image(ScrnInfoPtr pScrn,
static Bool init(ScrnInfoPtr screen_info, XF86VideoAdaptorPtr adaptor)
{
- XvPutImage = adaptor->PutImage;
- adaptor->PutImage = put_image;
+ XvPutImage = adaptor->PutImage;
+ adaptor->PutImage = put_image;
- return TRUE;
+ return TRUE;
}
static void fini(ScrnInfoPtr screen_info)
{
}
-static XF86MCSurfaceInfoRec yv12_mpeg2_vld_surface =
-{
- FOURCC_YV12,
- XVMC_CHROMA_FORMAT_420,
- 0,
- 1936,
- 1096,
- 1920,
- 1080,
- XVMC_MPEG_2|XVMC_VLD,
- XVMC_INTRA_UNSIGNED,
- NULL
+static XF86MCSurfaceInfoRec yv12_mpeg2_vld_surface = {
+ FOURCC_YV12,
+ XVMC_CHROMA_FORMAT_420,
+ 0,
+ 1936,
+ 1096,
+ 1920,
+ 1080,
+ XVMC_MPEG_2 | XVMC_VLD,
+ XVMC_INTRA_UNSIGNED,
+ NULL
};
-static XF86MCSurfaceInfoRec yv12_mpeg2_surface =
-{
- FOURCC_YV12,
- XVMC_CHROMA_FORMAT_420,
- 0,
- 1936,
- 1096,
- 1920,
- 1080,
- XVMC_MPEG_2|XVMC_MOCOMP,
- /* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING,*/
- XVMC_INTRA_UNSIGNED,
- /* &yv12_subpicture_list*/
- NULL
+static XF86MCSurfaceInfoRec yv12_mpeg2_surface = {
+ FOURCC_YV12,
+ XVMC_CHROMA_FORMAT_420,
+ 0,
+ 1936,
+ 1096,
+ 1920,
+ 1080,
+ XVMC_MPEG_2 | XVMC_MOCOMP,
+ /* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
+ XVMC_INTRA_UNSIGNED,
+ /* &yv12_subpicture_list */
+ NULL
};
-static XF86MCSurfaceInfoRec yv12_mpeg1_surface =
-{
- FOURCC_YV12,
- XVMC_CHROMA_FORMAT_420,
- 0,
- 1920,
- 1080,
- 1920,
- 1080,
- XVMC_MPEG_1|XVMC_MOCOMP,
- /*XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING |
- XVMC_INTRA_UNSIGNED,*/
- XVMC_INTRA_UNSIGNED,
-
- /*&yv12_subpicture_list*/
- NULL
+static XF86MCSurfaceInfoRec yv12_mpeg1_surface = {
+ FOURCC_YV12,
+ XVMC_CHROMA_FORMAT_420,
+ 0,
+ 1920,
+ 1080,
+ 1920,
+ 1080,
+ XVMC_MPEG_1 | XVMC_MOCOMP,
+ /*XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING |
+ XVMC_INTRA_UNSIGNED, */
+ XVMC_INTRA_UNSIGNED,
+
+ /*&yv12_subpicture_list */
+ NULL
};
static XF86MCSurfaceInfoPtr surface_info[] = {
- &yv12_mpeg2_surface,
- &yv12_mpeg1_surface
+ &yv12_mpeg2_surface,
+ &yv12_mpeg1_surface
};
static XF86MCSurfaceInfoPtr surface_info_vld[] = {
- &yv12_mpeg2_vld_surface,
- &yv12_mpeg2_surface,
+ &yv12_mpeg2_vld_surface,
+ &yv12_mpeg2_surface,
};
static XF86MCAdaptorRec adaptor_vld = {
- .name = "Intel(R) Textured Video",
- .num_surfaces = sizeof(surface_info_vld)/sizeof(surface_info_vld[0]),
- .surfaces = surface_info_vld,
-
- .CreateContext = create_context,
- .DestroyContext = destroy_context,
- .CreateSurface = create_surface,
- .DestroySurface = destory_surface,
- .CreateSubpicture = create_subpicture,
- .DestroySubpicture = destroy_subpicture
+ .name = "Intel(R) Textured Video",
+ .num_surfaces = sizeof(surface_info_vld) / sizeof(surface_info_vld[0]),
+ .surfaces = surface_info_vld,
+
+ .CreateContext = create_context,
+ .DestroyContext = destroy_context,
+ .CreateSurface = create_surface,
+ .DestroySurface = destory_surface,
+ .CreateSubpicture = create_subpicture,
+ .DestroySubpicture = destroy_subpicture
};
static XF86MCAdaptorRec adaptor = {
- .name = "Intel(R) Textured Video",
- .num_surfaces = sizeof(surface_info)/sizeof(surface_info[0]),
- .surfaces = surface_info,
-
- .CreateContext = create_context,
- .DestroyContext = destroy_context,
- .CreateSurface = create_surface,
- .DestroySurface = destory_surface,
- .CreateSubpicture = create_subpicture,
- .DestroySubpicture = destroy_subpicture
+ .name = "Intel(R) Textured Video",
+ .num_surfaces = sizeof(surface_info) / sizeof(surface_info[0]),
+ .surfaces = surface_info,
+
+ .CreateContext = create_context,
+ .DestroyContext = destroy_context,
+ .CreateSurface = create_surface,
+ .DestroySurface = destory_surface,
+ .CreateSubpicture = create_subpicture,
+ .DestroySubpicture = destroy_subpicture
};
struct intel_xvmc_driver i965_xvmc_driver = {
- .name = "i965_xvmc",
- .adaptor = &adaptor,
- .flag = XVMC_I965_MPEG2_MC,
- .init = init,
- .fini = fini
+ .name = "i965_xvmc",
+ .adaptor = &adaptor,
+ .flag = XVMC_I965_MPEG2_MC,
+ .init = init,
+ .fini = fini
};
-struct intel_xvmc_driver vld_xvmc_driver = {
- .name = "xvmc_vld",
- .adaptor = &adaptor_vld,
- .flag = XVMC_I965_MPEG2_VLD,
- .init = init,
- .fini = fini
+struct intel_xvmc_driver vld_xvmc_driver = {
+ .name = "xvmc_vld",
+ .adaptor = &adaptor_vld,
+ .flag = XVMC_I965_MPEG2_VLD,
+ .init = init,
+ .fini = fini
};
-
diff --git a/src/i965_hwmc.h b/src/i965_hwmc.h
index 12d977b2..5bdd4525 100644
--- a/src/i965_hwmc.h
+++ b/src/i965_hwmc.h
@@ -1,28 +1,28 @@
#define I965_MC_STATIC_BUFFER_SIZE (1024*512)
#define I965_MAX_SURFACES 12
struct _i830_memory;
-struct drm_memory_block {
- struct _i830_memory *buffer;
- drm_handle_t handle;
- drmAddress ptr;
- size_t size;
- unsigned long offset;
+struct drm_memory_block {
+ struct _i830_memory *buffer;
+ drm_handle_t handle;
+ drmAddress ptr;
+ size_t size;
+ unsigned long offset;
};
struct i965_xvmc_surface {
- int w, h;
- unsigned int no;
- void *handle;
- dri_bo *bo;
+ int w, h;
+ unsigned int no;
+ void *handle;
+ dri_bo *bo;
};
struct i965_xvmc_context {
- struct _intel_xvmc_common comm;
- struct drm_memory_block static_buffer;
- struct drm_memory_block blocks;
- struct drm_memory_block slice;
- struct i965_xvmc_surface *surfaces[I965_MAX_SURFACES];
- unsigned int is_g4x:1;
- unsigned int is_965_q:1;
- unsigned int is_igdng:1;
+ struct _intel_xvmc_common comm;
+ struct drm_memory_block static_buffer;
+ struct drm_memory_block blocks;
+ struct drm_memory_block slice;
+ struct i965_xvmc_surface *surfaces[I965_MAX_SURFACES];
+ unsigned int is_g4x:1;
+ unsigned int is_965_q:1;
+ unsigned int is_igdng:1;
};
diff --git a/src/i965_render.c b/src/i965_render.c
index 7d8056ae..8fa3c0f1 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -52,48 +52,49 @@
#define VERTEX_BUFFER_SIZE (256 * VERTEX_FLOATS_PER_COMPOSITE)
struct blendinfo {
- Bool dst_alpha;
- Bool src_alpha;
- uint32_t src_blend;
- uint32_t dst_blend;
+ Bool dst_alpha;
+ Bool src_alpha;
+ uint32_t src_blend;
+ uint32_t dst_blend;
};
struct formatinfo {
- int fmt;
- uint32_t card_fmt;
+ int fmt;
+ uint32_t card_fmt;
};
// refer vol2, 3d rasterization 3.8.1
/* defined in brw_defines.h */
static struct blendinfo i965_blend_op[] = {
- /* Clear */
- {0, 0, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_ZERO},
- /* Src */
- {0, 0, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_ZERO},
- /* Dst */
- {0, 0, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_ONE},
- /* Over */
- {0, 1, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_INV_SRC_ALPHA},
- /* OverReverse */
- {1, 0, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_ONE},
- /* In */
- {1, 0, BRW_BLENDFACTOR_DST_ALPHA, BRW_BLENDFACTOR_ZERO},
- /* InReverse */
- {0, 1, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_SRC_ALPHA},
- /* Out */
- {1, 0, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_ZERO},
- /* OutReverse */
- {0, 1, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_INV_SRC_ALPHA},
- /* Atop */
- {1, 1, BRW_BLENDFACTOR_DST_ALPHA, BRW_BLENDFACTOR_INV_SRC_ALPHA},
- /* AtopReverse */
- {1, 1, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_SRC_ALPHA},
- /* Xor */
- {1, 1, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_INV_SRC_ALPHA},
- /* Add */
- {0, 0, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_ONE},
+ /* Clear */
+ {0, 0, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_ZERO},
+ /* Src */
+ {0, 0, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_ZERO},
+ /* Dst */
+ {0, 0, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_ONE},
+ /* Over */
+ {0, 1, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_INV_SRC_ALPHA},
+ /* OverReverse */
+ {1, 0, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_ONE},
+ /* In */
+ {1, 0, BRW_BLENDFACTOR_DST_ALPHA, BRW_BLENDFACTOR_ZERO},
+ /* InReverse */
+ {0, 1, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_SRC_ALPHA},
+ /* Out */
+ {1, 0, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_ZERO},
+ /* OutReverse */
+ {0, 1, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_INV_SRC_ALPHA},
+ /* Atop */
+ {1, 1, BRW_BLENDFACTOR_DST_ALPHA, BRW_BLENDFACTOR_INV_SRC_ALPHA},
+ /* AtopReverse */
+ {1, 1, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_SRC_ALPHA},
+ /* Xor */
+ {1, 1, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_INV_SRC_ALPHA},
+ /* Add */
+ {0, 0, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_ONE},
};
+
/**
* Highest-valued BLENDFACTOR used in i965_blend_op.
*
@@ -107,149 +108,149 @@ static struct blendinfo i965_blend_op[] = {
* 1.7.2
*/
static struct formatinfo i965_tex_formats[] = {
- {PICT_a8r8g8b8, BRW_SURFACEFORMAT_B8G8R8A8_UNORM },
- {PICT_x8r8g8b8, BRW_SURFACEFORMAT_B8G8R8X8_UNORM },
- {PICT_a8b8g8r8, BRW_SURFACEFORMAT_R8G8B8A8_UNORM },
- {PICT_x8b8g8r8, BRW_SURFACEFORMAT_R8G8B8X8_UNORM },
- {PICT_r5g6b5, BRW_SURFACEFORMAT_B5G6R5_UNORM },
- {PICT_a1r5g5b5, BRW_SURFACEFORMAT_B5G5R5A1_UNORM },
- {PICT_a8, BRW_SURFACEFORMAT_A8_UNORM },
+ {PICT_a8r8g8b8, BRW_SURFACEFORMAT_B8G8R8A8_UNORM},
+ {PICT_x8r8g8b8, BRW_SURFACEFORMAT_B8G8R8X8_UNORM},
+ {PICT_a8b8g8r8, BRW_SURFACEFORMAT_R8G8B8A8_UNORM},
+ {PICT_x8b8g8r8, BRW_SURFACEFORMAT_R8G8B8X8_UNORM},
+ {PICT_r5g6b5, BRW_SURFACEFORMAT_B5G6R5_UNORM},
+ {PICT_a1r5g5b5, BRW_SURFACEFORMAT_B5G5R5A1_UNORM},
+ {PICT_a8, BRW_SURFACEFORMAT_A8_UNORM},
};
static void i965_get_blend_cntl(int op, PicturePtr pMask, uint32_t dst_format,
- uint32_t *sblend, uint32_t *dblend)
+ uint32_t * sblend, uint32_t * dblend)
{
- *sblend = i965_blend_op[op].src_blend;
- *dblend = i965_blend_op[op].dst_blend;
-
- /* If there's no dst alpha channel, adjust the blend op so that we'll treat
- * it as always 1.
- */
- if (PICT_FORMAT_A(dst_format) == 0 && i965_blend_op[op].dst_alpha) {
- if (*sblend == BRW_BLENDFACTOR_DST_ALPHA)
- *sblend = BRW_BLENDFACTOR_ONE;
- else if (*sblend == BRW_BLENDFACTOR_INV_DST_ALPHA)
- *sblend = BRW_BLENDFACTOR_ZERO;
- }
-
- /* If the source alpha is being used, then we should only be in a case where
- * the source blend factor is 0, and the source blend value is the mask
- * channels multiplied by the source picture's alpha.
- */
- if (pMask && pMask->componentAlpha && PICT_FORMAT_RGB(pMask->format)
- && i965_blend_op[op].src_alpha) {
- if (*dblend == BRW_BLENDFACTOR_SRC_ALPHA) {
- *dblend = BRW_BLENDFACTOR_SRC_COLOR;
- } else if (*dblend == BRW_BLENDFACTOR_INV_SRC_ALPHA) {
- *dblend = BRW_BLENDFACTOR_INV_SRC_COLOR;
- }
- }
+ *sblend = i965_blend_op[op].src_blend;
+ *dblend = i965_blend_op[op].dst_blend;
+
+ /* If there's no dst alpha channel, adjust the blend op so that we'll treat
+ * it as always 1.
+ */
+ if (PICT_FORMAT_A(dst_format) == 0 && i965_blend_op[op].dst_alpha) {
+ if (*sblend == BRW_BLENDFACTOR_DST_ALPHA)
+ *sblend = BRW_BLENDFACTOR_ONE;
+ else if (*sblend == BRW_BLENDFACTOR_INV_DST_ALPHA)
+ *sblend = BRW_BLENDFACTOR_ZERO;
+ }
+
+ /* If the source alpha is being used, then we should only be in a case where
+ * the source blend factor is 0, and the source blend value is the mask
+ * channels multiplied by the source picture's alpha.
+ */
+ if (pMask && pMask->componentAlpha && PICT_FORMAT_RGB(pMask->format)
+ && i965_blend_op[op].src_alpha) {
+ if (*dblend == BRW_BLENDFACTOR_SRC_ALPHA) {
+ *dblend = BRW_BLENDFACTOR_SRC_COLOR;
+ } else if (*dblend == BRW_BLENDFACTOR_INV_SRC_ALPHA) {
+ *dblend = BRW_BLENDFACTOR_INV_SRC_COLOR;
+ }
+ }
}
-static Bool i965_get_dest_format(PicturePtr pDstPicture, uint32_t *dst_format)
+static Bool i965_get_dest_format(PicturePtr pDstPicture, uint32_t * dst_format)
{
- ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
-
- switch (pDstPicture->format) {
- case PICT_a8r8g8b8:
- case PICT_x8r8g8b8:
- *dst_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
- break;
- case PICT_r5g6b5:
- *dst_format = BRW_SURFACEFORMAT_B5G6R5_UNORM;
- break;
- case PICT_a1r5g5b5:
- *dst_format = BRW_SURFACEFORMAT_B5G5R5A1_UNORM;
- break;
- case PICT_x1r5g5b5:
- *dst_format = BRW_SURFACEFORMAT_B5G5R5X1_UNORM;
- break;
- case PICT_a8:
- *dst_format = BRW_SURFACEFORMAT_A8_UNORM;
- break;
- case PICT_a4r4g4b4:
- case PICT_x4r4g4b4:
- *dst_format = BRW_SURFACEFORMAT_B4G4R4A4_UNORM;
- break;
- default:
- I830FALLBACK("Unsupported dest format 0x%x\n",
- (int)pDstPicture->format);
- }
-
- return TRUE;
+ ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
+
+ switch (pDstPicture->format) {
+ case PICT_a8r8g8b8:
+ case PICT_x8r8g8b8:
+ *dst_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
+ break;
+ case PICT_r5g6b5:
+ *dst_format = BRW_SURFACEFORMAT_B5G6R5_UNORM;
+ break;
+ case PICT_a1r5g5b5:
+ *dst_format = BRW_SURFACEFORMAT_B5G5R5A1_UNORM;
+ break;
+ case PICT_x1r5g5b5:
+ *dst_format = BRW_SURFACEFORMAT_B5G5R5X1_UNORM;
+ break;
+ case PICT_a8:
+ *dst_format = BRW_SURFACEFORMAT_A8_UNORM;
+ break;
+ case PICT_a4r4g4b4:
+ case PICT_x4r4g4b4:
+ *dst_format = BRW_SURFACEFORMAT_B4G4R4A4_UNORM;
+ break;
+ default:
+ I830FALLBACK("Unsupported dest format 0x%x\n",
+ (int)pDstPicture->format);
+ }
+
+ return TRUE;
}
-static Bool i965_check_composite_texture(ScrnInfoPtr pScrn, PicturePtr pPict, int unit)
+static Bool i965_check_composite_texture(ScrnInfoPtr pScrn, PicturePtr pPict,
+ int unit)
{
- if (pPict->repeatType > RepeatReflect)
- I830FALLBACK("extended repeat (%d) not supported\n",
- pPict->repeatType);
+ if (pPict->repeatType > RepeatReflect)
+ I830FALLBACK("extended repeat (%d) not supported\n",
+ pPict->repeatType);
- if (pPict->filter != PictFilterNearest &&
- pPict->filter != PictFilterBilinear)
- {
- I830FALLBACK("Unsupported filter 0x%x\n", pPict->filter);
- }
+ if (pPict->filter != PictFilterNearest &&
+ pPict->filter != PictFilterBilinear) {
+ I830FALLBACK("Unsupported filter 0x%x\n", pPict->filter);
+ }
- if (pPict->pDrawable)
- {
- int w, h, i;
+ if (pPict->pDrawable) {
+ int w, h, i;
- w = pPict->pDrawable->width;
- h = pPict->pDrawable->height;
- if ((w > 8192) || (h > 8192))
- I830FALLBACK("Picture w/h too large (%dx%d)\n", w, h);
+ w = pPict->pDrawable->width;
+ h = pPict->pDrawable->height;
+ if ((w > 8192) || (h > 8192))
+ I830FALLBACK("Picture w/h too large (%dx%d)\n", w, h);
- for (i = 0; i < sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]);
- i++)
- {
- if (i965_tex_formats[i].fmt == pPict->format)
- break;
+ for (i = 0;
+ i < sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]);
+ i++) {
+ if (i965_tex_formats[i].fmt == pPict->format)
+ break;
+ }
+ if (i == sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]))
+ I830FALLBACK("Unsupported picture format 0x%x\n",
+ (int)pPict->format);
}
- if (i == sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]))
- I830FALLBACK("Unsupported picture format 0x%x\n",
- (int)pPict->format);
- }
- return TRUE;
+ return TRUE;
}
Bool
i965_check_composite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
PicturePtr pDstPicture)
{
- ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
- uint32_t tmp1;
-
- /* Check for unsupported compositing operations. */
- if (op >= sizeof(i965_blend_op) / sizeof(i965_blend_op[0]))
- I830FALLBACK("Unsupported Composite op 0x%x\n", op);
-
- if (pMaskPicture && pMaskPicture->componentAlpha &&
- PICT_FORMAT_RGB(pMaskPicture->format)) {
- /* Check if it's component alpha that relies on a source alpha and on
- * the source value. We can only get one of those into the single
- * source value that we get to blend with.
- */
- if (i965_blend_op[op].src_alpha &&
- (i965_blend_op[op].src_blend != BRW_BLENDFACTOR_ZERO))
- {
- I830FALLBACK("Component alpha not supported with source "
- "alpha and source value blending.\n");
+ ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
+ uint32_t tmp1;
+
+ /* Check for unsupported compositing operations. */
+ if (op >= sizeof(i965_blend_op) / sizeof(i965_blend_op[0]))
+ I830FALLBACK("Unsupported Composite op 0x%x\n", op);
+
+ if (pMaskPicture && pMaskPicture->componentAlpha &&
+ PICT_FORMAT_RGB(pMaskPicture->format)) {
+ /* Check if it's component alpha that relies on a source alpha and on
+ * the source value. We can only get one of those into the single
+ * source value that we get to blend with.
+ */
+ if (i965_blend_op[op].src_alpha &&
+ (i965_blend_op[op].src_blend != BRW_BLENDFACTOR_ZERO)) {
+ I830FALLBACK
+ ("Component alpha not supported with source "
+ "alpha and source value blending.\n");
+ }
}
- }
- if (!i965_check_composite_texture(pScrn, pSrcPicture, 0))
- I830FALLBACK("Check Src picture texture\n");
- if (pMaskPicture != NULL && !i965_check_composite_texture(pScrn, pMaskPicture, 1))
- I830FALLBACK("Check Mask picture texture\n");
+ if (!i965_check_composite_texture(pScrn, pSrcPicture, 0))
+ I830FALLBACK("Check Src picture texture\n");
+ if (pMaskPicture != NULL
+ && !i965_check_composite_texture(pScrn, pMaskPicture, 1))
+ I830FALLBACK("Check Mask picture texture\n");
- if (!i965_get_dest_format(pDstPicture, &tmp1))
- I830FALLBACK("Get Color buffer format\n");
+ if (!i965_get_dest_format(pDstPicture, &tmp1))
+ I830FALLBACK("Get Color buffer format\n");
- return TRUE;
+ return TRUE;
}
@@ -261,8 +262,8 @@ i965_check_composite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
#define URB_CS_ENTRY_SIZE 0
#define URB_CS_ENTRIES 0
-#define URB_VS_ENTRY_SIZE 1 // each 512-bit row
-#define URB_VS_ENTRIES 8 // we needs at least 8 entries
+#define URB_VS_ENTRY_SIZE 1 // each 512-bit row
+#define URB_VS_ENTRIES 8 // we needs at least 8 entries
#define URB_GS_ENTRY_SIZE 0
#define URB_GS_ENTRIES 0
@@ -275,25 +276,25 @@ i965_check_composite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
static const uint32_t sip_kernel_static[][4] = {
/* wait (1) a0<1>UW a145<0,1,0>UW { align1 + } */
- { 0x00000030, 0x20000108, 0x00001220, 0x00000000 },
+ {0x00000030, 0x20000108, 0x00001220, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
};
/*
@@ -316,21 +317,21 @@ static const uint32_t sf_kernel_mask_static[][4] = {
#define PS_KERNEL_NUM_GRF 32
#define PS_MAX_THREADS 48
-static const uint32_t ps_kernel_nomask_affine_static [][4] = {
+static const uint32_t ps_kernel_nomask_affine_static[][4] = {
#include "exa_wm_xy.g4b"
#include "exa_wm_src_affine.g4b"
#include "exa_wm_src_sample_argb.g4b"
#include "exa_wm_write.g4b"
};
-static const uint32_t ps_kernel_nomask_projective_static [][4] = {
+static const uint32_t ps_kernel_nomask_projective_static[][4] = {
#include "exa_wm_xy.g4b"
#include "exa_wm_src_projective.g4b"
#include "exa_wm_src_sample_argb.g4b"
#include "exa_wm_write.g4b"
};
-static const uint32_t ps_kernel_maskca_affine_static [][4] = {
+static const uint32_t ps_kernel_maskca_affine_static[][4] = {
#include "exa_wm_xy.g4b"
#include "exa_wm_src_affine.g4b"
#include "exa_wm_src_sample_argb.g4b"
@@ -340,7 +341,7 @@ static const uint32_t ps_kernel_maskca_affine_static [][4] = {
#include "exa_wm_write.g4b"
};
-static const uint32_t ps_kernel_maskca_projective_static [][4] = {
+static const uint32_t ps_kernel_maskca_projective_static[][4] = {
#include "exa_wm_xy.g4b"
#include "exa_wm_src_projective.g4b"
#include "exa_wm_src_sample_argb.g4b"
@@ -350,7 +351,7 @@ static const uint32_t ps_kernel_maskca_projective_static [][4] = {
#include "exa_wm_write.g4b"
};
-static const uint32_t ps_kernel_maskca_srcalpha_affine_static [][4] = {
+static const uint32_t ps_kernel_maskca_srcalpha_affine_static[][4] = {
#include "exa_wm_xy.g4b"
#include "exa_wm_src_affine.g4b"
#include "exa_wm_src_sample_a.g4b"
@@ -360,7 +361,7 @@ static const uint32_t ps_kernel_maskca_srcalpha_affine_static [][4] = {
#include "exa_wm_write.g4b"
};
-static const uint32_t ps_kernel_maskca_srcalpha_projective_static [][4] = {
+static const uint32_t ps_kernel_maskca_srcalpha_projective_static[][4] = {
#include "exa_wm_xy.g4b"
#include "exa_wm_src_projective.g4b"
#include "exa_wm_src_sample_a.g4b"
@@ -370,7 +371,7 @@ static const uint32_t ps_kernel_maskca_srcalpha_projective_static [][4] = {
#include "exa_wm_write.g4b"
};
-static const uint32_t ps_kernel_masknoca_affine_static [][4] = {
+static const uint32_t ps_kernel_masknoca_affine_static[][4] = {
#include "exa_wm_xy.g4b"
#include "exa_wm_src_affine.g4b"
#include "exa_wm_src_sample_argb.g4b"
@@ -380,7 +381,7 @@ static const uint32_t ps_kernel_masknoca_affine_static [][4] = {
#include "exa_wm_write.g4b"
};
-static const uint32_t ps_kernel_masknoca_projective_static [][4] = {
+static const uint32_t ps_kernel_masknoca_projective_static[][4] = {
#include "exa_wm_xy.g4b"
#include "exa_wm_src_projective.g4b"
#include "exa_wm_src_sample_argb.g4b"
@@ -399,21 +400,21 @@ static const uint32_t sf_kernel_mask_static_gen5[][4] = {
#include "exa_sf_mask.g4b.gen5"
};
-static const uint32_t ps_kernel_nomask_affine_static_gen5 [][4] = {
+static const uint32_t ps_kernel_nomask_affine_static_gen5[][4] = {
#include "exa_wm_xy.g4b.gen5"
#include "exa_wm_src_affine.g4b.gen5"
#include "exa_wm_src_sample_argb.g4b.gen5"
#include "exa_wm_write.g4b.gen5"
};
-static const uint32_t ps_kernel_nomask_projective_static_gen5 [][4] = {
+static const uint32_t ps_kernel_nomask_projective_static_gen5[][4] = {
#include "exa_wm_xy.g4b.gen5"
#include "exa_wm_src_projective.g4b.gen5"
#include "exa_wm_src_sample_argb.g4b.gen5"
#include "exa_wm_write.g4b.gen5"
};
-static const uint32_t ps_kernel_maskca_affine_static_gen5 [][4] = {
+static const uint32_t ps_kernel_maskca_affine_static_gen5[][4] = {
#include "exa_wm_xy.g4b.gen5"
#include "exa_wm_src_affine.g4b.gen5"
#include "exa_wm_src_sample_argb.g4b.gen5"
@@ -423,7 +424,7 @@ static const uint32_t ps_kernel_maskca_affine_static_gen5 [][4] = {
#include "exa_wm_write.g4b.gen5"
};
-static const uint32_t ps_kernel_maskca_projective_static_gen5 [][4] = {
+static const uint32_t ps_kernel_maskca_projective_static_gen5[][4] = {
#include "exa_wm_xy.g4b.gen5"
#include "exa_wm_src_projective.g4b.gen5"
#include "exa_wm_src_sample_argb.g4b.gen5"
@@ -433,7 +434,7 @@ static const uint32_t ps_kernel_maskca_projective_static_gen5 [][4] = {
#include "exa_wm_write.g4b.gen5"
};
-static const uint32_t ps_kernel_maskca_srcalpha_affine_static_gen5 [][4] = {
+static const uint32_t ps_kernel_maskca_srcalpha_affine_static_gen5[][4] = {
#include "exa_wm_xy.g4b.gen5"
#include "exa_wm_src_affine.g4b.gen5"
#include "exa_wm_src_sample_a.g4b.gen5"
@@ -443,7 +444,7 @@ static const uint32_t ps_kernel_maskca_srcalpha_affine_static_gen5 [][4] = {
#include "exa_wm_write.g4b.gen5"
};
-static const uint32_t ps_kernel_maskca_srcalpha_projective_static_gen5 [][4] = {
+static const uint32_t ps_kernel_maskca_srcalpha_projective_static_gen5[][4] = {
#include "exa_wm_xy.g4b.gen5"
#include "exa_wm_src_projective.g4b.gen5"
#include "exa_wm_src_sample_a.g4b.gen5"
@@ -453,7 +454,7 @@ static const uint32_t ps_kernel_maskca_srcalpha_projective_static_gen5 [][4] = {
#include "exa_wm_write.g4b.gen5"
};
-static const uint32_t ps_kernel_masknoca_affine_static_gen5 [][4] = {
+static const uint32_t ps_kernel_masknoca_affine_static_gen5[][4] = {
#include "exa_wm_xy.g4b.gen5"
#include "exa_wm_src_affine.g4b.gen5"
#include "exa_wm_src_sample_argb.g4b.gen5"
@@ -463,7 +464,7 @@ static const uint32_t ps_kernel_masknoca_affine_static_gen5 [][4] = {
#include "exa_wm_write.g4b.gen5"
};
-static const uint32_t ps_kernel_masknoca_projective_static_gen5 [][4] = {
+static const uint32_t ps_kernel_masknoca_projective_static_gen5[][4] = {
#include "exa_wm_xy.g4b.gen5"
#include "exa_wm_src_projective.g4b.gen5"
#include "exa_wm_src_sample_argb.g4b.gen5"
@@ -487,135 +488,136 @@ static const uint32_t ps_kernel_masknoca_projective_static_gen5 [][4] = {
#define PAD64(previous, idx) PAD64_MULTI(previous, idx, 1)
typedef enum {
- SAMPLER_STATE_FILTER_NEAREST,
- SAMPLER_STATE_FILTER_BILINEAR,
- SAMPLER_STATE_FILTER_COUNT
+ SAMPLER_STATE_FILTER_NEAREST,
+ SAMPLER_STATE_FILTER_BILINEAR,
+ SAMPLER_STATE_FILTER_COUNT
} sampler_state_filter_t;
typedef enum {
- SAMPLER_STATE_EXTEND_NONE,
- SAMPLER_STATE_EXTEND_REPEAT,
- SAMPLER_STATE_EXTEND_PAD,
- SAMPLER_STATE_EXTEND_REFLECT,
- SAMPLER_STATE_EXTEND_COUNT
+ SAMPLER_STATE_EXTEND_NONE,
+ SAMPLER_STATE_EXTEND_REPEAT,
+ SAMPLER_STATE_EXTEND_PAD,
+ SAMPLER_STATE_EXTEND_REFLECT,
+ SAMPLER_STATE_EXTEND_COUNT
} sampler_state_extend_t;
typedef enum {
- WM_KERNEL_NOMASK_AFFINE,
- WM_KERNEL_NOMASK_PROJECTIVE,
- WM_KERNEL_MASKCA_AFFINE,
- WM_KERNEL_MASKCA_PROJECTIVE,
- WM_KERNEL_MASKCA_SRCALPHA_AFFINE,
- WM_KERNEL_MASKCA_SRCALPHA_PROJECTIVE,
- WM_KERNEL_MASKNOCA_AFFINE,
- WM_KERNEL_MASKNOCA_PROJECTIVE,
- WM_KERNEL_COUNT
+ WM_KERNEL_NOMASK_AFFINE,
+ WM_KERNEL_NOMASK_PROJECTIVE,
+ WM_KERNEL_MASKCA_AFFINE,
+ WM_KERNEL_MASKCA_PROJECTIVE,
+ WM_KERNEL_MASKCA_SRCALPHA_AFFINE,
+ WM_KERNEL_MASKCA_SRCALPHA_PROJECTIVE,
+ WM_KERNEL_MASKNOCA_AFFINE,
+ WM_KERNEL_MASKNOCA_PROJECTIVE,
+ WM_KERNEL_COUNT
} wm_kernel_t;
#define KERNEL(kernel_enum, kernel, masked) \
[kernel_enum] = {&kernel, sizeof(kernel), masked}
struct wm_kernel_info {
- void *data;
- unsigned int size;
- Bool has_mask;
+ void *data;
+ unsigned int size;
+ Bool has_mask;
};
static struct wm_kernel_info wm_kernels[] = {
- KERNEL(WM_KERNEL_NOMASK_AFFINE,
- ps_kernel_nomask_affine_static, FALSE),
- KERNEL(WM_KERNEL_NOMASK_PROJECTIVE,
- ps_kernel_nomask_projective_static, FALSE),
- KERNEL(WM_KERNEL_MASKCA_AFFINE,
- ps_kernel_maskca_affine_static, TRUE),
- KERNEL(WM_KERNEL_MASKCA_PROJECTIVE,
- ps_kernel_maskca_projective_static, TRUE),
- KERNEL(WM_KERNEL_MASKCA_SRCALPHA_AFFINE,
- ps_kernel_maskca_srcalpha_affine_static, TRUE),
- KERNEL(WM_KERNEL_MASKCA_SRCALPHA_PROJECTIVE,
- ps_kernel_maskca_srcalpha_projective_static, TRUE),
- KERNEL(WM_KERNEL_MASKNOCA_AFFINE,
- ps_kernel_masknoca_affine_static, TRUE),
- KERNEL(WM_KERNEL_MASKNOCA_PROJECTIVE,
- ps_kernel_masknoca_projective_static, TRUE),
+ KERNEL(WM_KERNEL_NOMASK_AFFINE,
+ ps_kernel_nomask_affine_static, FALSE),
+ KERNEL(WM_KERNEL_NOMASK_PROJECTIVE,
+ ps_kernel_nomask_projective_static, FALSE),
+ KERNEL(WM_KERNEL_MASKCA_AFFINE,
+ ps_kernel_maskca_affine_static, TRUE),
+ KERNEL(WM_KERNEL_MASKCA_PROJECTIVE,
+ ps_kernel_maskca_projective_static, TRUE),
+ KERNEL(WM_KERNEL_MASKCA_SRCALPHA_AFFINE,
+ ps_kernel_maskca_srcalpha_affine_static, TRUE),
+ KERNEL(WM_KERNEL_MASKCA_SRCALPHA_PROJECTIVE,
+ ps_kernel_maskca_srcalpha_projective_static, TRUE),
+ KERNEL(WM_KERNEL_MASKNOCA_AFFINE,
+ ps_kernel_masknoca_affine_static, TRUE),
+ KERNEL(WM_KERNEL_MASKNOCA_PROJECTIVE,
+ ps_kernel_masknoca_projective_static, TRUE),
};
static struct wm_kernel_info wm_kernels_gen5[] = {
- KERNEL(WM_KERNEL_NOMASK_AFFINE,
- ps_kernel_nomask_affine_static_gen5, FALSE),
- KERNEL(WM_KERNEL_NOMASK_PROJECTIVE,
- ps_kernel_nomask_projective_static_gen5, FALSE),
- KERNEL(WM_KERNEL_MASKCA_AFFINE,
- ps_kernel_maskca_affine_static_gen5, TRUE),
- KERNEL(WM_KERNEL_MASKCA_PROJECTIVE,
- ps_kernel_maskca_projective_static_gen5, TRUE),
- KERNEL(WM_KERNEL_MASKCA_SRCALPHA_AFFINE,
- ps_kernel_maskca_srcalpha_affine_static_gen5, TRUE),
- KERNEL(WM_KERNEL_MASKCA_SRCALPHA_PROJECTIVE,
- ps_kernel_maskca_srcalpha_projective_static_gen5, TRUE),
- KERNEL(WM_KERNEL_MASKNOCA_AFFINE,
- ps_kernel_masknoca_affine_static_gen5, TRUE),
- KERNEL(WM_KERNEL_MASKNOCA_PROJECTIVE,
- ps_kernel_masknoca_projective_static_gen5, TRUE),
+ KERNEL(WM_KERNEL_NOMASK_AFFINE,
+ ps_kernel_nomask_affine_static_gen5, FALSE),
+ KERNEL(WM_KERNEL_NOMASK_PROJECTIVE,
+ ps_kernel_nomask_projective_static_gen5, FALSE),
+ KERNEL(WM_KERNEL_MASKCA_AFFINE,
+ ps_kernel_maskca_affine_static_gen5, TRUE),
+ KERNEL(WM_KERNEL_MASKCA_PROJECTIVE,
+ ps_kernel_maskca_projective_static_gen5, TRUE),
+ KERNEL(WM_KERNEL_MASKCA_SRCALPHA_AFFINE,
+ ps_kernel_maskca_srcalpha_affine_static_gen5, TRUE),
+ KERNEL(WM_KERNEL_MASKCA_SRCALPHA_PROJECTIVE,
+ ps_kernel_maskca_srcalpha_projective_static_gen5, TRUE),
+ KERNEL(WM_KERNEL_MASKNOCA_AFFINE,
+ ps_kernel_masknoca_affine_static_gen5, TRUE),
+ KERNEL(WM_KERNEL_MASKNOCA_PROJECTIVE,
+ ps_kernel_masknoca_projective_static_gen5, TRUE),
};
+
#undef KERNEL
typedef struct _brw_cc_unit_state_padded {
- struct brw_cc_unit_state state;
- char pad[64 - sizeof (struct brw_cc_unit_state)];
+ struct brw_cc_unit_state state;
+ char pad[64 - sizeof(struct brw_cc_unit_state)];
} brw_cc_unit_state_padded;
typedef struct brw_surface_state_padded {
- struct brw_surface_state state;
- char pad[32 - sizeof (struct brw_surface_state)];
+ struct brw_surface_state state;
+ char pad[32 - sizeof(struct brw_surface_state)];
} brw_surface_state_padded;
struct gen4_cc_unit_state {
- /* Index by [src_blend][dst_blend] */
- brw_cc_unit_state_padded cc_state[BRW_BLENDFACTOR_COUNT]
- [BRW_BLENDFACTOR_COUNT];
+ /* Index by [src_blend][dst_blend] */
+ brw_cc_unit_state_padded cc_state[BRW_BLENDFACTOR_COUNT]
+ [BRW_BLENDFACTOR_COUNT];
};
typedef float gen4_vertex_buffer[VERTEX_BUFFER_SIZE];
typedef struct gen4_composite_op {
- int op;
- PicturePtr source_picture;
- PicturePtr mask_picture;
- PicturePtr dest_picture;
- PixmapPtr source;
- PixmapPtr mask;
- PixmapPtr dest;
- drm_intel_bo *binding_table_bo;
- sampler_state_filter_t src_filter;
- sampler_state_filter_t mask_filter;
- sampler_state_extend_t src_extend;
- sampler_state_extend_t mask_extend;
- Bool is_affine;
- wm_kernel_t wm_kernel;
+ int op;
+ PicturePtr source_picture;
+ PicturePtr mask_picture;
+ PicturePtr dest_picture;
+ PixmapPtr source;
+ PixmapPtr mask;
+ PixmapPtr dest;
+ drm_intel_bo *binding_table_bo;
+ sampler_state_filter_t src_filter;
+ sampler_state_filter_t mask_filter;
+ sampler_state_extend_t src_extend;
+ sampler_state_extend_t mask_extend;
+ Bool is_affine;
+ wm_kernel_t wm_kernel;
} gen4_composite_op;
/** Private data for gen4 render accel implementation. */
struct gen4_render_state {
- drm_intel_bo *vs_state_bo;
- drm_intel_bo *sf_state_bo;
- drm_intel_bo *sf_mask_state_bo;
- drm_intel_bo *cc_state_bo;
- drm_intel_bo *wm_state_bo[WM_KERNEL_COUNT]
- [SAMPLER_STATE_FILTER_COUNT]
- [SAMPLER_STATE_EXTEND_COUNT]
- [SAMPLER_STATE_FILTER_COUNT]
- [SAMPLER_STATE_EXTEND_COUNT];
- drm_intel_bo *wm_kernel_bo[WM_KERNEL_COUNT];
-
- drm_intel_bo *sip_kernel_bo;
- dri_bo* vertex_buffer_bo;
-
- gen4_composite_op composite_op;
-
- int vb_offset;
- int vertex_size;
-
- Bool needs_state_emit;
+ drm_intel_bo *vs_state_bo;
+ drm_intel_bo *sf_state_bo;
+ drm_intel_bo *sf_mask_state_bo;
+ drm_intel_bo *cc_state_bo;
+ drm_intel_bo *wm_state_bo[WM_KERNEL_COUNT]
+ [SAMPLER_STATE_FILTER_COUNT]
+ [SAMPLER_STATE_EXTEND_COUNT]
+ [SAMPLER_STATE_FILTER_COUNT]
+ [SAMPLER_STATE_EXTEND_COUNT];
+ drm_intel_bo *wm_kernel_bo[WM_KERNEL_COUNT];
+
+ drm_intel_bo *sip_kernel_bo;
+ dri_bo *vertex_buffer_bo;
+
+ gen4_composite_op composite_op;
+
+ int vb_offset;
+ int vertex_size;
+
+ Bool needs_state_emit;
};
/**
@@ -625,409 +627,400 @@ struct gen4_render_state {
* calculate dA/dx and dA/dy. Hand these interpolation coefficients
* back to SF which then hands pixels off to WM.
*/
-static drm_intel_bo *
-gen4_create_sf_state(ScrnInfoPtr scrn, drm_intel_bo *kernel_bo)
+static drm_intel_bo *gen4_create_sf_state(ScrnInfoPtr scrn,
+ drm_intel_bo * kernel_bo)
{
- I830Ptr pI830 = I830PTR(scrn);
- struct brw_sf_unit_state *sf_state;
- drm_intel_bo *sf_state_bo;
-
- sf_state_bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 SF state",
- sizeof(*sf_state), 4096);
- drm_intel_bo_map(sf_state_bo, TRUE);
- sf_state = sf_state_bo->virtual;
-
- memset(sf_state, 0, sizeof(*sf_state));
- sf_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(SF_KERNEL_NUM_GRF);
- sf_state->thread0.kernel_start_pointer =
- intel_emit_reloc(sf_state_bo,
- offsetof(struct brw_sf_unit_state, thread0),
- kernel_bo, sf_state->thread0.grf_reg_count << 1,
- I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
- sf_state->sf1.single_program_flow = 1;
- sf_state->sf1.binding_table_entry_count = 0;
- sf_state->sf1.thread_priority = 0;
- sf_state->sf1.floating_point_mode = 0; /* Mesa does this */
- sf_state->sf1.illegal_op_exception_enable = 1;
- sf_state->sf1.mask_stack_exception_enable = 1;
- sf_state->sf1.sw_exception_enable = 1;
- sf_state->thread2.per_thread_scratch_space = 0;
- /* scratch space is not used in our kernel */
- sf_state->thread2.scratch_space_base_pointer = 0;
- sf_state->thread3.const_urb_entry_read_length = 0; /* no const URBs */
- sf_state->thread3.const_urb_entry_read_offset = 0; /* no const URBs */
- sf_state->thread3.urb_entry_read_length = 1; /* 1 URB per vertex */
- /* don't smash vertex header, read start from dw8 */
- sf_state->thread3.urb_entry_read_offset = 1;
- sf_state->thread3.dispatch_grf_start_reg = 3;
- sf_state->thread4.max_threads = SF_MAX_THREADS - 1;
- sf_state->thread4.urb_entry_allocation_size = URB_SF_ENTRY_SIZE - 1;
- sf_state->thread4.nr_urb_entries = URB_SF_ENTRIES;
- sf_state->thread4.stats_enable = 1;
- sf_state->sf5.viewport_transform = FALSE; /* skip viewport */
- sf_state->sf6.cull_mode = BRW_CULLMODE_NONE;
- sf_state->sf6.scissor = 0;
- sf_state->sf7.trifan_pv = 2;
- sf_state->sf6.dest_org_vbias = 0x8;
- sf_state->sf6.dest_org_hbias = 0x8;
-
- drm_intel_bo_unmap(sf_state_bo);
-
- return sf_state_bo;
+ I830Ptr pI830 = I830PTR(scrn);
+ struct brw_sf_unit_state *sf_state;
+ drm_intel_bo *sf_state_bo;
+
+ sf_state_bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 SF state",
+ sizeof(*sf_state), 4096);
+ drm_intel_bo_map(sf_state_bo, TRUE);
+ sf_state = sf_state_bo->virtual;
+
+ memset(sf_state, 0, sizeof(*sf_state));
+ sf_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(SF_KERNEL_NUM_GRF);
+ sf_state->thread0.kernel_start_pointer =
+ intel_emit_reloc(sf_state_bo,
+ offsetof(struct brw_sf_unit_state, thread0),
+ kernel_bo, sf_state->thread0.grf_reg_count << 1,
+ I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
+ sf_state->sf1.single_program_flow = 1;
+ sf_state->sf1.binding_table_entry_count = 0;
+ sf_state->sf1.thread_priority = 0;
+ sf_state->sf1.floating_point_mode = 0; /* Mesa does this */
+ sf_state->sf1.illegal_op_exception_enable = 1;
+ sf_state->sf1.mask_stack_exception_enable = 1;
+ sf_state->sf1.sw_exception_enable = 1;
+ sf_state->thread2.per_thread_scratch_space = 0;
+ /* scratch space is not used in our kernel */
+ sf_state->thread2.scratch_space_base_pointer = 0;
+ sf_state->thread3.const_urb_entry_read_length = 0; /* no const URBs */
+ sf_state->thread3.const_urb_entry_read_offset = 0; /* no const URBs */
+ sf_state->thread3.urb_entry_read_length = 1; /* 1 URB per vertex */
+ /* don't smash vertex header, read start from dw8 */
+ sf_state->thread3.urb_entry_read_offset = 1;
+ sf_state->thread3.dispatch_grf_start_reg = 3;
+ sf_state->thread4.max_threads = SF_MAX_THREADS - 1;
+ sf_state->thread4.urb_entry_allocation_size = URB_SF_ENTRY_SIZE - 1;
+ sf_state->thread4.nr_urb_entries = URB_SF_ENTRIES;
+ sf_state->thread4.stats_enable = 1;
+ sf_state->sf5.viewport_transform = FALSE; /* skip viewport */
+ sf_state->sf6.cull_mode = BRW_CULLMODE_NONE;
+ sf_state->sf6.scissor = 0;
+ sf_state->sf7.trifan_pv = 2;
+ sf_state->sf6.dest_org_vbias = 0x8;
+ sf_state->sf6.dest_org_hbias = 0x8;
+
+ drm_intel_bo_unmap(sf_state_bo);
+
+ return sf_state_bo;
}
-static drm_intel_bo *
-sampler_border_color_create(ScrnInfoPtr scrn)
+static drm_intel_bo *sampler_border_color_create(ScrnInfoPtr scrn)
{
- struct brw_sampler_legacy_border_color sampler_border_color;
-
- /* Set up the sampler border color (always transparent black) */
- memset(&sampler_border_color, 0, sizeof(sampler_border_color));
- sampler_border_color.color[0] = 0; /* R */
- sampler_border_color.color[1] = 0; /* G */
- sampler_border_color.color[2] = 0; /* B */
- sampler_border_color.color[3] = 0; /* A */
-
- return intel_bo_alloc_for_data(scrn,
- &sampler_border_color,
- sizeof(sampler_border_color),
- "gen4 render sampler border color");
+ struct brw_sampler_legacy_border_color sampler_border_color;
+
+ /* Set up the sampler border color (always transparent black) */
+ memset(&sampler_border_color, 0, sizeof(sampler_border_color));
+ sampler_border_color.color[0] = 0; /* R */
+ sampler_border_color.color[1] = 0; /* G */
+ sampler_border_color.color[2] = 0; /* B */
+ sampler_border_color.color[3] = 0; /* A */
+
+ return intel_bo_alloc_for_data(scrn,
+ &sampler_border_color,
+ sizeof(sampler_border_color),
+ "gen4 render sampler border color");
}
static void
-sampler_state_init (drm_intel_bo *sampler_state_bo,
- struct brw_sampler_state *sampler_state,
- sampler_state_filter_t filter,
- sampler_state_extend_t extend,
- drm_intel_bo *border_color_bo)
+sampler_state_init(drm_intel_bo * sampler_state_bo,
+ struct brw_sampler_state *sampler_state,
+ sampler_state_filter_t filter,
+ sampler_state_extend_t extend,
+ drm_intel_bo * border_color_bo)
{
- uint32_t sampler_state_offset;
-
- sampler_state_offset = (char *)sampler_state -
- (char *)sampler_state_bo->virtual;
-
- /* PS kernel use this sampler */
- memset(sampler_state, 0, sizeof(*sampler_state));
-
- sampler_state->ss0.lod_preclamp = 1; /* GL mode */
-
- /* We use the legacy mode to get the semantics specified by
- * the Render extension. */
- sampler_state->ss0.border_color_mode = BRW_BORDER_COLOR_MODE_LEGACY;
-
- switch(filter) {
- default:
- case SAMPLER_STATE_FILTER_NEAREST:
- sampler_state->ss0.min_filter = BRW_MAPFILTER_NEAREST;
- sampler_state->ss0.mag_filter = BRW_MAPFILTER_NEAREST;
- break;
- case SAMPLER_STATE_FILTER_BILINEAR:
- sampler_state->ss0.min_filter = BRW_MAPFILTER_LINEAR;
- sampler_state->ss0.mag_filter = BRW_MAPFILTER_LINEAR;
- break;
- }
-
- switch (extend) {
- default:
- case SAMPLER_STATE_EXTEND_NONE:
- sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER;
- sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER;
- sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER;
- break;
- case SAMPLER_STATE_EXTEND_REPEAT:
- sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_WRAP;
- sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_WRAP;
- sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_WRAP;
- break;
- case SAMPLER_STATE_EXTEND_PAD:
- sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
- sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
- sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
- break;
- case SAMPLER_STATE_EXTEND_REFLECT:
- sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_MIRROR;
- sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_MIRROR;
- sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_MIRROR;
- break;
- }
-
- sampler_state->ss2.border_color_pointer =
- intel_emit_reloc(sampler_state_bo, sampler_state_offset +
- offsetof(struct brw_sampler_state, ss2),
- border_color_bo, 0,
- I915_GEM_DOMAIN_SAMPLER, 0) >> 5;
-
- sampler_state->ss3.chroma_key_enable = 0; /* disable chromakey */
+ uint32_t sampler_state_offset;
+
+ sampler_state_offset = (char *)sampler_state -
+ (char *)sampler_state_bo->virtual;
+
+ /* PS kernel use this sampler */
+ memset(sampler_state, 0, sizeof(*sampler_state));
+
+ sampler_state->ss0.lod_preclamp = 1; /* GL mode */
+
+ /* We use the legacy mode to get the semantics specified by
+ * the Render extension. */
+ sampler_state->ss0.border_color_mode = BRW_BORDER_COLOR_MODE_LEGACY;
+
+ switch (filter) {
+ default:
+ case SAMPLER_STATE_FILTER_NEAREST:
+ sampler_state->ss0.min_filter = BRW_MAPFILTER_NEAREST;
+ sampler_state->ss0.mag_filter = BRW_MAPFILTER_NEAREST;
+ break;
+ case SAMPLER_STATE_FILTER_BILINEAR:
+ sampler_state->ss0.min_filter = BRW_MAPFILTER_LINEAR;
+ sampler_state->ss0.mag_filter = BRW_MAPFILTER_LINEAR;
+ break;
+ }
+
+ switch (extend) {
+ default:
+ case SAMPLER_STATE_EXTEND_NONE:
+ sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER;
+ sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER;
+ sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP_BORDER;
+ break;
+ case SAMPLER_STATE_EXTEND_REPEAT:
+ sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_WRAP;
+ sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_WRAP;
+ sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_WRAP;
+ break;
+ case SAMPLER_STATE_EXTEND_PAD:
+ sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+ sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+ sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+ break;
+ case SAMPLER_STATE_EXTEND_REFLECT:
+ sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_MIRROR;
+ sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_MIRROR;
+ sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_MIRROR;
+ break;
+ }
+
+ sampler_state->ss2.border_color_pointer =
+ intel_emit_reloc(sampler_state_bo, sampler_state_offset +
+ offsetof(struct brw_sampler_state, ss2),
+ border_color_bo, 0,
+ I915_GEM_DOMAIN_SAMPLER, 0) >> 5;
+
+ sampler_state->ss3.chroma_key_enable = 0; /* disable chromakey */
}
-static drm_intel_bo *
-gen4_create_sampler_state(ScrnInfoPtr scrn,
- sampler_state_filter_t src_filter,
- sampler_state_extend_t src_extend,
- sampler_state_filter_t mask_filter,
- sampler_state_extend_t mask_extend,
- drm_intel_bo *border_color_bo)
+static drm_intel_bo *gen4_create_sampler_state(ScrnInfoPtr scrn,
+ sampler_state_filter_t
+ src_filter,
+ sampler_state_extend_t
+ src_extend,
+ sampler_state_filter_t
+ mask_filter,
+ sampler_state_extend_t
+ mask_extend,
+ drm_intel_bo * border_color_bo)
{
- I830Ptr pI830 = I830PTR(scrn);
- drm_intel_bo *sampler_state_bo;
- struct brw_sampler_state *sampler_state;
-
- sampler_state_bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 sampler state",
- sizeof(struct brw_sampler_state) * 2,
- 4096);
- drm_intel_bo_map(sampler_state_bo, TRUE);
- sampler_state = sampler_state_bo->virtual;
-
- sampler_state_init(sampler_state_bo,
- &sampler_state[0],
- src_filter, src_extend,
- border_color_bo);
- sampler_state_init(sampler_state_bo,
- &sampler_state[1],
- mask_filter, mask_extend,
- border_color_bo);
-
- drm_intel_bo_unmap(sampler_state_bo);
-
- return sampler_state_bo;
+ I830Ptr pI830 = I830PTR(scrn);
+ drm_intel_bo *sampler_state_bo;
+ struct brw_sampler_state *sampler_state;
+
+ sampler_state_bo =
+ drm_intel_bo_alloc(pI830->bufmgr, "gen4 sampler state",
+ sizeof(struct brw_sampler_state) * 2, 4096);
+ drm_intel_bo_map(sampler_state_bo, TRUE);
+ sampler_state = sampler_state_bo->virtual;
+
+ sampler_state_init(sampler_state_bo,
+ &sampler_state[0],
+ src_filter, src_extend, border_color_bo);
+ sampler_state_init(sampler_state_bo,
+ &sampler_state[1],
+ mask_filter, mask_extend, border_color_bo);
+
+ drm_intel_bo_unmap(sampler_state_bo);
+
+ return sampler_state_bo;
}
static void
-cc_state_init (drm_intel_bo *cc_state_bo,
- uint32_t cc_state_offset,
- int src_blend,
- int dst_blend,
- drm_intel_bo *cc_vp_bo)
+cc_state_init(drm_intel_bo * cc_state_bo,
+ uint32_t cc_state_offset,
+ int src_blend, int dst_blend, drm_intel_bo * cc_vp_bo)
{
- struct brw_cc_unit_state *cc_state;
-
- cc_state = (struct brw_cc_unit_state *)((char *)cc_state_bo->virtual +
- cc_state_offset);
-
- memset(cc_state, 0, sizeof(*cc_state));
- cc_state->cc0.stencil_enable = 0; /* disable stencil */
- cc_state->cc2.depth_test = 0; /* disable depth test */
- cc_state->cc2.logicop_enable = 0; /* disable logic op */
- cc_state->cc3.ia_blend_enable = 0; /* blend alpha same as colors */
- cc_state->cc3.blend_enable = 1; /* enable color blend */
- cc_state->cc3.alpha_test = 0; /* disable alpha test */
-
- cc_state->cc4.cc_viewport_state_offset =
- intel_emit_reloc(cc_state_bo, cc_state_offset +
- offsetof(struct brw_cc_unit_state, cc4),
- cc_vp_bo, 0,
- I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
-
- cc_state->cc5.dither_enable = 0; /* disable dither */
- cc_state->cc5.logicop_func = 0xc; /* COPY */
- cc_state->cc5.statistics_enable = 1;
- cc_state->cc5.ia_blend_function = BRW_BLENDFUNCTION_ADD;
-
- /* Fill in alpha blend factors same as color, for the future. */
- cc_state->cc5.ia_src_blend_factor = src_blend;
- cc_state->cc5.ia_dest_blend_factor = dst_blend;
-
- cc_state->cc6.blend_function = BRW_BLENDFUNCTION_ADD;
- cc_state->cc6.clamp_post_alpha_blend = 1;
- cc_state->cc6.clamp_pre_alpha_blend = 1;
- cc_state->cc6.clamp_range = 0; /* clamp range [0,1] */
-
- cc_state->cc6.src_blend_factor = src_blend;
- cc_state->cc6.dest_blend_factor = dst_blend;
+ struct brw_cc_unit_state *cc_state;
+
+ cc_state = (struct brw_cc_unit_state *)((char *)cc_state_bo->virtual +
+ cc_state_offset);
+
+ memset(cc_state, 0, sizeof(*cc_state));
+ cc_state->cc0.stencil_enable = 0; /* disable stencil */
+ cc_state->cc2.depth_test = 0; /* disable depth test */
+ cc_state->cc2.logicop_enable = 0; /* disable logic op */
+ cc_state->cc3.ia_blend_enable = 0; /* blend alpha same as colors */
+ cc_state->cc3.blend_enable = 1; /* enable color blend */
+ cc_state->cc3.alpha_test = 0; /* disable alpha test */
+
+ cc_state->cc4.cc_viewport_state_offset =
+ intel_emit_reloc(cc_state_bo, cc_state_offset +
+ offsetof(struct brw_cc_unit_state, cc4),
+ cc_vp_bo, 0, I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
+
+ cc_state->cc5.dither_enable = 0; /* disable dither */
+ cc_state->cc5.logicop_func = 0xc; /* COPY */
+ cc_state->cc5.statistics_enable = 1;
+ cc_state->cc5.ia_blend_function = BRW_BLENDFUNCTION_ADD;
+
+ /* Fill in alpha blend factors same as color, for the future. */
+ cc_state->cc5.ia_src_blend_factor = src_blend;
+ cc_state->cc5.ia_dest_blend_factor = dst_blend;
+
+ cc_state->cc6.blend_function = BRW_BLENDFUNCTION_ADD;
+ cc_state->cc6.clamp_post_alpha_blend = 1;
+ cc_state->cc6.clamp_pre_alpha_blend = 1;
+ cc_state->cc6.clamp_range = 0; /* clamp range [0,1] */
+
+ cc_state->cc6.src_blend_factor = src_blend;
+ cc_state->cc6.dest_blend_factor = dst_blend;
}
-static drm_intel_bo *
-gen4_create_wm_state(ScrnInfoPtr scrn,
- Bool has_mask, drm_intel_bo *kernel_bo,
- drm_intel_bo *sampler_bo)
+static drm_intel_bo *gen4_create_wm_state(ScrnInfoPtr scrn,
+ Bool has_mask,
+ drm_intel_bo * kernel_bo,
+ drm_intel_bo * sampler_bo)
{
- I830Ptr pI830 = I830PTR(scrn);
- struct brw_wm_unit_state *wm_state;
- drm_intel_bo *wm_state_bo;
-
- wm_state_bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 WM state",
- sizeof(*wm_state), 4096);
- drm_intel_bo_map(wm_state_bo, TRUE);
- wm_state = wm_state_bo->virtual;
-
- memset(wm_state, 0, sizeof (*wm_state));
- wm_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
- wm_state->thread0.kernel_start_pointer =
- intel_emit_reloc(wm_state_bo,
- offsetof(struct brw_wm_unit_state, thread0),
- kernel_bo, wm_state->thread0.grf_reg_count << 1,
- I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
-
- wm_state->thread1.single_program_flow = 0;
-
- /* scratch space is not used in our kernel */
- wm_state->thread2.scratch_space_base_pointer = 0;
- wm_state->thread2.per_thread_scratch_space = 0;
-
- wm_state->thread3.const_urb_entry_read_length = 0;
- wm_state->thread3.const_urb_entry_read_offset = 0;
-
- wm_state->thread3.urb_entry_read_offset = 0;
- /* wm kernel use urb from 3, see wm_program in compiler module */
- wm_state->thread3.dispatch_grf_start_reg = 3; /* must match kernel */
-
- wm_state->wm4.stats_enable = 1; /* statistic */
-
- if (IS_IGDNG(pI830))
- wm_state->wm4.sampler_count = 0; /* hardware requirement */
- else
- wm_state->wm4.sampler_count = 1; /* 1-4 samplers used */
-
- wm_state->wm4.sampler_state_pointer =
- intel_emit_reloc(wm_state_bo, offsetof(struct brw_wm_unit_state, wm4),
- sampler_bo,
- wm_state->wm4.stats_enable +
- (wm_state->wm4.sampler_count << 2),
- I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
- wm_state->wm5.max_threads = PS_MAX_THREADS - 1;
- wm_state->wm5.transposed_urb_read = 0;
- wm_state->wm5.thread_dispatch_enable = 1;
- /* just use 16-pixel dispatch (4 subspans), don't need to change kernel
- * start point
- */
- wm_state->wm5.enable_16_pix = 1;
- wm_state->wm5.enable_8_pix = 0;
- wm_state->wm5.early_depth_test = 1;
-
- /* Each pair of attributes (src/mask coords) is two URB entries */
- if (has_mask) {
- wm_state->thread1.binding_table_entry_count = 3; /* 2 tex and fb */
- wm_state->thread3.urb_entry_read_length = 4;
- } else {
- wm_state->thread1.binding_table_entry_count = 2; /* 1 tex and fb */
- wm_state->thread3.urb_entry_read_length = 2;
- }
-
- /* binding table entry count is only used for prefetching, and it has to
- * be set 0 for IGDNG
- */
- if (IS_IGDNG(pI830))
- wm_state->thread1.binding_table_entry_count = 0;
-
- drm_intel_bo_unmap(wm_state_bo);
-
- return wm_state_bo;
+ I830Ptr pI830 = I830PTR(scrn);
+ struct brw_wm_unit_state *wm_state;
+ drm_intel_bo *wm_state_bo;
+
+ wm_state_bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 WM state",
+ sizeof(*wm_state), 4096);
+ drm_intel_bo_map(wm_state_bo, TRUE);
+ wm_state = wm_state_bo->virtual;
+
+ memset(wm_state, 0, sizeof(*wm_state));
+ wm_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
+ wm_state->thread0.kernel_start_pointer =
+ intel_emit_reloc(wm_state_bo,
+ offsetof(struct brw_wm_unit_state, thread0),
+ kernel_bo, wm_state->thread0.grf_reg_count << 1,
+ I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
+
+ wm_state->thread1.single_program_flow = 0;
+
+ /* scratch space is not used in our kernel */
+ wm_state->thread2.scratch_space_base_pointer = 0;
+ wm_state->thread2.per_thread_scratch_space = 0;
+
+ wm_state->thread3.const_urb_entry_read_length = 0;
+ wm_state->thread3.const_urb_entry_read_offset = 0;
+
+ wm_state->thread3.urb_entry_read_offset = 0;
+ /* wm kernel use urb from 3, see wm_program in compiler module */
+ wm_state->thread3.dispatch_grf_start_reg = 3; /* must match kernel */
+
+ wm_state->wm4.stats_enable = 1; /* statistic */
+
+ if (IS_IGDNG(pI830))
+ wm_state->wm4.sampler_count = 0; /* hardware requirement */
+ else
+ wm_state->wm4.sampler_count = 1; /* 1-4 samplers used */
+
+ wm_state->wm4.sampler_state_pointer =
+ intel_emit_reloc(wm_state_bo,
+ offsetof(struct brw_wm_unit_state, wm4),
+ sampler_bo,
+ wm_state->wm4.stats_enable +
+ (wm_state->wm4.sampler_count << 2),
+ I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
+ wm_state->wm5.max_threads = PS_MAX_THREADS - 1;
+ wm_state->wm5.transposed_urb_read = 0;
+ wm_state->wm5.thread_dispatch_enable = 1;
+ /* just use 16-pixel dispatch (4 subspans), don't need to change kernel
+ * start point
+ */
+ wm_state->wm5.enable_16_pix = 1;
+ wm_state->wm5.enable_8_pix = 0;
+ wm_state->wm5.early_depth_test = 1;
+
+ /* Each pair of attributes (src/mask coords) is two URB entries */
+ if (has_mask) {
+ wm_state->thread1.binding_table_entry_count = 3; /* 2 tex and fb */
+ wm_state->thread3.urb_entry_read_length = 4;
+ } else {
+ wm_state->thread1.binding_table_entry_count = 2; /* 1 tex and fb */
+ wm_state->thread3.urb_entry_read_length = 2;
+ }
+
+ /* binding table entry count is only used for prefetching, and it has to
+ * be set 0 for IGDNG
+ */
+ if (IS_IGDNG(pI830))
+ wm_state->thread1.binding_table_entry_count = 0;
+
+ drm_intel_bo_unmap(wm_state_bo);
+
+ return wm_state_bo;
}
-static drm_intel_bo *
-gen4_create_cc_viewport(ScrnInfoPtr scrn)
+static drm_intel_bo *gen4_create_cc_viewport(ScrnInfoPtr scrn)
{
- I830Ptr pI830 = I830PTR(scrn);
- drm_intel_bo *bo;
- struct brw_cc_viewport cc_viewport;
+ I830Ptr pI830 = I830PTR(scrn);
+ drm_intel_bo *bo;
+ struct brw_cc_viewport cc_viewport;
- cc_viewport.min_depth = -1.e35;
- cc_viewport.max_depth = 1.e35;
+ cc_viewport.min_depth = -1.e35;
+ cc_viewport.max_depth = 1.e35;
- bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 render unit state",
- sizeof(cc_viewport), 4096);
- drm_intel_bo_subdata(bo, 0, sizeof(cc_viewport), &cc_viewport);
+ bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 render unit state",
+ sizeof(cc_viewport), 4096);
+ drm_intel_bo_subdata(bo, 0, sizeof(cc_viewport), &cc_viewport);
- return bo;
+ return bo;
}
-static drm_intel_bo *
-gen4_create_vs_unit_state(ScrnInfoPtr scrn)
+static drm_intel_bo *gen4_create_vs_unit_state(ScrnInfoPtr scrn)
{
- I830Ptr pI830 = I830PTR(scrn);
- struct brw_vs_unit_state vs_state;
- memset(&vs_state, 0, sizeof(vs_state));
-
- /* Set up the vertex shader to be disabled (passthrough) */
- if (IS_IGDNG(pI830))
- vs_state.thread4.nr_urb_entries = URB_VS_ENTRIES >> 2; /* hardware requirement */
- else
- vs_state.thread4.nr_urb_entries = URB_VS_ENTRIES;
- vs_state.thread4.urb_entry_allocation_size = URB_VS_ENTRY_SIZE - 1;
- vs_state.vs6.vs_enable = 0;
- vs_state.vs6.vert_cache_disable = 1;
-
- return intel_bo_alloc_for_data(scrn, &vs_state, sizeof(vs_state),
- "gen4 render VS state");
+ I830Ptr pI830 = I830PTR(scrn);
+ struct brw_vs_unit_state vs_state;
+ memset(&vs_state, 0, sizeof(vs_state));
+
+ /* Set up the vertex shader to be disabled (passthrough) */
+ if (IS_IGDNG(pI830))
+ vs_state.thread4.nr_urb_entries = URB_VS_ENTRIES >> 2; /* hardware requirement */
+ else
+ vs_state.thread4.nr_urb_entries = URB_VS_ENTRIES;
+ vs_state.thread4.urb_entry_allocation_size = URB_VS_ENTRY_SIZE - 1;
+ vs_state.vs6.vs_enable = 0;
+ vs_state.vs6.vert_cache_disable = 1;
+
+ return intel_bo_alloc_for_data(scrn, &vs_state, sizeof(vs_state),
+ "gen4 render VS state");
}
/**
* Set up all combinations of cc state: each blendfactor for source and
* dest.
*/
-static drm_intel_bo *
-gen4_create_cc_unit_state(ScrnInfoPtr scrn)
+static drm_intel_bo *gen4_create_cc_unit_state(ScrnInfoPtr scrn)
{
- I830Ptr pI830 = I830PTR(scrn);
- struct gen4_cc_unit_state *cc_state;
- drm_intel_bo *cc_state_bo, *cc_vp_bo;
- int i, j;
-
- cc_vp_bo = gen4_create_cc_viewport(scrn);
-
- cc_state_bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 CC state",
- sizeof(*cc_state), 4096);
- drm_intel_bo_map(cc_state_bo, TRUE);
- cc_state = cc_state_bo->virtual;
- for (i = 0; i < BRW_BLENDFACTOR_COUNT; i++) {
- for (j = 0; j < BRW_BLENDFACTOR_COUNT; j++) {
- cc_state_init(cc_state_bo,
- offsetof(struct gen4_cc_unit_state,
- cc_state[i][j].state),
- i, j, cc_vp_bo);
+ I830Ptr pI830 = I830PTR(scrn);
+ struct gen4_cc_unit_state *cc_state;
+ drm_intel_bo *cc_state_bo, *cc_vp_bo;
+ int i, j;
+
+ cc_vp_bo = gen4_create_cc_viewport(scrn);
+
+ cc_state_bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 CC state",
+ sizeof(*cc_state), 4096);
+ drm_intel_bo_map(cc_state_bo, TRUE);
+ cc_state = cc_state_bo->virtual;
+ for (i = 0; i < BRW_BLENDFACTOR_COUNT; i++) {
+ for (j = 0; j < BRW_BLENDFACTOR_COUNT; j++) {
+ cc_state_init(cc_state_bo,
+ offsetof(struct gen4_cc_unit_state,
+ cc_state[i][j].state),
+ i, j, cc_vp_bo);
+ }
}
- }
- drm_intel_bo_unmap(cc_state_bo);
+ drm_intel_bo_unmap(cc_state_bo);
- drm_intel_bo_unreference(cc_vp_bo);
+ drm_intel_bo_unreference(cc_vp_bo);
- return cc_state_bo;
+ return cc_state_bo;
}
-static uint32_t
-i965_get_card_format(PicturePtr pPict)
+static uint32_t i965_get_card_format(PicturePtr pPict)
{
- int i;
+ int i;
- for (i = 0; i < sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]);
- i++)
- {
- if (i965_tex_formats[i].fmt == pPict->format)
- break;
- }
- assert(i != sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]));
+ for (i = 0; i < sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]);
+ i++) {
+ if (i965_tex_formats[i].fmt == pPict->format)
+ break;
+ }
+ assert(i != sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]));
- return i965_tex_formats[i].card_fmt;
+ return i965_tex_formats[i].card_fmt;
}
-static sampler_state_filter_t
-sampler_state_filter_from_picture (int filter)
+static sampler_state_filter_t sampler_state_filter_from_picture(int filter)
{
- switch (filter) {
- case PictFilterNearest:
- return SAMPLER_STATE_FILTER_NEAREST;
- case PictFilterBilinear:
- return SAMPLER_STATE_FILTER_BILINEAR;
- default:
- return -1;
- }
+ switch (filter) {
+ case PictFilterNearest:
+ return SAMPLER_STATE_FILTER_NEAREST;
+ case PictFilterBilinear:
+ return SAMPLER_STATE_FILTER_BILINEAR;
+ default:
+ return -1;
+ }
}
-static sampler_state_extend_t
-sampler_state_extend_from_picture (int repeat_type)
+static sampler_state_extend_t sampler_state_extend_from_picture(int repeat_type)
{
- switch (repeat_type) {
- case RepeatNone:
- return SAMPLER_STATE_EXTEND_NONE;
- case RepeatNormal:
- return SAMPLER_STATE_EXTEND_REPEAT;
- case RepeatPad:
- return SAMPLER_STATE_EXTEND_PAD;
- case RepeatReflect:
- return SAMPLER_STATE_EXTEND_REFLECT;
- default:
- return -1;
- }
+ switch (repeat_type) {
+ case RepeatNone:
+ return SAMPLER_STATE_EXTEND_NONE;
+ case RepeatNormal:
+ return SAMPLER_STATE_EXTEND_REPEAT;
+ case RepeatPad:
+ return SAMPLER_STATE_EXTEND_PAD;
+ case RepeatReflect:
+ return SAMPLER_STATE_EXTEND_REFLECT;
+ default:
+ return -1;
+ }
}
/**
@@ -1035,401 +1028,412 @@ sampler_state_extend_from_picture (int repeat_type)
* picture in the given surface state buffer.
*/
static void
-i965_set_picture_surface_state(dri_bo *ss_bo, int ss_index,
+i965_set_picture_surface_state(dri_bo * ss_bo, int ss_index,
PicturePtr pPicture, PixmapPtr pPixmap,
Bool is_dst)
{
- struct brw_surface_state_padded *ss;
- struct brw_surface_state local_ss;
- dri_bo *pixmap_bo = i830_get_pixmap_bo(pPixmap);
-
- ss = (struct brw_surface_state_padded *)ss_bo->virtual + ss_index;
-
- /* Since ss is a pointer to WC memory, do all of our bit operations
- * into a local temporary first.
- */
- memset(&local_ss, 0, sizeof(local_ss));
- local_ss.ss0.surface_type = BRW_SURFACE_2D;
- if (is_dst) {
- uint32_t dst_format = 0;
- Bool ret = TRUE;
-
- ret = i965_get_dest_format(pPicture, &dst_format);
- assert(ret == TRUE);
- local_ss.ss0.surface_format = dst_format;
- } else {
- local_ss.ss0.surface_format = i965_get_card_format(pPicture);
- }
-
- local_ss.ss0.data_return_format = BRW_SURFACERETURNFORMAT_FLOAT32;
- local_ss.ss0.writedisable_alpha = 0;
- local_ss.ss0.writedisable_red = 0;
- local_ss.ss0.writedisable_green = 0;
- local_ss.ss0.writedisable_blue = 0;
- local_ss.ss0.color_blend = 1;
- local_ss.ss0.vert_line_stride = 0;
- local_ss.ss0.vert_line_stride_ofs = 0;
- local_ss.ss0.mipmap_layout_mode = 0;
- local_ss.ss0.render_cache_read_mode = 0;
- local_ss.ss1.base_addr = pixmap_bo->offset;
-
- local_ss.ss2.mip_count = 0;
- local_ss.ss2.render_target_rotation = 0;
- local_ss.ss2.height = pPixmap->drawable.height - 1;
- local_ss.ss2.width = pPixmap->drawable.width - 1;
- local_ss.ss3.pitch = intel_get_pixmap_pitch(pPixmap) - 1;
- local_ss.ss3.tile_walk = 0; /* Tiled X */
- local_ss.ss3.tiled_surface = i830_pixmap_tiled(pPixmap) ? 1 : 0;
-
- memcpy(ss, &local_ss, sizeof(local_ss));
-
- if (pixmap_bo != NULL) {
- uint32_t write_domain, read_domains;
+ struct brw_surface_state_padded *ss;
+ struct brw_surface_state local_ss;
+ dri_bo *pixmap_bo = i830_get_pixmap_bo(pPixmap);
+ ss = (struct brw_surface_state_padded *)ss_bo->virtual + ss_index;
+
+ /* Since ss is a pointer to WC memory, do all of our bit operations
+ * into a local temporary first.
+ */
+ memset(&local_ss, 0, sizeof(local_ss));
+ local_ss.ss0.surface_type = BRW_SURFACE_2D;
if (is_dst) {
- write_domain = I915_GEM_DOMAIN_RENDER;
- read_domains = I915_GEM_DOMAIN_RENDER;
+ uint32_t dst_format = 0;
+ Bool ret = TRUE;
+
+ ret = i965_get_dest_format(pPicture, &dst_format);
+ assert(ret == TRUE);
+ local_ss.ss0.surface_format = dst_format;
} else {
- write_domain = 0;
- read_domains = I915_GEM_DOMAIN_SAMPLER;
+ local_ss.ss0.surface_format = i965_get_card_format(pPicture);
+ }
+
+ local_ss.ss0.data_return_format = BRW_SURFACERETURNFORMAT_FLOAT32;
+ local_ss.ss0.writedisable_alpha = 0;
+ local_ss.ss0.writedisable_red = 0;
+ local_ss.ss0.writedisable_green = 0;
+ local_ss.ss0.writedisable_blue = 0;
+ local_ss.ss0.color_blend = 1;
+ local_ss.ss0.vert_line_stride = 0;
+ local_ss.ss0.vert_line_stride_ofs = 0;
+ local_ss.ss0.mipmap_layout_mode = 0;
+ local_ss.ss0.render_cache_read_mode = 0;
+ local_ss.ss1.base_addr = pixmap_bo->offset;
+
+ local_ss.ss2.mip_count = 0;
+ local_ss.ss2.render_target_rotation = 0;
+ local_ss.ss2.height = pPixmap->drawable.height - 1;
+ local_ss.ss2.width = pPixmap->drawable.width - 1;
+ local_ss.ss3.pitch = intel_get_pixmap_pitch(pPixmap) - 1;
+ local_ss.ss3.tile_walk = 0; /* Tiled X */
+ local_ss.ss3.tiled_surface = i830_pixmap_tiled(pPixmap) ? 1 : 0;
+
+ memcpy(ss, &local_ss, sizeof(local_ss));
+
+ if (pixmap_bo != NULL) {
+ uint32_t write_domain, read_domains;
+
+ if (is_dst) {
+ write_domain = I915_GEM_DOMAIN_RENDER;
+ read_domains = I915_GEM_DOMAIN_RENDER;
+ } else {
+ write_domain = 0;
+ read_domains = I915_GEM_DOMAIN_SAMPLER;
+ }
+ dri_bo_emit_reloc(ss_bo, read_domains, write_domain,
+ 0,
+ ss_index * sizeof(*ss) +
+ offsetof(struct brw_surface_state, ss1),
+ pixmap_bo);
}
- dri_bo_emit_reloc(ss_bo, read_domains, write_domain,
- 0,
- ss_index * sizeof(*ss) +
- offsetof(struct brw_surface_state, ss1),
- pixmap_bo);
- }
}
-static void
-i965_emit_composite_state(ScrnInfoPtr pScrn)
+static void i965_emit_composite_state(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- struct gen4_render_state *render_state= pI830->gen4_render_state;
- gen4_composite_op *composite_op = &render_state->composite_op;
- int op = composite_op->op;
- PicturePtr pMaskPicture = composite_op->mask_picture;
- PicturePtr pDstPicture = composite_op->dest_picture;
- PixmapPtr pMask = composite_op->mask;
- PixmapPtr pDst = composite_op->dest;
- sampler_state_filter_t src_filter = composite_op->src_filter;
- sampler_state_filter_t mask_filter = composite_op->mask_filter;
- sampler_state_extend_t src_extend = composite_op->src_extend;
- sampler_state_extend_t mask_extend = composite_op->mask_extend;
- Bool is_affine = composite_op->is_affine;
- int urb_vs_start, urb_vs_size;
- int urb_gs_start, urb_gs_size;
- int urb_clip_start, urb_clip_size;
- int urb_sf_start, urb_sf_size;
- int urb_cs_start, urb_cs_size;
- uint32_t src_blend, dst_blend;
- dri_bo *binding_table_bo = composite_op->binding_table_bo;
-
- render_state->needs_state_emit = FALSE;
-
- IntelEmitInvarientState(pScrn);
- pI830->last_3d = LAST_3D_RENDER;
-
- urb_vs_start = 0;
- urb_vs_size = URB_VS_ENTRIES * URB_VS_ENTRY_SIZE;
- urb_gs_start = urb_vs_start + urb_vs_size;
- urb_gs_size = URB_GS_ENTRIES * URB_GS_ENTRY_SIZE;
- urb_clip_start = urb_gs_start + urb_gs_size;
- urb_clip_size = URB_CLIP_ENTRIES * URB_CLIP_ENTRY_SIZE;
- urb_sf_start = urb_clip_start + urb_clip_size;
- urb_sf_size = URB_SF_ENTRIES * URB_SF_ENTRY_SIZE;
- urb_cs_start = urb_sf_start + urb_sf_size;
- urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE;
-
- i965_get_blend_cntl(op, pMaskPicture, pDstPicture->format,
- &src_blend, &dst_blend);
-
- /* Begin the long sequence of commands needed to set up the 3D
- * rendering pipe
- */
- {
- BEGIN_BATCH(2);
- OUT_BATCH(MI_FLUSH |
- MI_STATE_INSTRUCTION_CACHE_FLUSH |
- BRW_MI_GLOBAL_SNAPSHOT_RESET);
- OUT_BATCH(MI_NOOP);
- ADVANCE_BATCH();
- }
- {
- if (IS_IGDNG(pI830))
- BEGIN_BATCH(14);
- else
- BEGIN_BATCH(12);
-
- /* Match Mesa driver setup */
- if (IS_G4X(pI830) || IS_IGDNG(pI830))
- OUT_BATCH(NEW_PIPELINE_SELECT | PIPELINE_SELECT_3D);
- else
- OUT_BATCH(BRW_PIPELINE_SELECT | PIPELINE_SELECT_3D);
-
- OUT_BATCH(BRW_CS_URB_STATE | 0);
- OUT_BATCH((0 << 4) | /* URB Entry Allocation Size */
- (0 << 0)); /* Number of URB Entries */
-
- /* Zero out the two base address registers so all offsets are
- * absolute.
+ I830Ptr pI830 = I830PTR(pScrn);
+ struct gen4_render_state *render_state = pI830->gen4_render_state;
+ gen4_composite_op *composite_op = &render_state->composite_op;
+ int op = composite_op->op;
+ PicturePtr pMaskPicture = composite_op->mask_picture;
+ PicturePtr pDstPicture = composite_op->dest_picture;
+ PixmapPtr pMask = composite_op->mask;
+ PixmapPtr pDst = composite_op->dest;
+ sampler_state_filter_t src_filter = composite_op->src_filter;
+ sampler_state_filter_t mask_filter = composite_op->mask_filter;
+ sampler_state_extend_t src_extend = composite_op->src_extend;
+ sampler_state_extend_t mask_extend = composite_op->mask_extend;
+ Bool is_affine = composite_op->is_affine;
+ int urb_vs_start, urb_vs_size;
+ int urb_gs_start, urb_gs_size;
+ int urb_clip_start, urb_clip_size;
+ int urb_sf_start, urb_sf_size;
+ int urb_cs_start, urb_cs_size;
+ uint32_t src_blend, dst_blend;
+ dri_bo *binding_table_bo = composite_op->binding_table_bo;
+
+ render_state->needs_state_emit = FALSE;
+
+ IntelEmitInvarientState(pScrn);
+ pI830->last_3d = LAST_3D_RENDER;
+
+ urb_vs_start = 0;
+ urb_vs_size = URB_VS_ENTRIES * URB_VS_ENTRY_SIZE;
+ urb_gs_start = urb_vs_start + urb_vs_size;
+ urb_gs_size = URB_GS_ENTRIES * URB_GS_ENTRY_SIZE;
+ urb_clip_start = urb_gs_start + urb_gs_size;
+ urb_clip_size = URB_CLIP_ENTRIES * URB_CLIP_ENTRY_SIZE;
+ urb_sf_start = urb_clip_start + urb_clip_size;
+ urb_sf_size = URB_SF_ENTRIES * URB_SF_ENTRY_SIZE;
+ urb_cs_start = urb_sf_start + urb_sf_size;
+ urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE;
+
+ i965_get_blend_cntl(op, pMaskPicture, pDstPicture->format,
+ &src_blend, &dst_blend);
+
+ /* Begin the long sequence of commands needed to set up the 3D
+ * rendering pipe
*/
- if (IS_IGDNG(pI830)) {
- OUT_BATCH(BRW_STATE_BASE_ADDRESS | 6);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Generate state base address */
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Surface state base address */
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* media base addr, don't care */
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Instruction base address */
- /* general state max addr, disabled */
- OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
- /* media object state max addr, disabled */
- OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
- /* Instruction max addr, disabled */
- OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
- } else {
- OUT_BATCH(BRW_STATE_BASE_ADDRESS | 4);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Generate state base address */
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Surface state base address */
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* media base addr, don't care */
- /* general state max addr, disabled */
- OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
- /* media object state max addr, disabled */
- OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
- }
- /* Set system instruction pointer */
- OUT_BATCH(BRW_STATE_SIP | 0);
- OUT_RELOC(render_state->sip_kernel_bo,
- I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
- OUT_BATCH(MI_NOOP);
- ADVANCE_BATCH();
- }
- {
- int pipe_ctrl;
- BEGIN_BATCH(26);
- /* Pipe control */
-
- if (IS_IGDNG(pI830))
- pipe_ctrl = BRW_PIPE_CONTROL_NOWRITE;
- else
- pipe_ctrl = BRW_PIPE_CONTROL_NOWRITE | BRW_PIPE_CONTROL_IS_FLUSH;
-
- OUT_BATCH(BRW_PIPE_CONTROL | pipe_ctrl | 2);
- OUT_BATCH(0); /* Destination address */
- OUT_BATCH(0); /* Immediate data low DW */
- OUT_BATCH(0); /* Immediate data high DW */
-
- /* Binding table pointers */
- OUT_BATCH(BRW_3DSTATE_BINDING_TABLE_POINTERS | 4);
- OUT_BATCH(0); /* vs */
- OUT_BATCH(0); /* gs */
- OUT_BATCH(0); /* clip */
- OUT_BATCH(0); /* sf */
- /* Only the PS uses the binding table */
- OUT_RELOC(binding_table_bo, I915_GEM_DOMAIN_SAMPLER, 0, 0);
-
- /* The drawing rectangle clipping is always on. Set it to values that
- * shouldn't do any clipping.
- */
- OUT_BATCH(BRW_3DSTATE_DRAWING_RECTANGLE | 2);
- OUT_BATCH(0x00000000); /* ymin, xmin */
- OUT_BATCH(DRAW_YMAX(pDst->drawable.height - 1) |
- DRAW_XMAX(pDst->drawable.width - 1)); /* ymax, xmax */
- OUT_BATCH(0x00000000); /* yorigin, xorigin */
-
- /* skip the depth buffer */
- /* skip the polygon stipple */
- /* skip the polygon stipple offset */
- /* skip the line stipple */
-
- /* Set the pointers to the 3d pipeline state */
- OUT_BATCH(BRW_3DSTATE_PIPELINED_POINTERS | 5);
- OUT_RELOC(render_state->vs_state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
- OUT_BATCH(BRW_GS_DISABLE); /* disable GS, resulting in passthrough */
- OUT_BATCH(BRW_CLIP_DISABLE); /* disable CLIP, resulting in passthrough */
- if (pMask) {
- OUT_RELOC(render_state->sf_mask_state_bo,
- I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
- } else {
- OUT_RELOC(render_state->sf_state_bo,
- I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+ {
+ BEGIN_BATCH(2);
+ OUT_BATCH(MI_FLUSH |
+ MI_STATE_INSTRUCTION_CACHE_FLUSH |
+ BRW_MI_GLOBAL_SNAPSHOT_RESET);
+ OUT_BATCH(MI_NOOP);
+ ADVANCE_BATCH();
}
-
- OUT_RELOC(render_state->wm_state_bo[composite_op->wm_kernel]
- [src_filter][src_extend]
- [mask_filter][mask_extend],
- I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
-
- OUT_RELOC(render_state->cc_state_bo,
- I915_GEM_DOMAIN_INSTRUCTION, 0,
- offsetof(struct gen4_cc_unit_state,
- cc_state[src_blend][dst_blend]));
-
- /* URB fence */
- OUT_BATCH(BRW_URB_FENCE |
- UF0_CS_REALLOC |
- UF0_SF_REALLOC |
- UF0_CLIP_REALLOC |
- UF0_GS_REALLOC |
- UF0_VS_REALLOC |
- 1);
- OUT_BATCH(((urb_clip_start + urb_clip_size) << UF1_CLIP_FENCE_SHIFT) |
- ((urb_gs_start + urb_gs_size) << UF1_GS_FENCE_SHIFT) |
- ((urb_vs_start + urb_vs_size) << UF1_VS_FENCE_SHIFT));
- OUT_BATCH(((urb_cs_start + urb_cs_size) << UF2_CS_FENCE_SHIFT) |
- ((urb_sf_start + urb_sf_size) << UF2_SF_FENCE_SHIFT));
-
- /* Constant buffer state */
- OUT_BATCH(BRW_CS_URB_STATE | 0);
- OUT_BATCH(((URB_CS_ENTRY_SIZE - 1) << 4) |
- (URB_CS_ENTRIES << 0));
- ADVANCE_BATCH();
- }
- {
- /*
- * number of extra parameters per vertex
- */
- int nelem = pMask ? 2: 1;
- /*
- * size of extra parameters:
- * 3 for homogenous (xyzw)
- * 2 for cartesian (xy)
- */
- int selem = is_affine ? 2 : 3;
- uint32_t w_component;
- uint32_t src_format;
-
- render_state->vertex_size = 4 * (2 + nelem * selem);
-
- if (is_affine)
{
- src_format = BRW_SURFACEFORMAT_R32G32_FLOAT;
- w_component = BRW_VFCOMPONENT_STORE_1_FLT;
+ if (IS_IGDNG(pI830))
+ BEGIN_BATCH(14);
+ else
+ BEGIN_BATCH(12);
+
+ /* Match Mesa driver setup */
+ if (IS_G4X(pI830) || IS_IGDNG(pI830))
+ OUT_BATCH(NEW_PIPELINE_SELECT | PIPELINE_SELECT_3D);
+ else
+ OUT_BATCH(BRW_PIPELINE_SELECT | PIPELINE_SELECT_3D);
+
+ OUT_BATCH(BRW_CS_URB_STATE | 0);
+ OUT_BATCH((0 << 4) | /* URB Entry Allocation Size */
+ (0 << 0)); /* Number of URB Entries */
+
+ /* Zero out the two base address registers so all offsets are
+ * absolute.
+ */
+ if (IS_IGDNG(pI830)) {
+ OUT_BATCH(BRW_STATE_BASE_ADDRESS | 6);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Generate state base address */
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Surface state base address */
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* media base addr, don't care */
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Instruction base address */
+ /* general state max addr, disabled */
+ OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
+ /* media object state max addr, disabled */
+ OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
+ /* Instruction max addr, disabled */
+ OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
+ } else {
+ OUT_BATCH(BRW_STATE_BASE_ADDRESS | 4);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Generate state base address */
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Surface state base address */
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* media base addr, don't care */
+ /* general state max addr, disabled */
+ OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
+ /* media object state max addr, disabled */
+ OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
+ }
+ /* Set system instruction pointer */
+ OUT_BATCH(BRW_STATE_SIP | 0);
+ OUT_RELOC(render_state->sip_kernel_bo,
+ I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+ OUT_BATCH(MI_NOOP);
+ ADVANCE_BATCH();
}
- else
{
- src_format = BRW_SURFACEFORMAT_R32G32B32_FLOAT;
- w_component = BRW_VFCOMPONENT_STORE_SRC;
+ int pipe_ctrl;
+ BEGIN_BATCH(26);
+ /* Pipe control */
+
+ if (IS_IGDNG(pI830))
+ pipe_ctrl = BRW_PIPE_CONTROL_NOWRITE;
+ else
+ pipe_ctrl =
+ BRW_PIPE_CONTROL_NOWRITE |
+ BRW_PIPE_CONTROL_IS_FLUSH;
+
+ OUT_BATCH(BRW_PIPE_CONTROL | pipe_ctrl | 2);
+ OUT_BATCH(0); /* Destination address */
+ OUT_BATCH(0); /* Immediate data low DW */
+ OUT_BATCH(0); /* Immediate data high DW */
+
+ /* Binding table pointers */
+ OUT_BATCH(BRW_3DSTATE_BINDING_TABLE_POINTERS | 4);
+ OUT_BATCH(0); /* vs */
+ OUT_BATCH(0); /* gs */
+ OUT_BATCH(0); /* clip */
+ OUT_BATCH(0); /* sf */
+ /* Only the PS uses the binding table */
+ OUT_RELOC(binding_table_bo, I915_GEM_DOMAIN_SAMPLER, 0, 0);
+
+ /* The drawing rectangle clipping is always on. Set it to values that
+ * shouldn't do any clipping.
+ */
+ OUT_BATCH(BRW_3DSTATE_DRAWING_RECTANGLE | 2);
+ OUT_BATCH(0x00000000); /* ymin, xmin */
+ OUT_BATCH(DRAW_YMAX(pDst->drawable.height - 1) | DRAW_XMAX(pDst->drawable.width - 1)); /* ymax, xmax */
+ OUT_BATCH(0x00000000); /* yorigin, xorigin */
+
+ /* skip the depth buffer */
+ /* skip the polygon stipple */
+ /* skip the polygon stipple offset */
+ /* skip the line stipple */
+
+ /* Set the pointers to the 3d pipeline state */
+ OUT_BATCH(BRW_3DSTATE_PIPELINED_POINTERS | 5);
+ OUT_RELOC(render_state->vs_state_bo,
+ I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+ OUT_BATCH(BRW_GS_DISABLE); /* disable GS, resulting in passthrough */
+ OUT_BATCH(BRW_CLIP_DISABLE); /* disable CLIP, resulting in passthrough */
+ if (pMask) {
+ OUT_RELOC(render_state->sf_mask_state_bo,
+ I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+ } else {
+ OUT_RELOC(render_state->sf_state_bo,
+ I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+ }
+
+ OUT_RELOC(render_state->wm_state_bo[composite_op->wm_kernel]
+ [src_filter][src_extend]
+ [mask_filter][mask_extend],
+ I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+
+ OUT_RELOC(render_state->cc_state_bo,
+ I915_GEM_DOMAIN_INSTRUCTION, 0,
+ offsetof(struct gen4_cc_unit_state,
+ cc_state[src_blend][dst_blend]));
+
+ /* URB fence */
+ OUT_BATCH(BRW_URB_FENCE |
+ UF0_CS_REALLOC |
+ UF0_SF_REALLOC |
+ UF0_CLIP_REALLOC |
+ UF0_GS_REALLOC | UF0_VS_REALLOC | 1);
+ OUT_BATCH(((urb_clip_start +
+ urb_clip_size) << UF1_CLIP_FENCE_SHIFT) |
+ ((urb_gs_start +
+ urb_gs_size) << UF1_GS_FENCE_SHIFT) | ((urb_vs_start
+ +
+ urb_vs_size)
+ <<
+ UF1_VS_FENCE_SHIFT));
+ OUT_BATCH(((urb_cs_start +
+ urb_cs_size) << UF2_CS_FENCE_SHIFT) | ((urb_sf_start
+ +
+ urb_sf_size)
+ <<
+ UF2_SF_FENCE_SHIFT));
+
+ /* Constant buffer state */
+ OUT_BATCH(BRW_CS_URB_STATE | 0);
+ OUT_BATCH(((URB_CS_ENTRY_SIZE - 1) << 4) |
+ (URB_CS_ENTRIES << 0));
+ ADVANCE_BATCH();
}
+ {
+ /*
+ * number of extra parameters per vertex
+ */
+ int nelem = pMask ? 2 : 1;
+ /*
+ * size of extra parameters:
+ * 3 for homogenous (xyzw)
+ * 2 for cartesian (xy)
+ */
+ int selem = is_affine ? 2 : 3;
+ uint32_t w_component;
+ uint32_t src_format;
+
+ render_state->vertex_size = 4 * (2 + nelem * selem);
+
+ if (is_affine) {
+ src_format = BRW_SURFACEFORMAT_R32G32_FLOAT;
+ w_component = BRW_VFCOMPONENT_STORE_1_FLT;
+ } else {
+ src_format = BRW_SURFACEFORMAT_R32G32B32_FLOAT;
+ w_component = BRW_VFCOMPONENT_STORE_SRC;
+ }
- if (IS_IGDNG(pI830)) {
- BEGIN_BATCH(pMask?9:7);
- /*
- * The reason to add this extra vertex element in the header is that
- * IGDNG has different vertex header definition and origin method to
- * set destination element offset doesn't exist anymore, which means
- * hardware requires a predefined vertex element layout.
- *
- * haihao proposed this approach to fill the first vertex element, so
- * origin layout for Gen4 doesn't need to change, and origin shader
- * programs behavior is also kept.
- *
- * I think this is not bad. - zhenyu
- */
-
- OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS | ((2 * (2 + nelem)) - 1));
- OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
- VE0_VALID |
- (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
- (0 << VE0_OFFSET_SHIFT));
-
- OUT_BATCH((BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_0_SHIFT) |
- (BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_1_SHIFT) |
- (BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_2_SHIFT) |
- (BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_3_SHIFT));
- } else {
- BEGIN_BATCH(pMask?7:5);
- /* Set up our vertex elements, sourced from the single vertex buffer.
- * that will be set up later.
- */
- OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS | ((2 * (1 + nelem)) - 1));
- }
-
- /* x,y */
- OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
- VE0_VALID |
- (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
- (0 << VE0_OFFSET_SHIFT));
-
- if (IS_IGDNG(pI830))
- OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
- (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
- else
- OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
- (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) |
- (4 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT));
- /* u0, v0, w0 */
- OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
- VE0_VALID |
- (src_format << VE0_FORMAT_SHIFT) |
- ((2 * 4) << VE0_OFFSET_SHIFT)); /* offset vb in bytes */
-
- if (IS_IGDNG(pI830))
- OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
- (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
- (w_component << VE1_VFCOMPONENT_2_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
- else
- OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
- (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
- (w_component << VE1_VFCOMPONENT_2_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) |
- ((4 + 4) << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); /* VUE offset in dwords */
- /* u1, v1, w1 */
- if (pMask) {
- OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
- VE0_VALID |
- (src_format << VE0_FORMAT_SHIFT) |
- (((2 + selem) * 4) << VE0_OFFSET_SHIFT)); /* vb offset in bytes */
-
- if (IS_IGDNG(pI830))
- OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
- (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
- (w_component << VE1_VFCOMPONENT_2_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
- else
- OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
- (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
- (w_component << VE1_VFCOMPONENT_2_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) |
- ((4 + 4 + 4) << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); /* VUE offset in dwords */
- }
+ if (IS_IGDNG(pI830)) {
+ BEGIN_BATCH(pMask ? 9 : 7);
+ /*
+ * The reason to add this extra vertex element in the header is that
+ * IGDNG has different vertex header definition and origin method to
+ * set destination element offset doesn't exist anymore, which means
+ * hardware requires a predefined vertex element layout.
+ *
+ * haihao proposed this approach to fill the first vertex element, so
+ * origin layout for Gen4 doesn't need to change, and origin shader
+ * programs behavior is also kept.
+ *
+ * I think this is not bad. - zhenyu
+ */
+
+ OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS |
+ ((2 * (2 + nelem)) - 1));
+ OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
+ VE0_VALID | (BRW_SURFACEFORMAT_R32G32_FLOAT <<
+ VE0_FORMAT_SHIFT) | (0 <<
+ VE0_OFFSET_SHIFT));
+
+ OUT_BATCH((BRW_VFCOMPONENT_STORE_0 <<
+ VE1_VFCOMPONENT_0_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_0 <<
+ VE1_VFCOMPONENT_1_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_0 <<
+ VE1_VFCOMPONENT_2_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_0 <<
+ VE1_VFCOMPONENT_3_SHIFT));
+ } else {
+ BEGIN_BATCH(pMask ? 7 : 5);
+ /* Set up our vertex elements, sourced from the single vertex buffer.
+ * that will be set up later.
+ */
+ OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS |
+ ((2 * (1 + nelem)) - 1));
+ }
- ADVANCE_BATCH();
- }
+ /* x,y */
+ OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
+ VE0_VALID |
+ (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
+ (0 << VE0_OFFSET_SHIFT));
+
+ if (IS_IGDNG(pI830))
+ OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC <<
+ VE1_VFCOMPONENT_0_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_SRC <<
+ VE1_VFCOMPONENT_1_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_2_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_3_SHIFT));
+ else
+ OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC <<
+ VE1_VFCOMPONENT_0_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_SRC <<
+ VE1_VFCOMPONENT_1_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_2_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_3_SHIFT) | (4 <<
+ VE1_DESTINATION_ELEMENT_OFFSET_SHIFT));
+ /* u0, v0, w0 */
+ OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | VE0_VALID | (src_format << VE0_FORMAT_SHIFT) | ((2 * 4) << VE0_OFFSET_SHIFT)); /* offset vb in bytes */
+
+ if (IS_IGDNG(pI830))
+ OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC <<
+ VE1_VFCOMPONENT_0_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_SRC <<
+ VE1_VFCOMPONENT_1_SHIFT) | (w_component <<
+ VE1_VFCOMPONENT_2_SHIFT)
+ | (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_3_SHIFT));
+ else
+ OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | (w_component << VE1_VFCOMPONENT_2_SHIFT) | (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) | ((4 + 4) << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); /* VUE offset in dwords */
+ /* u1, v1, w1 */
+ if (pMask) {
+ OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | VE0_VALID | (src_format << VE0_FORMAT_SHIFT) | (((2 + selem) * 4) << VE0_OFFSET_SHIFT)); /* vb offset in bytes */
+
+ if (IS_IGDNG(pI830))
+ OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC <<
+ VE1_VFCOMPONENT_0_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_SRC <<
+ VE1_VFCOMPONENT_1_SHIFT) |
+ (w_component <<
+ VE1_VFCOMPONENT_2_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_3_SHIFT));
+ else
+ OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | (w_component << VE1_VFCOMPONENT_2_SHIFT) | (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) | ((4 + 4 + 4) << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); /* VUE offset in dwords */
+ }
+
+ ADVANCE_BATCH();
+ }
}
/**
* Returns whether the current set of composite state plus vertex buffer is
* expected to fit in the aperture.
*/
-static Bool
-i965_composite_check_aperture(ScrnInfoPtr pScrn)
+static Bool i965_composite_check_aperture(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- struct gen4_render_state *render_state= pI830->gen4_render_state;
- gen4_composite_op *composite_op = &render_state->composite_op;
- drm_intel_bo *bo_table[] = {
- pI830->batch_bo,
- composite_op->binding_table_bo,
- render_state->vertex_buffer_bo,
- render_state->vs_state_bo,
- render_state->sf_state_bo,
- render_state->sf_mask_state_bo,
- render_state->wm_state_bo[composite_op->wm_kernel]
- [composite_op->src_filter]
- [composite_op->src_extend]
- [composite_op->mask_filter]
- [composite_op->mask_extend],
- render_state->cc_state_bo,
- render_state->sip_kernel_bo,
- };
-
- return drm_intel_bufmgr_check_aperture_space(bo_table,
- ARRAY_SIZE(bo_table)) == 0;
+ I830Ptr pI830 = I830PTR(pScrn);
+ struct gen4_render_state *render_state = pI830->gen4_render_state;
+ gen4_composite_op *composite_op = &render_state->composite_op;
+ drm_intel_bo *bo_table[] = {
+ pI830->batch_bo,
+ composite_op->binding_table_bo,
+ render_state->vertex_buffer_bo,
+ render_state->vs_state_bo,
+ render_state->sf_state_bo,
+ render_state->sf_mask_state_bo,
+ render_state->wm_state_bo[composite_op->wm_kernel]
+ [composite_op->src_filter]
+ [composite_op->src_extend]
+ [composite_op->mask_filter]
+ [composite_op->mask_extend],
+ render_state->cc_state_bo,
+ render_state->sip_kernel_bo,
+ };
+
+ return drm_intel_bufmgr_check_aperture_space(bo_table,
+ ARRAY_SIZE(bo_table)) == 0;
}
Bool
@@ -1437,515 +1441,540 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture,
PicturePtr pMaskPicture, PicturePtr pDstPicture,
PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst)
{
- ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- struct gen4_render_state *render_state= pI830->gen4_render_state;
- gen4_composite_op *composite_op = &render_state->composite_op;
- uint32_t *binding_table;
- drm_intel_bo *binding_table_bo, *surface_state_bo;
-
- if (composite_op->src_filter < 0)
- I830FALLBACK("Bad src filter 0x%x\n", pSrcPicture->filter);
- composite_op->src_extend =
- sampler_state_extend_from_picture(pSrcPicture->repeatType);
- if (composite_op->src_extend < 0)
- I830FALLBACK("Bad src repeat 0x%x\n", pSrcPicture->repeatType);
-
- if (pMaskPicture) {
- composite_op->mask_filter =
- sampler_state_filter_from_picture(pMaskPicture->filter);
- if (composite_op->mask_filter < 0)
- I830FALLBACK("Bad mask filter 0x%x\n", pMaskPicture->filter);
- composite_op->mask_extend =
- sampler_state_extend_from_picture(pMaskPicture->repeatType);
- if (composite_op->mask_extend < 0)
- I830FALLBACK("Bad mask repeat 0x%x\n", pMaskPicture->repeatType);
- } else {
- composite_op->mask_filter = SAMPLER_STATE_FILTER_NEAREST;
- composite_op->mask_extend = SAMPLER_STATE_EXTEND_NONE;
- }
-
- /* Set up the surface states. */
- surface_state_bo = dri_bo_alloc(pI830->bufmgr, "surface_state",
- 3 * sizeof (brw_surface_state_padded),
- 4096);
- if (dri_bo_map(surface_state_bo, 1) != 0) {
- dri_bo_unreference(surface_state_bo);
- return FALSE;
- }
- /* Set up the state buffer for the destination surface */
- i965_set_picture_surface_state(surface_state_bo, 0,
- pDstPicture, pDst, TRUE);
- /* Set up the source surface state buffer */
- i965_set_picture_surface_state(surface_state_bo, 1,
- pSrcPicture, pSrc, FALSE);
- if (pMask) {
- /* Set up the mask surface state buffer */
- i965_set_picture_surface_state(surface_state_bo, 2,
- pMaskPicture, pMask,
- FALSE);
- }
- dri_bo_unmap(surface_state_bo);
-
- /* Set up the binding table of surface indices to surface state. */
- binding_table_bo = dri_bo_alloc(pI830->bufmgr, "binding_table",
- 3 * sizeof(uint32_t), 4096);
- if (dri_bo_map (binding_table_bo, 1) != 0) {
- dri_bo_unreference(binding_table_bo);
- dri_bo_unreference(surface_state_bo);
- return FALSE;
- }
-
- binding_table = binding_table_bo->virtual;
- binding_table[0] = intel_emit_reloc(binding_table_bo,
- 0 * sizeof(uint32_t),
- surface_state_bo,
- 0 * sizeof(brw_surface_state_padded),
- I915_GEM_DOMAIN_INSTRUCTION, 0);
-
- binding_table[1] = intel_emit_reloc(binding_table_bo,
- 1 * sizeof(uint32_t),
- surface_state_bo,
- 1 * sizeof(brw_surface_state_padded),
- I915_GEM_DOMAIN_INSTRUCTION, 0);
-
- if (pMask) {
- binding_table[2] = intel_emit_reloc(binding_table_bo,
- 2 * sizeof(uint32_t),
+ ScrnInfoPtr pScrn = xf86Screens[pDstPicture->pDrawable->pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ struct gen4_render_state *render_state = pI830->gen4_render_state;
+ gen4_composite_op *composite_op = &render_state->composite_op;
+ uint32_t *binding_table;
+ drm_intel_bo *binding_table_bo, *surface_state_bo;
+
+ if (composite_op->src_filter < 0)
+ I830FALLBACK("Bad src filter 0x%x\n", pSrcPicture->filter);
+ composite_op->src_extend =
+ sampler_state_extend_from_picture(pSrcPicture->repeatType);
+ if (composite_op->src_extend < 0)
+ I830FALLBACK("Bad src repeat 0x%x\n", pSrcPicture->repeatType);
+
+ if (pMaskPicture) {
+ composite_op->mask_filter =
+ sampler_state_filter_from_picture(pMaskPicture->filter);
+ if (composite_op->mask_filter < 0)
+ I830FALLBACK("Bad mask filter 0x%x\n",
+ pMaskPicture->filter);
+ composite_op->mask_extend =
+ sampler_state_extend_from_picture(pMaskPicture->repeatType);
+ if (composite_op->mask_extend < 0)
+ I830FALLBACK("Bad mask repeat 0x%x\n",
+ pMaskPicture->repeatType);
+ } else {
+ composite_op->mask_filter = SAMPLER_STATE_FILTER_NEAREST;
+ composite_op->mask_extend = SAMPLER_STATE_EXTEND_NONE;
+ }
+
+ /* Set up the surface states. */
+ surface_state_bo = dri_bo_alloc(pI830->bufmgr, "surface_state",
+ 3 * sizeof(brw_surface_state_padded),
+ 4096);
+ if (dri_bo_map(surface_state_bo, 1) != 0) {
+ dri_bo_unreference(surface_state_bo);
+ return FALSE;
+ }
+ /* Set up the state buffer for the destination surface */
+ i965_set_picture_surface_state(surface_state_bo, 0,
+ pDstPicture, pDst, TRUE);
+ /* Set up the source surface state buffer */
+ i965_set_picture_surface_state(surface_state_bo, 1,
+ pSrcPicture, pSrc, FALSE);
+ if (pMask) {
+ /* Set up the mask surface state buffer */
+ i965_set_picture_surface_state(surface_state_bo, 2,
+ pMaskPicture, pMask, FALSE);
+ }
+ dri_bo_unmap(surface_state_bo);
+
+ /* Set up the binding table of surface indices to surface state. */
+ binding_table_bo = dri_bo_alloc(pI830->bufmgr, "binding_table",
+ 3 * sizeof(uint32_t), 4096);
+ if (dri_bo_map(binding_table_bo, 1) != 0) {
+ dri_bo_unreference(binding_table_bo);
+ dri_bo_unreference(surface_state_bo);
+ return FALSE;
+ }
+
+ binding_table = binding_table_bo->virtual;
+ binding_table[0] = intel_emit_reloc(binding_table_bo,
+ 0 * sizeof(uint32_t),
surface_state_bo,
- 2 * sizeof(brw_surface_state_padded),
+ 0 *
+ sizeof(brw_surface_state_padded),
I915_GEM_DOMAIN_INSTRUCTION, 0);
- } else {
- binding_table[2] = 0;
- }
- dri_bo_unmap(binding_table_bo);
- /* All refs to surface_state are now contained in binding_table_bo. */
- drm_intel_bo_unreference(surface_state_bo);
-
- composite_op->op = op;
- composite_op->source_picture = pSrcPicture;
- composite_op->mask_picture = pMaskPicture;
- composite_op->dest_picture = pDstPicture;
- composite_op->source = pSrc;
- composite_op->mask = pMask;
- composite_op->dest = pDst;
- drm_intel_bo_unreference(composite_op->binding_table_bo);
- composite_op->binding_table_bo = binding_table_bo;
- composite_op->src_filter =
- sampler_state_filter_from_picture(pSrcPicture->filter);
-
- pI830->scale_units[0][0] = pSrc->drawable.width;
- pI830->scale_units[0][1] = pSrc->drawable.height;
-
- pI830->transform[0] = pSrcPicture->transform;
- composite_op->is_affine =
- i830_transform_is_affine(pI830->transform[0]);
-
- if (!pMask) {
- pI830->transform[1] = NULL;
- pI830->scale_units[1][0] = -1;
- pI830->scale_units[1][1] = -1;
- } else {
- pI830->transform[1] = pMaskPicture->transform;
- pI830->scale_units[1][0] = pMask->drawable.width;
- pI830->scale_units[1][1] = pMask->drawable.height;
- composite_op->is_affine |=
- i830_transform_is_affine(pI830->transform[1]);
- }
-
-
- if (pMask) {
- if (pMaskPicture->componentAlpha &&
- PICT_FORMAT_RGB(pMaskPicture->format))
- {
- if (i965_blend_op[op].src_alpha) {
- if (composite_op->is_affine)
- composite_op->wm_kernel = WM_KERNEL_MASKCA_SRCALPHA_AFFINE;
- else
- composite_op->wm_kernel = WM_KERNEL_MASKCA_SRCALPHA_PROJECTIVE;
- } else {
+
+ binding_table[1] = intel_emit_reloc(binding_table_bo,
+ 1 * sizeof(uint32_t),
+ surface_state_bo,
+ 1 *
+ sizeof(brw_surface_state_padded),
+ I915_GEM_DOMAIN_INSTRUCTION, 0);
+
+ if (pMask) {
+ binding_table[2] = intel_emit_reloc(binding_table_bo,
+ 2 * sizeof(uint32_t),
+ surface_state_bo,
+ 2 *
+ sizeof
+ (brw_surface_state_padded),
+ I915_GEM_DOMAIN_INSTRUCTION,
+ 0);
+ } else {
+ binding_table[2] = 0;
+ }
+ dri_bo_unmap(binding_table_bo);
+ /* All refs to surface_state are now contained in binding_table_bo. */
+ drm_intel_bo_unreference(surface_state_bo);
+
+ composite_op->op = op;
+ composite_op->source_picture = pSrcPicture;
+ composite_op->mask_picture = pMaskPicture;
+ composite_op->dest_picture = pDstPicture;
+ composite_op->source = pSrc;
+ composite_op->mask = pMask;
+ composite_op->dest = pDst;
+ drm_intel_bo_unreference(composite_op->binding_table_bo);
+ composite_op->binding_table_bo = binding_table_bo;
+ composite_op->src_filter =
+ sampler_state_filter_from_picture(pSrcPicture->filter);
+
+ pI830->scale_units[0][0] = pSrc->drawable.width;
+ pI830->scale_units[0][1] = pSrc->drawable.height;
+
+ pI830->transform[0] = pSrcPicture->transform;
+ composite_op->is_affine = i830_transform_is_affine(pI830->transform[0]);
+
+ if (!pMask) {
+ pI830->transform[1] = NULL;
+ pI830->scale_units[1][0] = -1;
+ pI830->scale_units[1][1] = -1;
+ } else {
+ pI830->transform[1] = pMaskPicture->transform;
+ pI830->scale_units[1][0] = pMask->drawable.width;
+ pI830->scale_units[1][1] = pMask->drawable.height;
+ composite_op->is_affine |=
+ i830_transform_is_affine(pI830->transform[1]);
+ }
+
+ if (pMask) {
+ if (pMaskPicture->componentAlpha &&
+ PICT_FORMAT_RGB(pMaskPicture->format)) {
+ if (i965_blend_op[op].src_alpha) {
+ if (composite_op->is_affine)
+ composite_op->wm_kernel =
+ WM_KERNEL_MASKCA_SRCALPHA_AFFINE;
+ else
+ composite_op->wm_kernel =
+ WM_KERNEL_MASKCA_SRCALPHA_PROJECTIVE;
+ } else {
+ if (composite_op->is_affine)
+ composite_op->wm_kernel =
+ WM_KERNEL_MASKCA_AFFINE;
+ else
+ composite_op->wm_kernel =
+ WM_KERNEL_MASKCA_PROJECTIVE;
+ }
+ } else {
+ if (composite_op->is_affine)
+ composite_op->wm_kernel =
+ WM_KERNEL_MASKNOCA_AFFINE;
+ else
+ composite_op->wm_kernel =
+ WM_KERNEL_MASKNOCA_PROJECTIVE;
+ }
+ } else {
if (composite_op->is_affine)
- composite_op->wm_kernel = WM_KERNEL_MASKCA_AFFINE;
+ composite_op->wm_kernel = WM_KERNEL_NOMASK_AFFINE;
else
- composite_op->wm_kernel = WM_KERNEL_MASKCA_PROJECTIVE;
- }
- } else {
- if (composite_op->is_affine)
- composite_op->wm_kernel = WM_KERNEL_MASKNOCA_AFFINE;
- else
- composite_op->wm_kernel = WM_KERNEL_MASKNOCA_PROJECTIVE;
+ composite_op->wm_kernel = WM_KERNEL_NOMASK_PROJECTIVE;
}
- } else {
- if (composite_op->is_affine)
- composite_op->wm_kernel = WM_KERNEL_NOMASK_AFFINE;
- else
- composite_op->wm_kernel = WM_KERNEL_NOMASK_PROJECTIVE;
- }
- if (!i965_composite_check_aperture(pScrn)) {
- intel_batch_flush(pScrn, FALSE);
- if (!i965_composite_check_aperture(pScrn))
- I830FALLBACK("Couldn't fit render operation in aperture\n");
- }
+ if (!i965_composite_check_aperture(pScrn)) {
+ intel_batch_flush(pScrn, FALSE);
+ if (!i965_composite_check_aperture(pScrn))
+ I830FALLBACK
+ ("Couldn't fit render operation in aperture\n");
+ }
- render_state->needs_state_emit = TRUE;
+ render_state->needs_state_emit = TRUE;
- return TRUE;
+ return TRUE;
}
-static drm_intel_bo *
-i965_get_vb_space(ScrnInfoPtr pScrn)
+static drm_intel_bo *i965_get_vb_space(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- struct gen4_render_state *render_state = pI830->gen4_render_state;
-
- /* If the vertex buffer is too full, then we free the old and a new one
- * gets made.
- */
- if (render_state->vb_offset + VERTEX_FLOATS_PER_COMPOSITE >
- VERTEX_BUFFER_SIZE) {
- drm_intel_bo_unreference(render_state->vertex_buffer_bo);
- render_state->vertex_buffer_bo = NULL;
- }
-
- /* Alloc a new vertex buffer if necessary. */
- if (render_state->vertex_buffer_bo == NULL) {
- render_state->vertex_buffer_bo = drm_intel_bo_alloc(pI830->bufmgr, "vb",
- sizeof(gen4_vertex_buffer),
- 4096);
- render_state->vb_offset = 0;
- }
+ I830Ptr pI830 = I830PTR(pScrn);
+ struct gen4_render_state *render_state = pI830->gen4_render_state;
+
+ /* If the vertex buffer is too full, then we free the old and a new one
+ * gets made.
+ */
+ if (render_state->vb_offset + VERTEX_FLOATS_PER_COMPOSITE >
+ VERTEX_BUFFER_SIZE) {
+ drm_intel_bo_unreference(render_state->vertex_buffer_bo);
+ render_state->vertex_buffer_bo = NULL;
+ }
+
+ /* Alloc a new vertex buffer if necessary. */
+ if (render_state->vertex_buffer_bo == NULL) {
+ render_state->vertex_buffer_bo =
+ drm_intel_bo_alloc(pI830->bufmgr, "vb",
+ sizeof(gen4_vertex_buffer), 4096);
+ render_state->vb_offset = 0;
+ }
- drm_intel_bo_reference(render_state->vertex_buffer_bo);
- return render_state->vertex_buffer_bo;
+ drm_intel_bo_reference(render_state->vertex_buffer_bo);
+ return render_state->vertex_buffer_bo;
}
void
i965_composite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY,
int dstX, int dstY, int w, int h)
{
- ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
- struct gen4_render_state *render_state = pI830->gen4_render_state;
- Bool has_mask;
- float src_x[3], src_y[3], src_w[3], mask_x[3], mask_y[3], mask_w[3];
- int i;
- drm_intel_bo *vb_bo;
- float vb[18];
- Bool is_affine = render_state->composite_op.is_affine;
-
- if (is_affine)
- {
- if (!i830_get_transformed_coordinates(srcX, srcY,
- pI830->transform[0],
- &src_x[0], &src_y[0]))
- return;
- if (!i830_get_transformed_coordinates(srcX, srcY + h,
- pI830->transform[0],
- &src_x[1], &src_y[1]))
- return;
- if (!i830_get_transformed_coordinates(srcX + w, srcY + h,
- pI830->transform[0],
- &src_x[2], &src_y[2]))
- return;
- }
- else
- {
- if (!i830_get_transformed_coordinates_3d(srcX, srcY,
- pI830->transform[0],
- &src_x[0], &src_y[0],
- &src_w[0]))
- return;
- if (!i830_get_transformed_coordinates_3d(srcX, srcY + h,
- pI830->transform[0],
- &src_x[1], &src_y[1],
- &src_w[1]))
- return;
- if (!i830_get_transformed_coordinates_3d(srcX + w, srcY + h,
- pI830->transform[0],
- &src_x[2], &src_y[2],
- &src_w[2]))
- return;
- }
-
- if (pI830->scale_units[1][0] == -1 || pI830->scale_units[1][1] == -1) {
- has_mask = FALSE;
- } else {
- has_mask = TRUE;
+ ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
+ I830Ptr pI830 = I830PTR(pScrn);
+ struct gen4_render_state *render_state = pI830->gen4_render_state;
+ Bool has_mask;
+ float src_x[3], src_y[3], src_w[3], mask_x[3], mask_y[3], mask_w[3];
+ int i;
+ drm_intel_bo *vb_bo;
+ float vb[18];
+ Bool is_affine = render_state->composite_op.is_affine;
+
if (is_affine) {
- if (!i830_get_transformed_coordinates(maskX, maskY,
- pI830->transform[1],
- &mask_x[0], &mask_y[0]))
- return;
- if (!i830_get_transformed_coordinates(maskX, maskY + h,
- pI830->transform[1],
- &mask_x[1], &mask_y[1]))
- return;
- if (!i830_get_transformed_coordinates(maskX + w, maskY + h,
- pI830->transform[1],
- &mask_x[2], &mask_y[2]))
- return;
+ if (!i830_get_transformed_coordinates(srcX, srcY,
+ pI830->transform[0],
+ &src_x[0], &src_y[0]))
+ return;
+ if (!i830_get_transformed_coordinates(srcX, srcY + h,
+ pI830->transform[0],
+ &src_x[1], &src_y[1]))
+ return;
+ if (!i830_get_transformed_coordinates(srcX + w, srcY + h,
+ pI830->transform[0],
+ &src_x[2], &src_y[2]))
+ return;
} else {
- if (!i830_get_transformed_coordinates_3d(maskX, maskY,
- pI830->transform[1],
- &mask_x[0], &mask_y[0],
- &mask_w[0]))
- return;
- if (!i830_get_transformed_coordinates_3d(maskX, maskY + h,
- pI830->transform[1],
- &mask_x[1], &mask_y[1],
- &mask_w[1]))
- return;
- if (!i830_get_transformed_coordinates_3d(maskX + w, maskY + h,
- pI830->transform[1],
- &mask_x[2], &mask_y[2],
- &mask_w[2]))
- return;
+ if (!i830_get_transformed_coordinates_3d(srcX, srcY,
+ pI830->transform[0],
+ &src_x[0], &src_y[0],
+ &src_w[0]))
+ return;
+ if (!i830_get_transformed_coordinates_3d(srcX, srcY + h,
+ pI830->transform[0],
+ &src_x[1], &src_y[1],
+ &src_w[1]))
+ return;
+ if (!i830_get_transformed_coordinates_3d(srcX + w, srcY + h,
+ pI830->transform[0],
+ &src_x[2], &src_y[2],
+ &src_w[2]))
+ return;
+ }
+
+ if (pI830->scale_units[1][0] == -1 || pI830->scale_units[1][1] == -1) {
+ has_mask = FALSE;
+ } else {
+ has_mask = TRUE;
+ if (is_affine) {
+ if (!i830_get_transformed_coordinates(maskX, maskY,
+ pI830->
+ transform[1],
+ &mask_x[0],
+ &mask_y[0]))
+ return;
+ if (!i830_get_transformed_coordinates(maskX, maskY + h,
+ pI830->
+ transform[1],
+ &mask_x[1],
+ &mask_y[1]))
+ return;
+ if (!i830_get_transformed_coordinates
+ (maskX + w, maskY + h, pI830->transform[1],
+ &mask_x[2], &mask_y[2]))
+ return;
+ } else {
+ if (!i830_get_transformed_coordinates_3d(maskX, maskY,
+ pI830->
+ transform[1],
+ &mask_x[0],
+ &mask_y[0],
+ &mask_w[0]))
+ return;
+ if (!i830_get_transformed_coordinates_3d
+ (maskX, maskY + h, pI830->transform[1], &mask_x[1],
+ &mask_y[1], &mask_w[1]))
+ return;
+ if (!i830_get_transformed_coordinates_3d
+ (maskX + w, maskY + h, pI830->transform[1],
+ &mask_x[2], &mask_y[2], &mask_w[2]))
+ return;
+ }
}
- }
-
- vb_bo = i965_get_vb_space(pScrn);
- if (vb_bo == NULL)
- return;
- i = 0;
- /* rect (x2,y2) */
- vb[i++] = (float)(dstX + w);
- vb[i++] = (float)(dstY + h);
- vb[i++] = src_x[2] / pI830->scale_units[0][0];
- vb[i++] = src_y[2] / pI830->scale_units[0][1];
- if (!is_affine)
- vb[i++] = src_w[2];
- if (has_mask) {
- vb[i++] = mask_x[2] / pI830->scale_units[1][0];
- vb[i++] = mask_y[2] / pI830->scale_units[1][1];
+
+ vb_bo = i965_get_vb_space(pScrn);
+ if (vb_bo == NULL)
+ return;
+ i = 0;
+ /* rect (x2,y2) */
+ vb[i++] = (float)(dstX + w);
+ vb[i++] = (float)(dstY + h);
+ vb[i++] = src_x[2] / pI830->scale_units[0][0];
+ vb[i++] = src_y[2] / pI830->scale_units[0][1];
if (!is_affine)
- vb[i++] = mask_w[2];
- }
-
- /* rect (x1,y2) */
- vb[i++] = (float)dstX;
- vb[i++] = (float)(dstY + h);
- vb[i++] = src_x[1] / pI830->scale_units[0][0];
- vb[i++] = src_y[1] / pI830->scale_units[0][1];
- if (!is_affine)
- vb[i++] = src_w[1];
- if (has_mask) {
- vb[i++] = mask_x[1] / pI830->scale_units[1][0];
- vb[i++] = mask_y[1] / pI830->scale_units[1][1];
+ vb[i++] = src_w[2];
+ if (has_mask) {
+ vb[i++] = mask_x[2] / pI830->scale_units[1][0];
+ vb[i++] = mask_y[2] / pI830->scale_units[1][1];
+ if (!is_affine)
+ vb[i++] = mask_w[2];
+ }
+
+ /* rect (x1,y2) */
+ vb[i++] = (float)dstX;
+ vb[i++] = (float)(dstY + h);
+ vb[i++] = src_x[1] / pI830->scale_units[0][0];
+ vb[i++] = src_y[1] / pI830->scale_units[0][1];
if (!is_affine)
- vb[i++] = mask_w[1];
- }
-
- /* rect (x1,y1) */
- vb[i++] = (float)dstX;
- vb[i++] = (float)dstY;
- vb[i++] = src_x[0] / pI830->scale_units[0][0];
- vb[i++] = src_y[0] / pI830->scale_units[0][1];
- if (!is_affine)
- vb[i++] = src_w[0];
- if (has_mask) {
- vb[i++] = mask_x[0] / pI830->scale_units[1][0];
- vb[i++] = mask_y[0] / pI830->scale_units[1][1];
+ vb[i++] = src_w[1];
+ if (has_mask) {
+ vb[i++] = mask_x[1] / pI830->scale_units[1][0];
+ vb[i++] = mask_y[1] / pI830->scale_units[1][1];
+ if (!is_affine)
+ vb[i++] = mask_w[1];
+ }
+
+ /* rect (x1,y1) */
+ vb[i++] = (float)dstX;
+ vb[i++] = (float)dstY;
+ vb[i++] = src_x[0] / pI830->scale_units[0][0];
+ vb[i++] = src_y[0] / pI830->scale_units[0][1];
if (!is_affine)
- vb[i++] = mask_w[0];
- }
- assert (i <= VERTEX_BUFFER_SIZE);
- drm_intel_bo_subdata(vb_bo, render_state->vb_offset * 4, i * 4, vb);
-
- if (!i965_composite_check_aperture(pScrn))
- intel_batch_flush(pScrn, FALSE);
-
- intel_batch_start_atomic(pScrn, 200);
- if (render_state->needs_state_emit)
- i965_emit_composite_state(pScrn);
-
- BEGIN_BATCH(12);
- OUT_BATCH(MI_FLUSH);
- /* Set up the pointer to our (single) vertex buffer */
- OUT_BATCH(BRW_3DSTATE_VERTEX_BUFFERS | 3);
- OUT_BATCH((0 << VB0_BUFFER_INDEX_SHIFT) |
- VB0_VERTEXDATA |
- (render_state->vertex_size << VB0_BUFFER_PITCH_SHIFT));
- OUT_RELOC(vb_bo, I915_GEM_DOMAIN_VERTEX, 0, render_state->vb_offset * 4);
-
- if (IS_IGDNG(pI830))
- OUT_RELOC(vb_bo, I915_GEM_DOMAIN_VERTEX, 0, render_state->vb_offset * 4 + i * 4);
- else
- OUT_BATCH(3);
-
- OUT_BATCH(0); // ignore for VERTEXDATA, but still there
-
- OUT_BATCH(BRW_3DPRIMITIVE |
- BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL |
- (_3DPRIM_RECTLIST << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) |
- (0 << 9) | /* CTG - indirect vertex count */
- 4);
- OUT_BATCH(3); /* vertex count per instance */
- OUT_BATCH(0); /* start vertex offset */
- OUT_BATCH(1); /* single instance */
- OUT_BATCH(0); /* start instance location */
- OUT_BATCH(0); /* index buffer offset, ignored */
- ADVANCE_BATCH();
-
- render_state->vb_offset += i;
- drm_intel_bo_unreference(vb_bo);
-
- intel_batch_end_atomic(pScrn);
-
- i830_debug_sync(pScrn);
+ vb[i++] = src_w[0];
+ if (has_mask) {
+ vb[i++] = mask_x[0] / pI830->scale_units[1][0];
+ vb[i++] = mask_y[0] / pI830->scale_units[1][1];
+ if (!is_affine)
+ vb[i++] = mask_w[0];
+ }
+ assert(i <= VERTEX_BUFFER_SIZE);
+ drm_intel_bo_subdata(vb_bo, render_state->vb_offset * 4, i * 4, vb);
+
+ if (!i965_composite_check_aperture(pScrn))
+ intel_batch_flush(pScrn, FALSE);
+
+ intel_batch_start_atomic(pScrn, 200);
+ if (render_state->needs_state_emit)
+ i965_emit_composite_state(pScrn);
+
+ BEGIN_BATCH(12);
+ OUT_BATCH(MI_FLUSH);
+ /* Set up the pointer to our (single) vertex buffer */
+ OUT_BATCH(BRW_3DSTATE_VERTEX_BUFFERS | 3);
+ OUT_BATCH((0 << VB0_BUFFER_INDEX_SHIFT) |
+ VB0_VERTEXDATA |
+ (render_state->vertex_size << VB0_BUFFER_PITCH_SHIFT));
+ OUT_RELOC(vb_bo, I915_GEM_DOMAIN_VERTEX, 0,
+ render_state->vb_offset * 4);
+
+ if (IS_IGDNG(pI830))
+ OUT_RELOC(vb_bo, I915_GEM_DOMAIN_VERTEX, 0,
+ render_state->vb_offset * 4 + i * 4);
+ else
+ OUT_BATCH(3);
+
+ OUT_BATCH(0); // ignore for VERTEXDATA, but still there
+
+ OUT_BATCH(BRW_3DPRIMITIVE | BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL | (_3DPRIM_RECTLIST << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) | (0 << 9) | /* CTG - indirect vertex count */
+ 4);
+ OUT_BATCH(3); /* vertex count per instance */
+ OUT_BATCH(0); /* start vertex offset */
+ OUT_BATCH(1); /* single instance */
+ OUT_BATCH(0); /* start instance location */
+ OUT_BATCH(0); /* index buffer offset, ignored */
+ ADVANCE_BATCH();
+
+ render_state->vb_offset += i;
+ drm_intel_bo_unreference(vb_bo);
+
+ intel_batch_end_atomic(pScrn);
+
+ i830_debug_sync(pScrn);
}
-void
-i965_batch_flush_notify(ScrnInfoPtr pScrn)
+void i965_batch_flush_notify(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- struct gen4_render_state *render_state = pI830->gen4_render_state;
-
- /* Once a batch is emitted, we never want to map again any buffer
- * object being referenced by that batch, (which would be very
- * expensive). */
- if (render_state->vertex_buffer_bo) {
- dri_bo_unreference (render_state->vertex_buffer_bo);
- render_state->vertex_buffer_bo = NULL;
- }
-
- render_state->needs_state_emit = TRUE;
+ I830Ptr pI830 = I830PTR(pScrn);
+ struct gen4_render_state *render_state = pI830->gen4_render_state;
+
+ /* Once a batch is emitted, we never want to map again any buffer
+ * object being referenced by that batch, (which would be very
+ * expensive). */
+ if (render_state->vertex_buffer_bo) {
+ dri_bo_unreference(render_state->vertex_buffer_bo);
+ render_state->vertex_buffer_bo = NULL;
+ }
+
+ render_state->needs_state_emit = TRUE;
}
/**
* Called at EnterVT so we can set up our offsets into the state buffer.
*/
-void
-gen4_render_state_init(ScrnInfoPtr pScrn)
+void gen4_render_state_init(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- struct gen4_render_state *render_state;
- int i, j, k, l, m;
- drm_intel_bo *sf_kernel_bo, *sf_kernel_mask_bo;
- drm_intel_bo *border_color_bo;
-
- if (pI830->gen4_render_state == NULL)
- pI830->gen4_render_state = calloc(sizeof(*render_state), 1);
-
- render_state = pI830->gen4_render_state;
- render_state->vb_offset = 0;
-
- render_state->vs_state_bo = gen4_create_vs_unit_state(pScrn);
-
- /* Set up the two SF states (one for blending with a mask, one without) */
- if (IS_IGDNG(pI830)) {
- sf_kernel_bo = intel_bo_alloc_for_data(pScrn,
- sf_kernel_static_gen5,
- sizeof(sf_kernel_static_gen5),
- "sf kernel gen5");
- sf_kernel_mask_bo = intel_bo_alloc_for_data(pScrn,
- sf_kernel_mask_static_gen5,
- sizeof(sf_kernel_mask_static_gen5),
- "sf mask kernel");
- } else {
- sf_kernel_bo = intel_bo_alloc_for_data(pScrn,
- sf_kernel_static,
- sizeof(sf_kernel_static),
- "sf kernel");
- sf_kernel_mask_bo = intel_bo_alloc_for_data(pScrn,
- sf_kernel_mask_static,
- sizeof(sf_kernel_mask_static),
- "sf mask kernel");
- }
- render_state->sf_state_bo = gen4_create_sf_state(pScrn, sf_kernel_bo);
- render_state->sf_mask_state_bo = gen4_create_sf_state(pScrn,
- sf_kernel_mask_bo);
- drm_intel_bo_unreference(sf_kernel_bo);
- drm_intel_bo_unreference(sf_kernel_mask_bo);
-
- for (m = 0; m < WM_KERNEL_COUNT; m++) {
- if (IS_IGDNG(pI830))
- render_state->wm_kernel_bo[m] =
- intel_bo_alloc_for_data(pScrn,
- wm_kernels_gen5[m].data, wm_kernels_gen5[m].size,
- "WM kernel gen5");
- else
- render_state->wm_kernel_bo[m] =
- intel_bo_alloc_for_data(pScrn,
- wm_kernels[m].data, wm_kernels[m].size,
- "WM kernel");
- }
-
- /* Set up the WM states: each filter/extend type for source and mask, per
- * kernel.
- */
- border_color_bo = sampler_border_color_create(pScrn);
- for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++) {
- for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++) {
- for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++) {
- for (l = 0; l < SAMPLER_STATE_EXTEND_COUNT; l++) {
- drm_intel_bo *sampler_state_bo;
-
- sampler_state_bo =
- gen4_create_sampler_state(pScrn,
- i, j,
- k, l,
- border_color_bo);
-
- for (m = 0; m < WM_KERNEL_COUNT; m++) {
- if (IS_IGDNG(pI830))
- render_state->wm_state_bo[m][i][j][k][l] =
- gen4_create_wm_state(pScrn,
- wm_kernels_gen5[m].has_mask,
- render_state->wm_kernel_bo[m],
- sampler_state_bo);
- else
- render_state->wm_state_bo[m][i][j][k][l] =
- gen4_create_wm_state(pScrn,
- wm_kernels[m].has_mask,
- render_state->wm_kernel_bo[m],
- sampler_state_bo);
- }
- drm_intel_bo_unreference(sampler_state_bo);
+ I830Ptr pI830 = I830PTR(pScrn);
+ struct gen4_render_state *render_state;
+ int i, j, k, l, m;
+ drm_intel_bo *sf_kernel_bo, *sf_kernel_mask_bo;
+ drm_intel_bo *border_color_bo;
+
+ if (pI830->gen4_render_state == NULL)
+ pI830->gen4_render_state = calloc(sizeof(*render_state), 1);
+
+ render_state = pI830->gen4_render_state;
+ render_state->vb_offset = 0;
+
+ render_state->vs_state_bo = gen4_create_vs_unit_state(pScrn);
+
+ /* Set up the two SF states (one for blending with a mask, one without) */
+ if (IS_IGDNG(pI830)) {
+ sf_kernel_bo = intel_bo_alloc_for_data(pScrn,
+ sf_kernel_static_gen5,
+ sizeof
+ (sf_kernel_static_gen5),
+ "sf kernel gen5");
+ sf_kernel_mask_bo =
+ intel_bo_alloc_for_data(pScrn, sf_kernel_mask_static_gen5,
+ sizeof(sf_kernel_mask_static_gen5),
+ "sf mask kernel");
+ } else {
+ sf_kernel_bo = intel_bo_alloc_for_data(pScrn,
+ sf_kernel_static,
+ sizeof(sf_kernel_static),
+ "sf kernel");
+ sf_kernel_mask_bo = intel_bo_alloc_for_data(pScrn,
+ sf_kernel_mask_static,
+ sizeof
+ (sf_kernel_mask_static),
+ "sf mask kernel");
+ }
+ render_state->sf_state_bo = gen4_create_sf_state(pScrn, sf_kernel_bo);
+ render_state->sf_mask_state_bo = gen4_create_sf_state(pScrn,
+ sf_kernel_mask_bo);
+ drm_intel_bo_unreference(sf_kernel_bo);
+ drm_intel_bo_unreference(sf_kernel_mask_bo);
+
+ for (m = 0; m < WM_KERNEL_COUNT; m++) {
+ if (IS_IGDNG(pI830))
+ render_state->wm_kernel_bo[m] =
+ intel_bo_alloc_for_data(pScrn,
+ wm_kernels_gen5[m].data,
+ wm_kernels_gen5[m].size,
+ "WM kernel gen5");
+ else
+ render_state->wm_kernel_bo[m] =
+ intel_bo_alloc_for_data(pScrn,
+ wm_kernels[m].data,
+ wm_kernels[m].size,
+ "WM kernel");
+ }
+
+ /* Set up the WM states: each filter/extend type for source and mask, per
+ * kernel.
+ */
+ border_color_bo = sampler_border_color_create(pScrn);
+ for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++) {
+ for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++) {
+ for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++) {
+ for (l = 0; l < SAMPLER_STATE_EXTEND_COUNT; l++) {
+ drm_intel_bo *sampler_state_bo;
+
+ sampler_state_bo =
+ gen4_create_sampler_state(pScrn,
+ i, j,
+ k, l,
+ border_color_bo);
+
+ for (m = 0; m < WM_KERNEL_COUNT; m++) {
+ if (IS_IGDNG(pI830))
+ render_state->
+ wm_state_bo[m][i][j]
+ [k][l] =
+ gen4_create_wm_state
+ (pScrn,
+ wm_kernels_gen5[m].
+ has_mask,
+ render_state->
+ wm_kernel_bo[m],
+ sampler_state_bo);
+ else
+ render_state->
+ wm_state_bo[m][i][j]
+ [k][l] =
+ gen4_create_wm_state
+ (pScrn,
+ wm_kernels[m].
+ has_mask,
+ render_state->
+ wm_kernel_bo[m],
+ sampler_state_bo);
+ }
+ drm_intel_bo_unreference
+ (sampler_state_bo);
+ }
+ }
}
- }
}
- }
- drm_intel_bo_unreference(border_color_bo);
-
- render_state->cc_state_bo = gen4_create_cc_unit_state(pScrn);
- render_state->sip_kernel_bo = intel_bo_alloc_for_data(pScrn,
- sip_kernel_static,
- sizeof(sip_kernel_static),
- "sip kernel");
+ drm_intel_bo_unreference(border_color_bo);
+
+ render_state->cc_state_bo = gen4_create_cc_unit_state(pScrn);
+ render_state->sip_kernel_bo = intel_bo_alloc_for_data(pScrn,
+ sip_kernel_static,
+ sizeof
+ (sip_kernel_static),
+ "sip kernel");
}
/**
* Called at LeaveVT.
*/
-void
-gen4_render_state_cleanup(ScrnInfoPtr pScrn)
+void gen4_render_state_cleanup(ScrnInfoPtr pScrn)
{
- I830Ptr pI830 = I830PTR(pScrn);
- struct gen4_render_state *render_state= pI830->gen4_render_state;
- int i, j, k, l, m;
- gen4_composite_op *composite_op = &render_state->composite_op;
+ I830Ptr pI830 = I830PTR(pScrn);
+ struct gen4_render_state *render_state = pI830->gen4_render_state;
+ int i, j, k, l, m;
+ gen4_composite_op *composite_op = &render_state->composite_op;
- drm_intel_bo_unreference(composite_op->binding_table_bo);
- drm_intel_bo_unreference(render_state->vertex_buffer_bo);
+ drm_intel_bo_unreference(composite_op->binding_table_bo);
+ drm_intel_bo_unreference(render_state->vertex_buffer_bo);
- drm_intel_bo_unreference(render_state->vs_state_bo);
- drm_intel_bo_unreference(render_state->sf_state_bo);
- drm_intel_bo_unreference(render_state->sf_mask_state_bo);
+ drm_intel_bo_unreference(render_state->vs_state_bo);
+ drm_intel_bo_unreference(render_state->sf_state_bo);
+ drm_intel_bo_unreference(render_state->sf_mask_state_bo);
- for (i = 0; i < WM_KERNEL_COUNT; i++)
- drm_intel_bo_unreference(render_state->wm_kernel_bo[i]);
+ for (i = 0; i < WM_KERNEL_COUNT; i++)
+ drm_intel_bo_unreference(render_state->wm_kernel_bo[i]);
- for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++)
- for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++)
- for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++)
- for (l = 0; l < SAMPLER_STATE_EXTEND_COUNT; l++)
- for (m = 0; m < WM_KERNEL_COUNT; m++)
- drm_intel_bo_unreference(render_state->wm_state_bo[m][i][j][k][l]);
+ for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++)
+ for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++)
+ for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++)
+ for (l = 0; l < SAMPLER_STATE_EXTEND_COUNT; l++)
+ for (m = 0; m < WM_KERNEL_COUNT; m++)
+ drm_intel_bo_unreference
+ (render_state->
+ wm_state_bo[m][i][j][k]
+ [l]);
- drm_intel_bo_unreference(render_state->cc_state_bo);
- drm_intel_bo_unreference(render_state->sip_kernel_bo);
+ drm_intel_bo_unreference(render_state->cc_state_bo);
+ drm_intel_bo_unreference(render_state->sip_kernel_bo);
- free(pI830->gen4_render_state);
- pI830->gen4_render_state = NULL;
+ free(pI830->gen4_render_state);
+ pI830->gen4_render_state = NULL;
}
diff --git a/src/i965_video.c b/src/i965_video.c
index aa0a501d..881554c9 100644
--- a/src/i965_video.c
+++ b/src/i965_video.c
@@ -48,25 +48,25 @@
static const uint32_t sip_kernel_static[][4] = {
/* wait (1) a0<1>UW a145<0,1,0>UW { align1 + } */
- { 0x00000030, 0x20000108, 0x00001220, 0x00000000 },
+ {0x00000030, 0x20000108, 0x00001220, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
/* nop (4) g0<1>UD { align1 + } */
- { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 },
+ {0x0040007e, 0x20000c21, 0x00690000, 0x00000000},
};
/*
@@ -131,40 +131,43 @@ static const uint32_t ps_kernel_planar_static_gen5[][4] = {
#include "exa_wm_write.g4b.gen5"
};
-static uint32_t float_to_uint (float f) {
- union {uint32_t i; float f;} x;
- x.f = f;
- return x.i;
+static uint32_t float_to_uint(float f)
+{
+ union {
+ uint32_t i;
+ float f;
+ } x;
+ x.f = f;
+ return x.i;
}
#if 0
static struct {
- uint32_t svg_ctl;
- char *name;
+ uint32_t svg_ctl;
+ char *name;
} svg_ctl_bits[] = {
- { BRW_SVG_CTL_GS_BA, "General State Base Address" },
- { BRW_SVG_CTL_SS_BA, "Surface State Base Address" },
- { BRW_SVG_CTL_IO_BA, "Indirect Object Base Address" },
- { BRW_SVG_CTL_GS_AUB, "Generate State Access Upper Bound" },
- { BRW_SVG_CTL_IO_AUB, "Indirect Object Access Upper Bound" },
- { BRW_SVG_CTL_SIP, "System Instruction Pointer" },
- { 0, 0 },
-};
-
-static void
-brw_debug (ScrnInfoPtr pScrn, char *when)
+ {
+ BRW_SVG_CTL_GS_BA, "General State Base Address"}, {
+ BRW_SVG_CTL_SS_BA, "Surface State Base Address"}, {
+ BRW_SVG_CTL_IO_BA, "Indirect Object Base Address"}, {
+ BRW_SVG_CTL_GS_AUB, "Generate State Access Upper Bound"}, {
+ BRW_SVG_CTL_IO_AUB, "Indirect Object Access Upper Bound"}, {
+ BRW_SVG_CTL_SIP, "System Instruction Pointer"}, {
+0, 0},};
+
+static void brw_debug(ScrnInfoPtr pScrn, char *when)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int i;
- uint32_t v;
-
- I830Sync (pScrn);
- ErrorF("brw_debug: %s\n", when);
- for (i = 0; svg_ctl_bits[i].name; i++) {
- OUTREG(BRW_SVG_CTL, svg_ctl_bits[i].svg_ctl);
- v = INREG(BRW_SVG_RDATA);
- ErrorF("\t%34.34s: 0x%08x\n", svg_ctl_bits[i].name, v);
- }
+ I830Ptr pI830 = I830PTR(pScrn);
+ int i;
+ uint32_t v;
+
+ I830Sync(pScrn);
+ ErrorF("brw_debug: %s\n", when);
+ for (i = 0; svg_ctl_bits[i].name; i++) {
+ OUTREG(BRW_SVG_CTL, svg_ctl_bits[i].svg_ctl);
+ v = INREG(BRW_SVG_RDATA);
+ ErrorF("\t%34.34s: 0x%08x\n", svg_ctl_bits[i].name, v);
+ }
}
#endif
@@ -172,150 +175,142 @@ brw_debug (ScrnInfoPtr pScrn, char *when)
#define WATCH_WIZ 0
#define WATCH_STATS 0
-static void
-i965_pre_draw_debug(ScrnInfoPtr scrn)
+static void i965_pre_draw_debug(ScrnInfoPtr scrn)
{
#if 0
- I830Ptr pI830 = I830PTR(scrn);
+ I830Ptr pI830 = I830PTR(scrn);
#endif
#if 0
- ErrorF ("before EU_ATT 0x%08x%08x EU_ATT_DATA 0x%08x%08x\n",
- INREG(BRW_EU_ATT_1), INREG(BRW_EU_ATT_0),
- INREG(BRW_EU_ATT_DATA_1), INREG(BRW_EU_ATT_DATA_0));
-
- OUTREG(BRW_VF_CTL,
- BRW_VF_CTL_SNAPSHOT_MUX_SELECT_THREADID |
- BRW_VF_CTL_SNAPSHOT_TYPE_VERTEX_INDEX |
- BRW_VF_CTL_SNAPSHOT_ENABLE);
- OUTREG(BRW_VF_STRG_VAL, 0);
+ ErrorF("before EU_ATT 0x%08x%08x EU_ATT_DATA 0x%08x%08x\n",
+ INREG(BRW_EU_ATT_1), INREG(BRW_EU_ATT_0),
+ INREG(BRW_EU_ATT_DATA_1), INREG(BRW_EU_ATT_DATA_0));
+
+ OUTREG(BRW_VF_CTL,
+ BRW_VF_CTL_SNAPSHOT_MUX_SELECT_THREADID |
+ BRW_VF_CTL_SNAPSHOT_TYPE_VERTEX_INDEX |
+ BRW_VF_CTL_SNAPSHOT_ENABLE);
+ OUTREG(BRW_VF_STRG_VAL, 0);
#endif
#if 0
- OUTREG(BRW_VS_CTL,
- BRW_VS_CTL_SNAPSHOT_ALL_THREADS |
- BRW_VS_CTL_SNAPSHOT_MUX_VALID_COUNT |
- BRW_VS_CTL_THREAD_SNAPSHOT_ENABLE);
+ OUTREG(BRW_VS_CTL,
+ BRW_VS_CTL_SNAPSHOT_ALL_THREADS |
+ BRW_VS_CTL_SNAPSHOT_MUX_VALID_COUNT |
+ BRW_VS_CTL_THREAD_SNAPSHOT_ENABLE);
- OUTREG(BRW_VS_STRG_VAL, 0);
+ OUTREG(BRW_VS_STRG_VAL, 0);
#endif
#if WATCH_SF
- OUTREG(BRW_SF_CTL,
- BRW_SF_CTL_SNAPSHOT_MUX_VERTEX_COUNT |
- BRW_SF_CTL_SNAPSHOT_ALL_THREADS |
- BRW_SF_CTL_THREAD_SNAPSHOT_ENABLE);
- OUTREG(BRW_SF_STRG_VAL, 0);
+ OUTREG(BRW_SF_CTL,
+ BRW_SF_CTL_SNAPSHOT_MUX_VERTEX_COUNT |
+ BRW_SF_CTL_SNAPSHOT_ALL_THREADS |
+ BRW_SF_CTL_THREAD_SNAPSHOT_ENABLE);
+ OUTREG(BRW_SF_STRG_VAL, 0);
#endif
#if WATCH_WIZ
- OUTREG(BRW_WIZ_CTL,
- BRW_WIZ_CTL_SNAPSHOT_MUX_SUBSPAN_INSTANCE |
- BRW_WIZ_CTL_SNAPSHOT_ALL_THREADS |
- BRW_WIZ_CTL_SNAPSHOT_ENABLE);
- OUTREG(BRW_WIZ_STRG_VAL,
- (box_x1) | (box_y1 << 16));
+ OUTREG(BRW_WIZ_CTL,
+ BRW_WIZ_CTL_SNAPSHOT_MUX_SUBSPAN_INSTANCE |
+ BRW_WIZ_CTL_SNAPSHOT_ALL_THREADS | BRW_WIZ_CTL_SNAPSHOT_ENABLE);
+ OUTREG(BRW_WIZ_STRG_VAL, (box_x1) | (box_y1 << 16));
#endif
#if 0
- OUTREG(BRW_TS_CTL,
- BRW_TS_CTL_SNAPSHOT_MESSAGE_ERROR |
- BRW_TS_CTL_SNAPSHOT_ALL_CHILD_THREADS |
- BRW_TS_CTL_SNAPSHOT_ALL_ROOT_THREADS |
- BRW_TS_CTL_SNAPSHOT_ENABLE);
+ OUTREG(BRW_TS_CTL,
+ BRW_TS_CTL_SNAPSHOT_MESSAGE_ERROR |
+ BRW_TS_CTL_SNAPSHOT_ALL_CHILD_THREADS |
+ BRW_TS_CTL_SNAPSHOT_ALL_ROOT_THREADS |
+ BRW_TS_CTL_SNAPSHOT_ENABLE);
#endif
}
-static void
-i965_post_draw_debug(ScrnInfoPtr scrn)
+static void i965_post_draw_debug(ScrnInfoPtr scrn)
{
#if 0
- I830Ptr pI830 = I830PTR(scrn);
+ I830Ptr pI830 = I830PTR(scrn);
#endif
#if 0
- for (j = 0; j < 100000; j++) {
- ctl = INREG(BRW_VF_CTL);
- if (ctl & BRW_VF_CTL_SNAPSHOT_COMPLETE)
- break;
- }
-
- rdata = INREG(BRW_VF_RDATA);
- OUTREG(BRW_VF_CTL, 0);
- ErrorF ("VF_CTL: 0x%08x VF_RDATA: 0x%08x\n", ctl, rdata);
+ for (j = 0; j < 100000; j++) {
+ ctl = INREG(BRW_VF_CTL);
+ if (ctl & BRW_VF_CTL_SNAPSHOT_COMPLETE)
+ break;
+ }
+
+ rdata = INREG(BRW_VF_RDATA);
+ OUTREG(BRW_VF_CTL, 0);
+ ErrorF("VF_CTL: 0x%08x VF_RDATA: 0x%08x\n", ctl, rdata);
#endif
#if 0
- for (j = 0; j < 1000000; j++) {
- ctl = INREG(BRW_VS_CTL);
- if (ctl & BRW_VS_CTL_SNAPSHOT_COMPLETE)
- break;
- }
-
- rdata = INREG(BRW_VS_RDATA);
- for (k = 0; k <= 3; k++) {
- OUTREG(BRW_VS_CTL,
- BRW_VS_CTL_SNAPSHOT_COMPLETE |
- (k << 8));
+ for (j = 0; j < 1000000; j++) {
+ ctl = INREG(BRW_VS_CTL);
+ if (ctl & BRW_VS_CTL_SNAPSHOT_COMPLETE)
+ break;
+ }
+
rdata = INREG(BRW_VS_RDATA);
- ErrorF ("VS_CTL: 0x%08x VS_RDATA(%d): 0x%08x\n", ctl, k, rdata);
- }
+ for (k = 0; k <= 3; k++) {
+ OUTREG(BRW_VS_CTL, BRW_VS_CTL_SNAPSHOT_COMPLETE | (k << 8));
+ rdata = INREG(BRW_VS_RDATA);
+ ErrorF("VS_CTL: 0x%08x VS_RDATA(%d): 0x%08x\n", ctl, k, rdata);
+ }
- OUTREG(BRW_VS_CTL, 0);
+ OUTREG(BRW_VS_CTL, 0);
#endif
#if WATCH_SF
- for (j = 0; j < 1000000; j++) {
- ctl = INREG(BRW_SF_CTL);
- if (ctl & BRW_SF_CTL_SNAPSHOT_COMPLETE)
- break;
- }
+ for (j = 0; j < 1000000; j++) {
+ ctl = INREG(BRW_SF_CTL);
+ if (ctl & BRW_SF_CTL_SNAPSHOT_COMPLETE)
+ break;
+ }
- for (k = 0; k <= 7; k++) {
- OUTREG(BRW_SF_CTL,
- BRW_SF_CTL_SNAPSHOT_COMPLETE |
- (k << 8));
- rdata = INREG(BRW_SF_RDATA);
- ErrorF("SF_CTL: 0x%08x SF_RDATA(%d): 0x%08x\n", ctl, k, rdata);
- }
+ for (k = 0; k <= 7; k++) {
+ OUTREG(BRW_SF_CTL, BRW_SF_CTL_SNAPSHOT_COMPLETE | (k << 8));
+ rdata = INREG(BRW_SF_RDATA);
+ ErrorF("SF_CTL: 0x%08x SF_RDATA(%d): 0x%08x\n", ctl, k, rdata);
+ }
- OUTREG(BRW_SF_CTL, 0);
+ OUTREG(BRW_SF_CTL, 0);
#endif
#if WATCH_WIZ
- for (j = 0; j < 100000; j++) {
- ctl = INREG(BRW_WIZ_CTL);
- if (ctl & BRW_WIZ_CTL_SNAPSHOT_COMPLETE)
- break;
- }
-
- rdata = INREG(BRW_WIZ_RDATA);
- OUTREG(BRW_WIZ_CTL, 0);
- ErrorF("WIZ_CTL: 0x%08x WIZ_RDATA: 0x%08x\n", ctl, rdata);
+ for (j = 0; j < 100000; j++) {
+ ctl = INREG(BRW_WIZ_CTL);
+ if (ctl & BRW_WIZ_CTL_SNAPSHOT_COMPLETE)
+ break;
+ }
+
+ rdata = INREG(BRW_WIZ_RDATA);
+ OUTREG(BRW_WIZ_CTL, 0);
+ ErrorF("WIZ_CTL: 0x%08x WIZ_RDATA: 0x%08x\n", ctl, rdata);
#endif
#if 0
- for (j = 0; j < 100000; j++) {
- ctl = INREG(BRW_TS_CTL);
- if (ctl & BRW_TS_CTL_SNAPSHOT_COMPLETE)
- break;
- }
-
- rdata = INREG(BRW_TS_RDATA);
- OUTREG(BRW_TS_CTL, 0);
- ErrorF("TS_CTL: 0x%08x TS_RDATA: 0x%08x\n", ctl, rdata);
-
- ErrorF("after EU_ATT 0x%08x%08x EU_ATT_DATA 0x%08x%08x\n",
- INREG(BRW_EU_ATT_1), INREG(BRW_EU_ATT_0),
- INREG(BRW_EU_ATT_DATA_1), INREG(BRW_EU_ATT_DATA_0));
+ for (j = 0; j < 100000; j++) {
+ ctl = INREG(BRW_TS_CTL);
+ if (ctl & BRW_TS_CTL_SNAPSHOT_COMPLETE)
+ break;
+ }
+
+ rdata = INREG(BRW_TS_RDATA);
+ OUTREG(BRW_TS_CTL, 0);
+ ErrorF("TS_CTL: 0x%08x TS_RDATA: 0x%08x\n", ctl, rdata);
+
+ ErrorF("after EU_ATT 0x%08x%08x EU_ATT_DATA 0x%08x%08x\n",
+ INREG(BRW_EU_ATT_1), INREG(BRW_EU_ATT_0),
+ INREG(BRW_EU_ATT_DATA_1), INREG(BRW_EU_ATT_DATA_0));
#endif
#if 0
- for (j = 0; j < 256; j++) {
- OUTREG(BRW_TD_CTL, j << BRW_TD_CTL_MUX_SHIFT);
- rdata = INREG(BRW_TD_RDATA);
- ErrorF ("TD_RDATA(%d): 0x%08x\n", j, rdata);
- }
+ for (j = 0; j < 256; j++) {
+ OUTREG(BRW_TD_CTL, j << BRW_TD_CTL_MUX_SHIFT);
+ rdata = INREG(BRW_TD_RDATA);
+ ErrorF("TD_RDATA(%d): 0x%08x\n", j, rdata);
+ }
#endif
}
@@ -346,620 +341,639 @@ i965_post_draw_debug(ScrnInfoPtr scrn)
static int
intel_alloc_and_map(I830Ptr i830, char *name, int size,
- drm_intel_bo **bop, void *virtualp)
+ drm_intel_bo ** bop, void *virtualp)
{
- drm_intel_bo *bo;
-
- bo = drm_intel_bo_alloc(i830->bufmgr, name, size, 4096);
- if (!bo)
- return -1;
- if (drm_intel_bo_map(bo, TRUE) != 0) {
- drm_intel_bo_unreference(bo);
- return -1;
- }
- *bop = bo;
- *(void **) virtualp = bo->virtual;
- memset (bo->virtual, 0, size);
- return 0;
+ drm_intel_bo *bo;
+
+ bo = drm_intel_bo_alloc(i830->bufmgr, name, size, 4096);
+ if (!bo)
+ return -1;
+ if (drm_intel_bo_map(bo, TRUE) != 0) {
+ drm_intel_bo_unreference(bo);
+ return -1;
+ }
+ *bop = bo;
+ *(void **)virtualp = bo->virtual;
+ memset(bo->virtual, 0, size);
+ return 0;
}
-static drm_intel_bo *
-i965_create_dst_surface_state(ScrnInfoPtr scrn,
- PixmapPtr pixmap)
+static drm_intel_bo *i965_create_dst_surface_state(ScrnInfoPtr scrn,
+ PixmapPtr pixmap)
{
- I830Ptr pI830 = I830PTR(scrn);
- struct brw_surface_state *dest_surf_state;
- drm_intel_bo *pixmap_bo = i830_get_pixmap_bo(pixmap);
- drm_intel_bo *surf_bo;
-
- if (intel_alloc_and_map(pI830, "textured video surface state", 4096,
- &surf_bo, &dest_surf_state) != 0)
- return NULL;
-
- dest_surf_state->ss0.surface_type = BRW_SURFACE_2D;
- dest_surf_state->ss0.data_return_format = BRW_SURFACERETURNFORMAT_FLOAT32;
- if (pI830->cpp == 2) {
- dest_surf_state->ss0.surface_format = BRW_SURFACEFORMAT_B5G6R5_UNORM;
- } else {
- dest_surf_state->ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
- }
- dest_surf_state->ss0.writedisable_alpha = 0;
- dest_surf_state->ss0.writedisable_red = 0;
- dest_surf_state->ss0.writedisable_green = 0;
- dest_surf_state->ss0.writedisable_blue = 0;
- dest_surf_state->ss0.color_blend = 1;
- dest_surf_state->ss0.vert_line_stride = 0;
- dest_surf_state->ss0.vert_line_stride_ofs = 0;
- dest_surf_state->ss0.mipmap_layout_mode = 0;
- dest_surf_state->ss0.render_cache_read_mode = 0;
-
- dest_surf_state->ss1.base_addr =
- intel_emit_reloc(surf_bo, offsetof(struct brw_surface_state, ss1),
- pixmap_bo, 0,
- I915_GEM_DOMAIN_SAMPLER, 0);
-
- dest_surf_state->ss2.height = scrn->virtualY - 1;
- dest_surf_state->ss2.width = scrn->virtualX - 1;
- dest_surf_state->ss2.mip_count = 0;
- dest_surf_state->ss2.render_target_rotation = 0;
- dest_surf_state->ss3.pitch = intel_get_pixmap_pitch(pixmap) - 1;
- dest_surf_state->ss3.tiled_surface = i830_pixmap_tiled(pixmap);
- dest_surf_state->ss3.tile_walk = 0; /* TileX */
-
- drm_intel_bo_unmap(surf_bo);
- return surf_bo;
+ I830Ptr pI830 = I830PTR(scrn);
+ struct brw_surface_state *dest_surf_state;
+ drm_intel_bo *pixmap_bo = i830_get_pixmap_bo(pixmap);
+ drm_intel_bo *surf_bo;
+
+ if (intel_alloc_and_map(pI830, "textured video surface state", 4096,
+ &surf_bo, &dest_surf_state) != 0)
+ return NULL;
+
+ dest_surf_state->ss0.surface_type = BRW_SURFACE_2D;
+ dest_surf_state->ss0.data_return_format =
+ BRW_SURFACERETURNFORMAT_FLOAT32;
+ if (pI830->cpp == 2) {
+ dest_surf_state->ss0.surface_format =
+ BRW_SURFACEFORMAT_B5G6R5_UNORM;
+ } else {
+ dest_surf_state->ss0.surface_format =
+ BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
+ }
+ dest_surf_state->ss0.writedisable_alpha = 0;
+ dest_surf_state->ss0.writedisable_red = 0;
+ dest_surf_state->ss0.writedisable_green = 0;
+ dest_surf_state->ss0.writedisable_blue = 0;
+ dest_surf_state->ss0.color_blend = 1;
+ dest_surf_state->ss0.vert_line_stride = 0;
+ dest_surf_state->ss0.vert_line_stride_ofs = 0;
+ dest_surf_state->ss0.mipmap_layout_mode = 0;
+ dest_surf_state->ss0.render_cache_read_mode = 0;
+
+ dest_surf_state->ss1.base_addr =
+ intel_emit_reloc(surf_bo, offsetof(struct brw_surface_state, ss1),
+ pixmap_bo, 0, I915_GEM_DOMAIN_SAMPLER, 0);
+
+ dest_surf_state->ss2.height = scrn->virtualY - 1;
+ dest_surf_state->ss2.width = scrn->virtualX - 1;
+ dest_surf_state->ss2.mip_count = 0;
+ dest_surf_state->ss2.render_target_rotation = 0;
+ dest_surf_state->ss3.pitch = intel_get_pixmap_pitch(pixmap) - 1;
+ dest_surf_state->ss3.tiled_surface = i830_pixmap_tiled(pixmap);
+ dest_surf_state->ss3.tile_walk = 0; /* TileX */
+
+ drm_intel_bo_unmap(surf_bo);
+ return surf_bo;
}
-static drm_intel_bo *
-i965_create_src_surface_state(ScrnInfoPtr scrn,
- drm_intel_bo *src_bo,
- uint32_t src_offset,
- int src_width,
- int src_height,
- int src_pitch,
- uint32_t src_surf_format)
+static drm_intel_bo *i965_create_src_surface_state(ScrnInfoPtr scrn,
+ drm_intel_bo * src_bo,
+ uint32_t src_offset,
+ int src_width,
+ int src_height,
+ int src_pitch,
+ uint32_t src_surf_format)
{
- I830Ptr pI830 = I830PTR(scrn);
- drm_intel_bo *surface_bo;
- struct brw_surface_state *src_surf_state;
-
- if (intel_alloc_and_map(pI830, "textured video surface state", 4096,
- &surface_bo, &src_surf_state) != 0)
- return NULL;
-
- /* Set up the source surface state buffer */
- src_surf_state->ss0.surface_type = BRW_SURFACE_2D;
- src_surf_state->ss0.surface_format = src_surf_format;
- src_surf_state->ss0.writedisable_alpha = 0;
- src_surf_state->ss0.writedisable_red = 0;
- src_surf_state->ss0.writedisable_green = 0;
- src_surf_state->ss0.writedisable_blue = 0;
- src_surf_state->ss0.color_blend = 1;
- src_surf_state->ss0.vert_line_stride = 0;
- src_surf_state->ss0.vert_line_stride_ofs = 0;
- src_surf_state->ss0.mipmap_layout_mode = 0;
- src_surf_state->ss0.render_cache_read_mode = 0;
-
- src_surf_state->ss2.width = src_width - 1;
- src_surf_state->ss2.height = src_height - 1;
- src_surf_state->ss2.mip_count = 0;
- src_surf_state->ss2.render_target_rotation = 0;
- src_surf_state->ss3.pitch = src_pitch - 1;
-
- if (src_bo) {
- src_surf_state->ss1.base_addr =
- intel_emit_reloc(surface_bo,
- offsetof(struct brw_surface_state, ss1),
- src_bo, src_offset,
- I915_GEM_DOMAIN_SAMPLER, 0);
- } else {
- src_surf_state->ss1.base_addr = src_offset;
- }
-
- drm_intel_bo_unmap(surface_bo);
- return surface_bo;
+ I830Ptr pI830 = I830PTR(scrn);
+ drm_intel_bo *surface_bo;
+ struct brw_surface_state *src_surf_state;
+
+ if (intel_alloc_and_map(pI830, "textured video surface state", 4096,
+ &surface_bo, &src_surf_state) != 0)
+ return NULL;
+
+ /* Set up the source surface state buffer */
+ src_surf_state->ss0.surface_type = BRW_SURFACE_2D;
+ src_surf_state->ss0.surface_format = src_surf_format;
+ src_surf_state->ss0.writedisable_alpha = 0;
+ src_surf_state->ss0.writedisable_red = 0;
+ src_surf_state->ss0.writedisable_green = 0;
+ src_surf_state->ss0.writedisable_blue = 0;
+ src_surf_state->ss0.color_blend = 1;
+ src_surf_state->ss0.vert_line_stride = 0;
+ src_surf_state->ss0.vert_line_stride_ofs = 0;
+ src_surf_state->ss0.mipmap_layout_mode = 0;
+ src_surf_state->ss0.render_cache_read_mode = 0;
+
+ src_surf_state->ss2.width = src_width - 1;
+ src_surf_state->ss2.height = src_height - 1;
+ src_surf_state->ss2.mip_count = 0;
+ src_surf_state->ss2.render_target_rotation = 0;
+ src_surf_state->ss3.pitch = src_pitch - 1;
+
+ if (src_bo) {
+ src_surf_state->ss1.base_addr =
+ intel_emit_reloc(surface_bo,
+ offsetof(struct brw_surface_state, ss1),
+ src_bo, src_offset,
+ I915_GEM_DOMAIN_SAMPLER, 0);
+ } else {
+ src_surf_state->ss1.base_addr = src_offset;
+ }
+
+ drm_intel_bo_unmap(surface_bo);
+ return surface_bo;
}
-static drm_intel_bo *
-i965_create_binding_table(ScrnInfoPtr scrn, drm_intel_bo **surf_bos, int n_surf)
+static drm_intel_bo *i965_create_binding_table(ScrnInfoPtr scrn,
+ drm_intel_bo ** surf_bos,
+ int n_surf)
{
- I830Ptr pI830 = I830PTR(scrn);
- drm_intel_bo *bind_bo;
- uint32_t *binding_table;
- int i;
+ I830Ptr pI830 = I830PTR(scrn);
+ drm_intel_bo *bind_bo;
+ uint32_t *binding_table;
+ int i;
- /* Set up a binding table for our surfaces. Only the PS will use it */
+ /* Set up a binding table for our surfaces. Only the PS will use it */
- if (intel_alloc_and_map(pI830, "textured video binding table", 4096,
- &bind_bo, &binding_table) != 0)
- return NULL;
+ if (intel_alloc_and_map(pI830, "textured video binding table", 4096,
+ &bind_bo, &binding_table) != 0)
+ return NULL;
- for (i = 0; i < n_surf; i++)
- binding_table[i] = intel_emit_reloc(bind_bo, i * sizeof(uint32_t),
- surf_bos[i], 0,
- I915_GEM_DOMAIN_INSTRUCTION, 0);
+ for (i = 0; i < n_surf; i++)
+ binding_table[i] =
+ intel_emit_reloc(bind_bo, i * sizeof(uint32_t), surf_bos[i],
+ 0, I915_GEM_DOMAIN_INSTRUCTION, 0);
- drm_intel_bo_unmap(bind_bo);
- return bind_bo;
+ drm_intel_bo_unmap(bind_bo);
+ return bind_bo;
}
-static drm_intel_bo *
-i965_create_sampler_state(ScrnInfoPtr scrn)
+static drm_intel_bo *i965_create_sampler_state(ScrnInfoPtr scrn)
{
- I830Ptr pI830 = I830PTR(scrn);
- drm_intel_bo *sampler_bo;
- struct brw_sampler_state *sampler_state;
-
- if (intel_alloc_and_map(pI830, "textured video sampler state", 4096,
- &sampler_bo, &sampler_state) != 0)
- return NULL;
-
- sampler_state->ss0.min_filter = BRW_MAPFILTER_LINEAR;
- sampler_state->ss0.mag_filter = BRW_MAPFILTER_LINEAR;
- sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
- sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
- sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
-
- drm_intel_bo_unmap(sampler_bo);
- return sampler_bo;
+ I830Ptr pI830 = I830PTR(scrn);
+ drm_intel_bo *sampler_bo;
+ struct brw_sampler_state *sampler_state;
+
+ if (intel_alloc_and_map(pI830, "textured video sampler state", 4096,
+ &sampler_bo, &sampler_state) != 0)
+ return NULL;
+
+ sampler_state->ss0.min_filter = BRW_MAPFILTER_LINEAR;
+ sampler_state->ss0.mag_filter = BRW_MAPFILTER_LINEAR;
+ sampler_state->ss1.r_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+ sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+ sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
+
+ drm_intel_bo_unmap(sampler_bo);
+ return sampler_bo;
}
-static drm_intel_bo *
-i965_create_vs_state(ScrnInfoPtr scrn)
+static drm_intel_bo *i965_create_vs_state(ScrnInfoPtr scrn)
{
- I830Ptr pI830 = I830PTR(scrn);
- drm_intel_bo *vs_bo;
- struct brw_vs_unit_state *vs_state;
-
- if (intel_alloc_and_map(pI830, "textured video vs state", 4096,
- &vs_bo, &vs_state) != 0)
- return NULL;
-
- /* Set up the vertex shader to be disabled (passthrough) */
- if (IS_IGDNG(pI830))
- vs_state->thread4.nr_urb_entries = URB_VS_ENTRIES >> 2;
- else
- vs_state->thread4.nr_urb_entries = URB_VS_ENTRIES;
- vs_state->thread4.urb_entry_allocation_size = URB_VS_ENTRY_SIZE - 1;
- vs_state->vs6.vs_enable = 0;
- vs_state->vs6.vert_cache_disable = 1;
-
- drm_intel_bo_unmap(vs_bo);
- return vs_bo;
+ I830Ptr pI830 = I830PTR(scrn);
+ drm_intel_bo *vs_bo;
+ struct brw_vs_unit_state *vs_state;
+
+ if (intel_alloc_and_map(pI830, "textured video vs state", 4096,
+ &vs_bo, &vs_state) != 0)
+ return NULL;
+
+ /* Set up the vertex shader to be disabled (passthrough) */
+ if (IS_IGDNG(pI830))
+ vs_state->thread4.nr_urb_entries = URB_VS_ENTRIES >> 2;
+ else
+ vs_state->thread4.nr_urb_entries = URB_VS_ENTRIES;
+ vs_state->thread4.urb_entry_allocation_size = URB_VS_ENTRY_SIZE - 1;
+ vs_state->vs6.vs_enable = 0;
+ vs_state->vs6.vert_cache_disable = 1;
+
+ drm_intel_bo_unmap(vs_bo);
+ return vs_bo;
}
-static drm_intel_bo *
-i965_create_program(ScrnInfoPtr scrn, const uint32_t *program,
- unsigned int program_size)
+static drm_intel_bo *i965_create_program(ScrnInfoPtr scrn,
+ const uint32_t * program,
+ unsigned int program_size)
{
- I830Ptr pI830 = I830PTR(scrn);
- drm_intel_bo *prog_bo;
+ I830Ptr pI830 = I830PTR(scrn);
+ drm_intel_bo *prog_bo;
- prog_bo = drm_intel_bo_alloc(pI830->bufmgr, "textured video program",
- program_size, 4096);
- if (!prog_bo)
- return NULL;
+ prog_bo = drm_intel_bo_alloc(pI830->bufmgr, "textured video program",
+ program_size, 4096);
+ if (!prog_bo)
+ return NULL;
- drm_intel_bo_subdata(prog_bo, 0, program_size, program);
+ drm_intel_bo_subdata(prog_bo, 0, program_size, program);
- return prog_bo;
+ return prog_bo;
}
-static drm_intel_bo *
-i965_create_sf_state(ScrnInfoPtr scrn)
+static drm_intel_bo *i965_create_sf_state(ScrnInfoPtr scrn)
{
- I830Ptr pI830 = I830PTR(scrn);
- drm_intel_bo *sf_bo, *kernel_bo;
- struct brw_sf_unit_state *sf_state;
-
- if (IS_IGDNG(pI830))
- kernel_bo = i965_create_program(scrn, &sf_kernel_static_gen5[0][0],
- sizeof(sf_kernel_static_gen5));
- else
- kernel_bo = i965_create_program(scrn, &sf_kernel_static[0][0],
- sizeof(sf_kernel_static));
-
- if (!kernel_bo)
- return NULL;
-
- if (intel_alloc_and_map(pI830, "textured video sf state", 4096,
- &sf_bo, &sf_state) != 0)
- {
- drm_intel_bo_unreference(kernel_bo);
- return NULL;
- }
-
- /* Set up the SF kernel to do coord interp: for each attribute,
- * calculate dA/dx and dA/dy. Hand these interpolation coefficients
- * back to SF which then hands pixels off to WM.
- */
- sf_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(SF_KERNEL_NUM_GRF);
- sf_state->thread0.kernel_start_pointer =
- intel_emit_reloc(sf_bo, offsetof(struct brw_sf_unit_state, thread0),
- kernel_bo, sf_state->thread0.grf_reg_count << 1,
- I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
- sf_state->sf1.single_program_flow = 1; /* XXX */
- sf_state->sf1.binding_table_entry_count = 0;
- sf_state->sf1.thread_priority = 0;
- sf_state->sf1.floating_point_mode = 0; /* Mesa does this */
- sf_state->sf1.illegal_op_exception_enable = 1;
- sf_state->sf1.mask_stack_exception_enable = 1;
- sf_state->sf1.sw_exception_enable = 1;
- sf_state->thread2.per_thread_scratch_space = 0;
- /* scratch space is not used in our kernel */
- sf_state->thread2.scratch_space_base_pointer = 0;
- sf_state->thread3.const_urb_entry_read_length = 0; /* no const URBs */
- sf_state->thread3.const_urb_entry_read_offset = 0; /* no const URBs */
- sf_state->thread3.urb_entry_read_length = 1; /* 1 URB per vertex */
- sf_state->thread3.urb_entry_read_offset = 0;
- sf_state->thread3.dispatch_grf_start_reg = 3;
- sf_state->thread4.max_threads = SF_MAX_THREADS - 1;
- sf_state->thread4.urb_entry_allocation_size = URB_SF_ENTRY_SIZE - 1;
- sf_state->thread4.nr_urb_entries = URB_SF_ENTRIES;
- sf_state->thread4.stats_enable = 1;
- sf_state->sf5.viewport_transform = FALSE; /* skip viewport */
- sf_state->sf6.cull_mode = BRW_CULLMODE_NONE;
- sf_state->sf6.scissor = 0;
- sf_state->sf7.trifan_pv = 2;
- sf_state->sf6.dest_org_vbias = 0x8;
- sf_state->sf6.dest_org_hbias = 0x8;
-
- drm_intel_bo_unmap(sf_bo);
- return sf_bo;
+ I830Ptr pI830 = I830PTR(scrn);
+ drm_intel_bo *sf_bo, *kernel_bo;
+ struct brw_sf_unit_state *sf_state;
+
+ if (IS_IGDNG(pI830))
+ kernel_bo =
+ i965_create_program(scrn, &sf_kernel_static_gen5[0][0],
+ sizeof(sf_kernel_static_gen5));
+ else
+ kernel_bo = i965_create_program(scrn, &sf_kernel_static[0][0],
+ sizeof(sf_kernel_static));
+
+ if (!kernel_bo)
+ return NULL;
+
+ if (intel_alloc_and_map(pI830, "textured video sf state", 4096,
+ &sf_bo, &sf_state) != 0) {
+ drm_intel_bo_unreference(kernel_bo);
+ return NULL;
+ }
+
+ /* Set up the SF kernel to do coord interp: for each attribute,
+ * calculate dA/dx and dA/dy. Hand these interpolation coefficients
+ * back to SF which then hands pixels off to WM.
+ */
+ sf_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(SF_KERNEL_NUM_GRF);
+ sf_state->thread0.kernel_start_pointer =
+ intel_emit_reloc(sf_bo, offsetof(struct brw_sf_unit_state, thread0),
+ kernel_bo, sf_state->thread0.grf_reg_count << 1,
+ I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
+ sf_state->sf1.single_program_flow = 1; /* XXX */
+ sf_state->sf1.binding_table_entry_count = 0;
+ sf_state->sf1.thread_priority = 0;
+ sf_state->sf1.floating_point_mode = 0; /* Mesa does this */
+ sf_state->sf1.illegal_op_exception_enable = 1;
+ sf_state->sf1.mask_stack_exception_enable = 1;
+ sf_state->sf1.sw_exception_enable = 1;
+ sf_state->thread2.per_thread_scratch_space = 0;
+ /* scratch space is not used in our kernel */
+ sf_state->thread2.scratch_space_base_pointer = 0;
+ sf_state->thread3.const_urb_entry_read_length = 0; /* no const URBs */
+ sf_state->thread3.const_urb_entry_read_offset = 0; /* no const URBs */
+ sf_state->thread3.urb_entry_read_length = 1; /* 1 URB per vertex */
+ sf_state->thread3.urb_entry_read_offset = 0;
+ sf_state->thread3.dispatch_grf_start_reg = 3;
+ sf_state->thread4.max_threads = SF_MAX_THREADS - 1;
+ sf_state->thread4.urb_entry_allocation_size = URB_SF_ENTRY_SIZE - 1;
+ sf_state->thread4.nr_urb_entries = URB_SF_ENTRIES;
+ sf_state->thread4.stats_enable = 1;
+ sf_state->sf5.viewport_transform = FALSE; /* skip viewport */
+ sf_state->sf6.cull_mode = BRW_CULLMODE_NONE;
+ sf_state->sf6.scissor = 0;
+ sf_state->sf7.trifan_pv = 2;
+ sf_state->sf6.dest_org_vbias = 0x8;
+ sf_state->sf6.dest_org_hbias = 0x8;
+
+ drm_intel_bo_unmap(sf_bo);
+ return sf_bo;
}
-static drm_intel_bo *
-i965_create_wm_state(ScrnInfoPtr scrn, drm_intel_bo *sampler_bo, Bool is_packed)
+static drm_intel_bo *i965_create_wm_state(ScrnInfoPtr scrn,
+ drm_intel_bo * sampler_bo,
+ Bool is_packed)
{
- I830Ptr pI830 = I830PTR(scrn);
- drm_intel_bo *wm_bo, *kernel_bo;
- struct brw_wm_unit_state *wm_state;
+ I830Ptr pI830 = I830PTR(scrn);
+ drm_intel_bo *wm_bo, *kernel_bo;
+ struct brw_wm_unit_state *wm_state;
+
+ if (is_packed) {
+ if (IS_IGDNG(pI830))
+ kernel_bo =
+ i965_create_program(scrn,
+ &ps_kernel_packed_static_gen5[0]
+ [0],
+ sizeof
+ (ps_kernel_packed_static_gen5));
+ else
+ kernel_bo =
+ i965_create_program(scrn,
+ &ps_kernel_packed_static[0][0],
+ sizeof
+ (ps_kernel_packed_static));
+ } else {
+ if (IS_IGDNG(pI830))
+ kernel_bo =
+ i965_create_program(scrn,
+ &ps_kernel_planar_static_gen5[0]
+ [0],
+ sizeof
+ (ps_kernel_planar_static_gen5));
+ else
+ kernel_bo =
+ i965_create_program(scrn,
+ &ps_kernel_planar_static[0][0],
+ sizeof
+ (ps_kernel_planar_static));
+ }
+ if (!kernel_bo)
+ return NULL;
+
+ if (intel_alloc_and_map
+ (pI830, "textured video wm state", sizeof(*wm_state), &wm_bo,
+ &wm_state)) {
+ drm_intel_bo_unreference(kernel_bo);
+ return NULL;
+ }
- if (is_packed) {
- if (IS_IGDNG(pI830))
- kernel_bo = i965_create_program(scrn, &ps_kernel_packed_static_gen5[0][0],
- sizeof(ps_kernel_packed_static_gen5));
+ wm_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
+ wm_state->thread0.kernel_start_pointer =
+ intel_emit_reloc(wm_bo, offsetof(struct brw_wm_unit_state, thread0),
+ kernel_bo, wm_state->thread0.grf_reg_count << 1,
+ I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
+ wm_state->thread1.single_program_flow = 1; /* XXX */
+ if (is_packed)
+ wm_state->thread1.binding_table_entry_count = 2;
else
- kernel_bo = i965_create_program(scrn, &ps_kernel_packed_static[0][0],
- sizeof(ps_kernel_packed_static));
- } else {
+ wm_state->thread1.binding_table_entry_count = 7;
+
+ /* binding table entry count is only used for prefetching, and it has to
+ * be set 0 for IGDNG
+ */
+ if (IS_IGDNG(pI830))
+ wm_state->thread1.binding_table_entry_count = 0;
+
+ /* Though we never use the scratch space in our WM kernel, it has to be
+ * set, and the minimum allocation is 1024 bytes.
+ */
+ wm_state->thread2.scratch_space_base_pointer = 0;
+ wm_state->thread2.per_thread_scratch_space = 0; /* 1024 bytes */
+ wm_state->thread3.dispatch_grf_start_reg = 3; /* XXX */
+ wm_state->thread3.const_urb_entry_read_length = 0;
+ wm_state->thread3.const_urb_entry_read_offset = 0;
+ wm_state->thread3.urb_entry_read_length = 1; /* XXX */
+ wm_state->thread3.urb_entry_read_offset = 0; /* XXX */
+ wm_state->wm4.stats_enable = 1;
+ wm_state->wm4.sampler_state_pointer =
+ intel_emit_reloc(wm_bo, offsetof(struct brw_wm_unit_state, wm4),
+ sampler_bo, 0,
+ I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
if (IS_IGDNG(pI830))
- kernel_bo = i965_create_program(scrn, &ps_kernel_planar_static_gen5[0][0],
- sizeof(ps_kernel_planar_static_gen5));
+ wm_state->wm4.sampler_count = 0;
else
- kernel_bo = i965_create_program(scrn, &ps_kernel_planar_static[0][0],
- sizeof(ps_kernel_planar_static));
- }
- if (!kernel_bo)
- return NULL;
-
- if (intel_alloc_and_map(pI830, "textured video wm state", sizeof (*wm_state),
- &wm_bo, &wm_state)) {
+ wm_state->wm4.sampler_count = 1; /* 1-4 samplers used */
+ wm_state->wm5.max_threads = PS_MAX_THREADS - 1;
+ wm_state->wm5.thread_dispatch_enable = 1;
+ wm_state->wm5.enable_16_pix = 1;
+ wm_state->wm5.enable_8_pix = 0;
+ wm_state->wm5.early_depth_test = 1;
+
drm_intel_bo_unreference(kernel_bo);
- return NULL;
- }
-
- wm_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
- wm_state->thread0.kernel_start_pointer =
- intel_emit_reloc(wm_bo, offsetof(struct brw_wm_unit_state, thread0),
- kernel_bo, wm_state->thread0.grf_reg_count << 1,
- I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
- wm_state->thread1.single_program_flow = 1; /* XXX */
- if (is_packed)
- wm_state->thread1.binding_table_entry_count = 2;
- else
- wm_state->thread1.binding_table_entry_count = 7;
-
- /* binding table entry count is only used for prefetching, and it has to
- * be set 0 for IGDNG
- */
- if (IS_IGDNG(pI830))
- wm_state->thread1.binding_table_entry_count = 0;
-
- /* Though we never use the scratch space in our WM kernel, it has to be
- * set, and the minimum allocation is 1024 bytes.
- */
- wm_state->thread2.scratch_space_base_pointer = 0;
- wm_state->thread2.per_thread_scratch_space = 0; /* 1024 bytes */
- wm_state->thread3.dispatch_grf_start_reg = 3; /* XXX */
- wm_state->thread3.const_urb_entry_read_length = 0;
- wm_state->thread3.const_urb_entry_read_offset = 0;
- wm_state->thread3.urb_entry_read_length = 1; /* XXX */
- wm_state->thread3.urb_entry_read_offset = 0; /* XXX */
- wm_state->wm4.stats_enable = 1;
- wm_state->wm4.sampler_state_pointer =
- intel_emit_reloc(wm_bo, offsetof(struct brw_wm_unit_state, wm4),
- sampler_bo, 0,
- I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
- if (IS_IGDNG(pI830))
- wm_state->wm4.sampler_count = 0;
- else
- wm_state->wm4.sampler_count = 1; /* 1-4 samplers used */
- wm_state->wm5.max_threads = PS_MAX_THREADS - 1;
- wm_state->wm5.thread_dispatch_enable = 1;
- wm_state->wm5.enable_16_pix = 1;
- wm_state->wm5.enable_8_pix = 0;
- wm_state->wm5.early_depth_test = 1;
-
- drm_intel_bo_unreference(kernel_bo);
-
- drm_intel_bo_unmap(wm_bo);
- return wm_bo;
+
+ drm_intel_bo_unmap(wm_bo);
+ return wm_bo;
}
-static drm_intel_bo *
-i965_create_cc_vp_state(ScrnInfoPtr scrn)
+static drm_intel_bo *i965_create_cc_vp_state(ScrnInfoPtr scrn)
{
- I830Ptr pI830 = I830PTR(scrn);
- drm_intel_bo *cc_vp_bo;
- struct brw_cc_viewport *cc_viewport;
+ I830Ptr pI830 = I830PTR(scrn);
+ drm_intel_bo *cc_vp_bo;
+ struct brw_cc_viewport *cc_viewport;
- if (intel_alloc_and_map(pI830, "textured video cc viewport", 4096,
- &cc_vp_bo, &cc_viewport) != 0)
- return NULL;
+ if (intel_alloc_and_map(pI830, "textured video cc viewport", 4096,
+ &cc_vp_bo, &cc_viewport) != 0)
+ return NULL;
- cc_viewport->min_depth = -1.e35;
- cc_viewport->max_depth = 1.e35;
+ cc_viewport->min_depth = -1.e35;
+ cc_viewport->max_depth = 1.e35;
- drm_intel_bo_unmap(cc_vp_bo);
- return cc_vp_bo;
+ drm_intel_bo_unmap(cc_vp_bo);
+ return cc_vp_bo;
}
-static drm_intel_bo *
-i965_create_cc_state(ScrnInfoPtr scrn)
+static drm_intel_bo *i965_create_cc_state(ScrnInfoPtr scrn)
{
- I830Ptr pI830 = I830PTR(scrn);
- drm_intel_bo *cc_bo, *cc_vp_bo;
- struct brw_cc_unit_state *cc_state;
+ I830Ptr pI830 = I830PTR(scrn);
+ drm_intel_bo *cc_bo, *cc_vp_bo;
+ struct brw_cc_unit_state *cc_state;
+
+ cc_vp_bo = i965_create_cc_vp_state(scrn);
+ if (!cc_vp_bo)
+ return NULL;
+
+ if (intel_alloc_and_map
+ (pI830, "textured video cc state", sizeof(*cc_state), &cc_bo,
+ &cc_state) != 0) {
+ drm_intel_bo_unreference(cc_vp_bo);
+ return NULL;
+ }
- cc_vp_bo = i965_create_cc_vp_state(scrn);
- if (!cc_vp_bo)
- return NULL;
+ /* Color calculator state */
+ memset(cc_state, 0, sizeof(*cc_state));
+ cc_state->cc0.stencil_enable = 0; /* disable stencil */
+ cc_state->cc2.depth_test = 0; /* disable depth test */
+ cc_state->cc2.logicop_enable = 1; /* enable logic op */
+ cc_state->cc3.ia_blend_enable = 1; /* blend alpha just like colors */
+ cc_state->cc3.blend_enable = 0; /* disable color blend */
+ cc_state->cc3.alpha_test = 0; /* disable alpha test */
+ cc_state->cc4.cc_viewport_state_offset =
+ intel_emit_reloc(cc_bo, offsetof(struct brw_cc_unit_state, cc4),
+ cc_vp_bo, 0, I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
+ cc_state->cc5.dither_enable = 0; /* disable dither */
+ cc_state->cc5.logicop_func = 0xc; /* WHITE */
+ cc_state->cc5.statistics_enable = 1;
+ cc_state->cc5.ia_blend_function = BRW_BLENDFUNCTION_ADD;
+ cc_state->cc5.ia_src_blend_factor = BRW_BLENDFACTOR_ONE;
+ cc_state->cc5.ia_dest_blend_factor = BRW_BLENDFACTOR_ONE;
+
+ drm_intel_bo_unmap(cc_bo);
- if (intel_alloc_and_map(pI830, "textured video cc state", sizeof(*cc_state),
- &cc_bo, &cc_state) != 0) {
drm_intel_bo_unreference(cc_vp_bo);
- return NULL;
- }
-
- /* Color calculator state */
- memset(cc_state, 0, sizeof(*cc_state));
- cc_state->cc0.stencil_enable = 0; /* disable stencil */
- cc_state->cc2.depth_test = 0; /* disable depth test */
- cc_state->cc2.logicop_enable = 1; /* enable logic op */
- cc_state->cc3.ia_blend_enable = 1; /* blend alpha just like colors */
- cc_state->cc3.blend_enable = 0; /* disable color blend */
- cc_state->cc3.alpha_test = 0; /* disable alpha test */
- cc_state->cc4.cc_viewport_state_offset =
- intel_emit_reloc(cc_bo, offsetof(struct brw_cc_unit_state, cc4),
- cc_vp_bo, 0,
- I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
- cc_state->cc5.dither_enable = 0; /* disable dither */
- cc_state->cc5.logicop_func = 0xc; /* WHITE */
- cc_state->cc5.statistics_enable = 1;
- cc_state->cc5.ia_blend_function = BRW_BLENDFUNCTION_ADD;
- cc_state->cc5.ia_src_blend_factor = BRW_BLENDFACTOR_ONE;
- cc_state->cc5.ia_dest_blend_factor = BRW_BLENDFACTOR_ONE;
-
- drm_intel_bo_unmap(cc_bo);
-
- drm_intel_bo_unreference(cc_vp_bo);
- return cc_bo;
+ return cc_bo;
}
static void
-i965_emit_video_setup(ScrnInfoPtr pScrn, drm_intel_bo *bind_bo, int n_src_surf)
+i965_emit_video_setup(ScrnInfoPtr pScrn, drm_intel_bo * bind_bo, int n_src_surf)
{
- I830Ptr pI830 = I830PTR(pScrn);
- int urb_vs_start, urb_vs_size;
- int urb_gs_start, urb_gs_size;
- int urb_clip_start, urb_clip_size;
- int urb_sf_start, urb_sf_size;
- int urb_cs_start, urb_cs_size;
- int pipe_ctl;
-
- IntelEmitInvarientState(pScrn);
- pI830->last_3d = LAST_3D_VIDEO;
-
- urb_vs_start = 0;
- urb_vs_size = URB_VS_ENTRIES * URB_VS_ENTRY_SIZE;
- urb_gs_start = urb_vs_start + urb_vs_size;
- urb_gs_size = URB_GS_ENTRIES * URB_GS_ENTRY_SIZE;
- urb_clip_start = urb_gs_start + urb_gs_size;
- urb_clip_size = URB_CLIP_ENTRIES * URB_CLIP_ENTRY_SIZE;
- urb_sf_start = urb_clip_start + urb_clip_size;
- urb_sf_size = URB_SF_ENTRIES * URB_SF_ENTRY_SIZE;
- urb_cs_start = urb_sf_start + urb_sf_size;
- urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE;
-
- BEGIN_BATCH(2);
- OUT_BATCH(MI_FLUSH |
- MI_STATE_INSTRUCTION_CACHE_FLUSH |
- BRW_MI_GLOBAL_SNAPSHOT_RESET);
- OUT_BATCH(MI_NOOP);
- ADVANCE_BATCH();
-
- /* brw_debug (pScrn, "before base address modify"); */
- if (IS_IGDNG(pI830))
- BEGIN_BATCH(14);
- else
- BEGIN_BATCH(12);
- /* Match Mesa driver setup */
- if (IS_G4X(pI830) || IS_IGDNG(pI830))
- OUT_BATCH(NEW_PIPELINE_SELECT | PIPELINE_SELECT_3D);
- else
- OUT_BATCH(BRW_PIPELINE_SELECT | PIPELINE_SELECT_3D);
-
- /* Mesa does this. Who knows... */
- OUT_BATCH(BRW_CS_URB_STATE | 0);
- OUT_BATCH((0 << 4) | /* URB Entry Allocation Size */
- (0 << 0)); /* Number of URB Entries */
-
- /* Zero out the two base address registers so all offsets are
- * absolute
- */
- if (IS_IGDNG(pI830)) {
- OUT_BATCH(BRW_STATE_BASE_ADDRESS | 6);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Generate state base address */
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Surface state base address */
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* media base addr, don't care */
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Instruction base address */
- /* general state max addr, disabled */
- OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
- /* media object state max addr, disabled */
- OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
- /* Instruction max addr, disabled */
- OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
- } else {
- OUT_BATCH(BRW_STATE_BASE_ADDRESS | 4);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Generate state base address */
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Surface state base address */
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* media base addr, don't care */
- /* general state max addr, disabled */
- OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
- /* media object state max addr, disabled */
- OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
- }
-
- /* Set system instruction pointer */
- OUT_BATCH(BRW_STATE_SIP | 0);
- /* system instruction pointer */
- OUT_RELOC(pI830->video.gen4_sip_kernel_bo,
- I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
-
- OUT_BATCH(MI_NOOP);
- ADVANCE_BATCH();
-
- /* brw_debug (pScrn, "after base address modify"); */
-
- if (IS_IGDNG(pI830))
- pipe_ctl = BRW_PIPE_CONTROL_NOWRITE;
- else
- pipe_ctl = BRW_PIPE_CONTROL_NOWRITE | BRW_PIPE_CONTROL_IS_FLUSH;
-
- BEGIN_BATCH(38);
-
- OUT_BATCH(MI_NOOP);
-
- /* Pipe control */
- OUT_BATCH(BRW_PIPE_CONTROL | pipe_ctl | 2);
- OUT_BATCH(0); /* Destination address */
- OUT_BATCH(0); /* Immediate data low DW */
- OUT_BATCH(0); /* Immediate data high DW */
-
- /* Binding table pointers */
- OUT_BATCH(BRW_3DSTATE_BINDING_TABLE_POINTERS | 4);
- OUT_BATCH(0); /* vs */
- OUT_BATCH(0); /* gs */
- OUT_BATCH(0); /* clip */
- OUT_BATCH(0); /* sf */
- /* Only the PS uses the binding table */
- OUT_RELOC(bind_bo, I915_GEM_DOMAIN_SAMPLER, 0, 0);
-
- /* Blend constant color (magenta is fun) */
- OUT_BATCH(BRW_3DSTATE_CONSTANT_COLOR | 3);
- OUT_BATCH(float_to_uint (1.0));
- OUT_BATCH(float_to_uint (0.0));
- OUT_BATCH(float_to_uint (1.0));
- OUT_BATCH(float_to_uint (1.0));
-
- /* The drawing rectangle clipping is always on. Set it to values that
- * shouldn't do any clipping.
- */
- OUT_BATCH(BRW_3DSTATE_DRAWING_RECTANGLE | 2); /* XXX 3 for BLC or CTG */
- OUT_BATCH(0x00000000); /* ymin, xmin */
- OUT_BATCH((pScrn->virtualX - 1) |
- (pScrn->virtualY - 1) << 16); /* ymax, xmax */
- OUT_BATCH(0x00000000); /* yorigin, xorigin */
-
- /* skip the depth buffer */
- /* skip the polygon stipple */
- /* skip the polygon stipple offset */
- /* skip the line stipple */
-
- /* Set the pointers to the 3d pipeline state */
- OUT_BATCH(BRW_3DSTATE_PIPELINED_POINTERS | 5);
- OUT_RELOC(pI830->video.gen4_vs_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
- /* disable GS, resulting in passthrough */
- OUT_BATCH(BRW_GS_DISABLE);
- /* disable CLIP, resulting in passthrough */
- OUT_BATCH(BRW_CLIP_DISABLE);
- OUT_RELOC(pI830->video.gen4_sf_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
- if (n_src_surf == 1)
- OUT_RELOC(pI830->video.gen4_wm_packed_bo,
- I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
- else
- OUT_RELOC(pI830->video.gen4_wm_planar_bo,
+ I830Ptr pI830 = I830PTR(pScrn);
+ int urb_vs_start, urb_vs_size;
+ int urb_gs_start, urb_gs_size;
+ int urb_clip_start, urb_clip_size;
+ int urb_sf_start, urb_sf_size;
+ int urb_cs_start, urb_cs_size;
+ int pipe_ctl;
+
+ IntelEmitInvarientState(pScrn);
+ pI830->last_3d = LAST_3D_VIDEO;
+
+ urb_vs_start = 0;
+ urb_vs_size = URB_VS_ENTRIES * URB_VS_ENTRY_SIZE;
+ urb_gs_start = urb_vs_start + urb_vs_size;
+ urb_gs_size = URB_GS_ENTRIES * URB_GS_ENTRY_SIZE;
+ urb_clip_start = urb_gs_start + urb_gs_size;
+ urb_clip_size = URB_CLIP_ENTRIES * URB_CLIP_ENTRY_SIZE;
+ urb_sf_start = urb_clip_start + urb_clip_size;
+ urb_sf_size = URB_SF_ENTRIES * URB_SF_ENTRY_SIZE;
+ urb_cs_start = urb_sf_start + urb_sf_size;
+ urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE;
+
+ BEGIN_BATCH(2);
+ OUT_BATCH(MI_FLUSH |
+ MI_STATE_INSTRUCTION_CACHE_FLUSH |
+ BRW_MI_GLOBAL_SNAPSHOT_RESET);
+ OUT_BATCH(MI_NOOP);
+ ADVANCE_BATCH();
+
+ /* brw_debug (pScrn, "before base address modify"); */
+ if (IS_IGDNG(pI830))
+ BEGIN_BATCH(14);
+ else
+ BEGIN_BATCH(12);
+ /* Match Mesa driver setup */
+ if (IS_G4X(pI830) || IS_IGDNG(pI830))
+ OUT_BATCH(NEW_PIPELINE_SELECT | PIPELINE_SELECT_3D);
+ else
+ OUT_BATCH(BRW_PIPELINE_SELECT | PIPELINE_SELECT_3D);
+
+ /* Mesa does this. Who knows... */
+ OUT_BATCH(BRW_CS_URB_STATE | 0);
+ OUT_BATCH((0 << 4) | /* URB Entry Allocation Size */
+ (0 << 0)); /* Number of URB Entries */
+
+ /* Zero out the two base address registers so all offsets are
+ * absolute
+ */
+ if (IS_IGDNG(pI830)) {
+ OUT_BATCH(BRW_STATE_BASE_ADDRESS | 6);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Generate state base address */
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Surface state base address */
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* media base addr, don't care */
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Instruction base address */
+ /* general state max addr, disabled */
+ OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
+ /* media object state max addr, disabled */
+ OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
+ /* Instruction max addr, disabled */
+ OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
+ } else {
+ OUT_BATCH(BRW_STATE_BASE_ADDRESS | 4);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Generate state base address */
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* Surface state base address */
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY); /* media base addr, don't care */
+ /* general state max addr, disabled */
+ OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
+ /* media object state max addr, disabled */
+ OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
+ }
+
+ /* Set system instruction pointer */
+ OUT_BATCH(BRW_STATE_SIP | 0);
+ /* system instruction pointer */
+ OUT_RELOC(pI830->video.gen4_sip_kernel_bo,
I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
- OUT_RELOC(pI830->video.gen4_cc_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
-
- /* URB fence */
- OUT_BATCH(BRW_URB_FENCE |
- UF0_CS_REALLOC |
- UF0_SF_REALLOC |
- UF0_CLIP_REALLOC |
- UF0_GS_REALLOC |
- UF0_VS_REALLOC |
- 1);
- OUT_BATCH(((urb_clip_start + urb_clip_size) << UF1_CLIP_FENCE_SHIFT) |
- ((urb_gs_start + urb_gs_size) << UF1_GS_FENCE_SHIFT) |
- ((urb_vs_start + urb_vs_size) << UF1_VS_FENCE_SHIFT));
- OUT_BATCH(((urb_cs_start + urb_cs_size) << UF2_CS_FENCE_SHIFT) |
- ((urb_sf_start + urb_sf_size) << UF2_SF_FENCE_SHIFT));
-
- /* Constant buffer state */
- OUT_BATCH(BRW_CS_URB_STATE | 0);
- OUT_BATCH(((URB_CS_ENTRY_SIZE - 1) << 4) |
- (URB_CS_ENTRIES << 0));
-
- /* Set up our vertex elements, sourced from the single vertex buffer. */
-
- if (IS_IGDNG(pI830)) {
- OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS | 3);
- /* offset 0: X,Y -> {X, Y, 1.0, 1.0} */
- OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
- VE0_VALID |
- (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
- (0 << VE0_OFFSET_SHIFT));
- OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
- (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
- /* offset 8: S0, T0 -> {S0, T0, 1.0, 1.0} */
- OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
- VE0_VALID |
- (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
- (8 << VE0_OFFSET_SHIFT));
- OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
- (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
- } else {
- OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS | 3);
- /* offset 0: X,Y -> {X, Y, 1.0, 1.0} */
- OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
- VE0_VALID |
- (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
- (0 << VE0_OFFSET_SHIFT));
- OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
- (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) |
- (0 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT));
- /* offset 8: S0, T0 -> {S0, T0, 1.0, 1.0} */
- OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
- VE0_VALID |
- (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
- (8 << VE0_OFFSET_SHIFT));
- OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
- (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) |
- (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) |
- (4 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT));
- }
-
- OUT_BATCH(MI_NOOP); /* pad to quadword */
- ADVANCE_BATCH();
+
+ OUT_BATCH(MI_NOOP);
+ ADVANCE_BATCH();
+
+ /* brw_debug (pScrn, "after base address modify"); */
+
+ if (IS_IGDNG(pI830))
+ pipe_ctl = BRW_PIPE_CONTROL_NOWRITE;
+ else
+ pipe_ctl = BRW_PIPE_CONTROL_NOWRITE | BRW_PIPE_CONTROL_IS_FLUSH;
+
+ BEGIN_BATCH(38);
+
+ OUT_BATCH(MI_NOOP);
+
+ /* Pipe control */
+ OUT_BATCH(BRW_PIPE_CONTROL | pipe_ctl | 2);
+ OUT_BATCH(0); /* Destination address */
+ OUT_BATCH(0); /* Immediate data low DW */
+ OUT_BATCH(0); /* Immediate data high DW */
+
+ /* Binding table pointers */
+ OUT_BATCH(BRW_3DSTATE_BINDING_TABLE_POINTERS | 4);
+ OUT_BATCH(0); /* vs */
+ OUT_BATCH(0); /* gs */
+ OUT_BATCH(0); /* clip */
+ OUT_BATCH(0); /* sf */
+ /* Only the PS uses the binding table */
+ OUT_RELOC(bind_bo, I915_GEM_DOMAIN_SAMPLER, 0, 0);
+
+ /* Blend constant color (magenta is fun) */
+ OUT_BATCH(BRW_3DSTATE_CONSTANT_COLOR | 3);
+ OUT_BATCH(float_to_uint(1.0));
+ OUT_BATCH(float_to_uint(0.0));
+ OUT_BATCH(float_to_uint(1.0));
+ OUT_BATCH(float_to_uint(1.0));
+
+ /* The drawing rectangle clipping is always on. Set it to values that
+ * shouldn't do any clipping.
+ */
+ OUT_BATCH(BRW_3DSTATE_DRAWING_RECTANGLE | 2); /* XXX 3 for BLC or CTG */
+ OUT_BATCH(0x00000000); /* ymin, xmin */
+ OUT_BATCH((pScrn->virtualX - 1) | (pScrn->virtualY - 1) << 16); /* ymax, xmax */
+ OUT_BATCH(0x00000000); /* yorigin, xorigin */
+
+ /* skip the depth buffer */
+ /* skip the polygon stipple */
+ /* skip the polygon stipple offset */
+ /* skip the line stipple */
+
+ /* Set the pointers to the 3d pipeline state */
+ OUT_BATCH(BRW_3DSTATE_PIPELINED_POINTERS | 5);
+ OUT_RELOC(pI830->video.gen4_vs_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+ /* disable GS, resulting in passthrough */
+ OUT_BATCH(BRW_GS_DISABLE);
+ /* disable CLIP, resulting in passthrough */
+ OUT_BATCH(BRW_CLIP_DISABLE);
+ OUT_RELOC(pI830->video.gen4_sf_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+ if (n_src_surf == 1)
+ OUT_RELOC(pI830->video.gen4_wm_packed_bo,
+ I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+ else
+ OUT_RELOC(pI830->video.gen4_wm_planar_bo,
+ I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+ OUT_RELOC(pI830->video.gen4_cc_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+
+ /* URB fence */
+ OUT_BATCH(BRW_URB_FENCE |
+ UF0_CS_REALLOC |
+ UF0_SF_REALLOC |
+ UF0_CLIP_REALLOC | UF0_GS_REALLOC | UF0_VS_REALLOC | 1);
+ OUT_BATCH(((urb_clip_start + urb_clip_size) << UF1_CLIP_FENCE_SHIFT) |
+ ((urb_gs_start + urb_gs_size) << UF1_GS_FENCE_SHIFT) |
+ ((urb_vs_start + urb_vs_size) << UF1_VS_FENCE_SHIFT));
+ OUT_BATCH(((urb_cs_start + urb_cs_size) << UF2_CS_FENCE_SHIFT) |
+ ((urb_sf_start + urb_sf_size) << UF2_SF_FENCE_SHIFT));
+
+ /* Constant buffer state */
+ OUT_BATCH(BRW_CS_URB_STATE | 0);
+ OUT_BATCH(((URB_CS_ENTRY_SIZE - 1) << 4) | (URB_CS_ENTRIES << 0));
+
+ /* Set up our vertex elements, sourced from the single vertex buffer. */
+
+ if (IS_IGDNG(pI830)) {
+ OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS | 3);
+ /* offset 0: X,Y -> {X, Y, 1.0, 1.0} */
+ OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
+ VE0_VALID |
+ (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
+ (0 << VE0_OFFSET_SHIFT));
+ OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT)
+ | (BRW_VFCOMPONENT_STORE_SRC <<
+ VE1_VFCOMPONENT_1_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_2_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_3_SHIFT));
+ /* offset 8: S0, T0 -> {S0, T0, 1.0, 1.0} */
+ OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
+ VE0_VALID |
+ (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
+ (8 << VE0_OFFSET_SHIFT));
+ OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT)
+ | (BRW_VFCOMPONENT_STORE_SRC <<
+ VE1_VFCOMPONENT_1_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_2_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_3_SHIFT));
+ } else {
+ OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS | 3);
+ /* offset 0: X,Y -> {X, Y, 1.0, 1.0} */
+ OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
+ VE0_VALID |
+ (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
+ (0 << VE0_OFFSET_SHIFT));
+ OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT)
+ | (BRW_VFCOMPONENT_STORE_SRC <<
+ VE1_VFCOMPONENT_1_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_2_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_3_SHIFT) | (0 <<
+ VE1_DESTINATION_ELEMENT_OFFSET_SHIFT));
+ /* offset 8: S0, T0 -> {S0, T0, 1.0, 1.0} */
+ OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
+ VE0_VALID |
+ (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
+ (8 << VE0_OFFSET_SHIFT));
+ OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT)
+ | (BRW_VFCOMPONENT_STORE_SRC <<
+ VE1_VFCOMPONENT_1_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_2_SHIFT) |
+ (BRW_VFCOMPONENT_STORE_1_FLT <<
+ VE1_VFCOMPONENT_3_SHIFT) | (4 <<
+ VE1_DESTINATION_ELEMENT_OFFSET_SHIFT));
+ }
+
+ OUT_BATCH(MI_NOOP); /* pad to quadword */
+ ADVANCE_BATCH();
}
void
@@ -968,303 +982,306 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
short width, short height, int video_pitch,
int x1, int y1, int x2, int y2,
short src_w, short src_h,
- short drw_w, short drw_h,
- PixmapPtr pPixmap)
+ short drw_w, short drw_h, PixmapPtr pPixmap)
{
- I830Ptr pI830 = I830PTR(pScrn);
- BoxPtr pbox;
- int nbox, dxo, dyo, pix_xoff, pix_yoff;
- float src_scale_x, src_scale_y;
- int src_surf, i;
- int n_src_surf;
- uint32_t src_surf_format;
- uint32_t src_surf_base[6];
- int src_width[6];
- int src_height[6];
- int src_pitch[6];
- drm_intel_bo *bind_bo, *surf_bos[7];
+ I830Ptr pI830 = I830PTR(pScrn);
+ BoxPtr pbox;
+ int nbox, dxo, dyo, pix_xoff, pix_yoff;
+ float src_scale_x, src_scale_y;
+ int src_surf, i;
+ int n_src_surf;
+ uint32_t src_surf_format;
+ uint32_t src_surf_base[6];
+ int src_width[6];
+ int src_height[6];
+ int src_pitch[6];
+ drm_intel_bo *bind_bo, *surf_bos[7];
#if 0
- ErrorF("BroadwaterDisplayVideoTextured: %dx%d (pitch %d)\n", width, height,
- video_pitch);
+ ErrorF("BroadwaterDisplayVideoTextured: %dx%d (pitch %d)\n", width,
+ height, video_pitch);
#endif
#if 0
- /* enable debug */
- OUTREG (INST_PM,
- (1 << (16 + 4)) |
- (1 << 4));
- ErrorF ("INST_PM 0x%08x\n", INREG(INST_PM));
+ /* enable debug */
+ OUTREG(INST_PM, (1 << (16 + 4)) | (1 << 4));
+ ErrorF("INST_PM 0x%08x\n", INREG(INST_PM));
#endif
- src_surf_base[0] = pPriv->YBufOffset;
- src_surf_base[1] = pPriv->YBufOffset;
- src_surf_base[2] = pPriv->VBufOffset;
- src_surf_base[3] = pPriv->VBufOffset;
- src_surf_base[4] = pPriv->UBufOffset;
- src_surf_base[5] = pPriv->UBufOffset;
+ src_surf_base[0] = pPriv->YBufOffset;
+ src_surf_base[1] = pPriv->YBufOffset;
+ src_surf_base[2] = pPriv->VBufOffset;
+ src_surf_base[3] = pPriv->VBufOffset;
+ src_surf_base[4] = pPriv->UBufOffset;
+ src_surf_base[5] = pPriv->UBufOffset;
#if 0
- ErrorF ("base 0 0x%x base 1 0x%x base 2 0x%x\n",
- src_surf_base[0], src_surf_base[1], src_surf_base[2]);
+ ErrorF("base 0 0x%x base 1 0x%x base 2 0x%x\n",
+ src_surf_base[0], src_surf_base[1], src_surf_base[2]);
#endif
-
- if (is_planar_fourcc(id)) {
- src_surf_format = BRW_SURFACEFORMAT_R8_UNORM;
- src_width[1] = src_width[0] = width;
- src_height[1] = src_height[0] = height;
- src_pitch[1] = src_pitch[0] = video_pitch * 2;
- src_width[4] = src_width[5] = src_width[2] = src_width[3] = width / 2;
- src_height[4] = src_height[5] = src_height[2] = src_height[3] = height / 2;
- src_pitch[4] = src_pitch[5] = src_pitch[2] = src_pitch[3] = video_pitch;
- n_src_surf = 6;
- } else {
- if (id == FOURCC_UYVY)
- src_surf_format = BRW_SURFACEFORMAT_YCRCB_SWAPY;
- else
- src_surf_format = BRW_SURFACEFORMAT_YCRCB_NORMAL;
- src_width[0] = width;
- src_height[0] = height;
- src_pitch[0] = video_pitch;
- n_src_surf = 1;
- }
+ if (is_planar_fourcc(id)) {
+ src_surf_format = BRW_SURFACEFORMAT_R8_UNORM;
+ src_width[1] = src_width[0] = width;
+ src_height[1] = src_height[0] = height;
+ src_pitch[1] = src_pitch[0] = video_pitch * 2;
+ src_width[4] = src_width[5] = src_width[2] = src_width[3] =
+ width / 2;
+ src_height[4] = src_height[5] = src_height[2] = src_height[3] =
+ height / 2;
+ src_pitch[4] = src_pitch[5] = src_pitch[2] = src_pitch[3] =
+ video_pitch;
+ n_src_surf = 6;
+ } else {
+ if (id == FOURCC_UYVY)
+ src_surf_format = BRW_SURFACEFORMAT_YCRCB_SWAPY;
+ else
+ src_surf_format = BRW_SURFACEFORMAT_YCRCB_NORMAL;
+
+ src_width[0] = width;
+ src_height[0] = height;
+ src_pitch[0] = video_pitch;
+ n_src_surf = 1;
+ }
#if 0
- ErrorF("dst surf: 0x%08x\n", state_base_offset + dest_surf_offset);
- ErrorF("src surf: 0x%08x\n", state_base_offset + src_surf_offset);
+ ErrorF("dst surf: 0x%08x\n", state_base_offset + dest_surf_offset);
+ ErrorF("src surf: 0x%08x\n", state_base_offset + src_surf_offset);
#endif
- /* We'll be poking the state buffers that could be in use by the 3d
- * hardware here, but we should have synced the 3D engine already in
- * I830PutImage.
- */
-
- /* Upload kernels */
- surf_bos[0] = i965_create_dst_surface_state(pScrn, pPixmap);
- if (!surf_bos[0])
- return;
-
- for (src_surf = 0; src_surf < n_src_surf; src_surf++) {
- drm_intel_bo *surf_bo =
- i965_create_src_surface_state(pScrn,
- pPriv->buf,
- src_surf_base[src_surf],
- src_width[src_surf],
- src_height[src_surf],
- src_pitch[src_surf],
- src_surf_format);
- if (!surf_bo) {
- int q;
- for(q = 0; q < src_surf + 1; q++)
- drm_intel_bo_unreference(surf_bos[q]);
- return;
+ /* We'll be poking the state buffers that could be in use by the 3d
+ * hardware here, but we should have synced the 3D engine already in
+ * I830PutImage.
+ */
+
+ /* Upload kernels */
+ surf_bos[0] = i965_create_dst_surface_state(pScrn, pPixmap);
+ if (!surf_bos[0])
+ return;
+
+ for (src_surf = 0; src_surf < n_src_surf; src_surf++) {
+ drm_intel_bo *surf_bo = i965_create_src_surface_state(pScrn,
+ pPriv->
+ buf,
+ src_surf_base
+ [src_surf],
+ src_width
+ [src_surf],
+ src_height
+ [src_surf],
+ src_pitch
+ [src_surf],
+ src_surf_format);
+ if (!surf_bo) {
+ int q;
+ for (q = 0; q < src_surf + 1; q++)
+ drm_intel_bo_unreference(surf_bos[q]);
+ return;
+ }
+ surf_bos[src_surf + 1] = surf_bo;
+ }
+ bind_bo = i965_create_binding_table(pScrn, surf_bos, n_src_surf + 1);
+ for (i = 0; i < n_src_surf + 1; i++) {
+ drm_intel_bo_unreference(surf_bos[i]);
+ surf_bos[i] = NULL;
}
- surf_bos[src_surf + 1] = surf_bo;
- }
- bind_bo = i965_create_binding_table(pScrn, surf_bos, n_src_surf + 1);
- for (i = 0; i < n_src_surf + 1; i++) {
- drm_intel_bo_unreference(surf_bos[i]);
- surf_bos[i] = NULL;
- }
- if (!bind_bo)
- return;
-
- if (pI830->video.gen4_sampler_bo == NULL)
- pI830->video.gen4_sampler_bo = i965_create_sampler_state(pScrn);
- if (pI830->video.gen4_sip_kernel_bo == NULL) {
- pI830->video.gen4_sip_kernel_bo =
- i965_create_program(pScrn, &sip_kernel_static[0][0],
- sizeof(sip_kernel_static));
- if (!pI830->video.gen4_sip_kernel_bo) {
- drm_intel_bo_unreference(bind_bo);
- return;
+ if (!bind_bo)
+ return;
+
+ if (pI830->video.gen4_sampler_bo == NULL)
+ pI830->video.gen4_sampler_bo = i965_create_sampler_state(pScrn);
+ if (pI830->video.gen4_sip_kernel_bo == NULL) {
+ pI830->video.gen4_sip_kernel_bo =
+ i965_create_program(pScrn, &sip_kernel_static[0][0],
+ sizeof(sip_kernel_static));
+ if (!pI830->video.gen4_sip_kernel_bo) {
+ drm_intel_bo_unreference(bind_bo);
+ return;
+ }
}
- }
- if (pI830->video.gen4_vs_bo == NULL) {
- pI830->video.gen4_vs_bo = i965_create_vs_state(pScrn);
- if (!pI830->video.gen4_vs_bo) {
- drm_intel_bo_unreference(bind_bo);
- return;
+ if (pI830->video.gen4_vs_bo == NULL) {
+ pI830->video.gen4_vs_bo = i965_create_vs_state(pScrn);
+ if (!pI830->video.gen4_vs_bo) {
+ drm_intel_bo_unreference(bind_bo);
+ return;
+ }
}
- }
- if (pI830->video.gen4_sf_bo == NULL) {
- pI830->video.gen4_sf_bo = i965_create_sf_state(pScrn);
- if (!pI830->video.gen4_sf_bo) {
- drm_intel_bo_unreference(bind_bo);
- return;
+ if (pI830->video.gen4_sf_bo == NULL) {
+ pI830->video.gen4_sf_bo = i965_create_sf_state(pScrn);
+ if (!pI830->video.gen4_sf_bo) {
+ drm_intel_bo_unreference(bind_bo);
+ return;
+ }
}
- }
- if (pI830->video.gen4_wm_packed_bo == NULL) {
- pI830->video.gen4_wm_packed_bo =
- i965_create_wm_state(pScrn, pI830->video.gen4_sampler_bo, TRUE);
- if (!pI830->video.gen4_wm_packed_bo) {
- drm_intel_bo_unreference(bind_bo);
- return;
+ if (pI830->video.gen4_wm_packed_bo == NULL) {
+ pI830->video.gen4_wm_packed_bo =
+ i965_create_wm_state(pScrn, pI830->video.gen4_sampler_bo,
+ TRUE);
+ if (!pI830->video.gen4_wm_packed_bo) {
+ drm_intel_bo_unreference(bind_bo);
+ return;
+ }
}
- }
-
- if (pI830->video.gen4_wm_planar_bo == NULL) {
- pI830->video.gen4_wm_planar_bo =
- i965_create_wm_state(pScrn, pI830->video.gen4_sampler_bo, FALSE);
- if (!pI830->video.gen4_wm_planar_bo) {
- drm_intel_bo_unreference(bind_bo);
- return;
+
+ if (pI830->video.gen4_wm_planar_bo == NULL) {
+ pI830->video.gen4_wm_planar_bo =
+ i965_create_wm_state(pScrn, pI830->video.gen4_sampler_bo,
+ FALSE);
+ if (!pI830->video.gen4_wm_planar_bo) {
+ drm_intel_bo_unreference(bind_bo);
+ return;
+ }
}
- }
- if (pI830->video.gen4_cc_bo == NULL) {
- pI830->video.gen4_cc_bo = i965_create_cc_state(pScrn);
- if (!pI830->video.gen4_cc_bo) {
- drm_intel_bo_unreference(bind_bo);
- return;
+ if (pI830->video.gen4_cc_bo == NULL) {
+ pI830->video.gen4_cc_bo = i965_create_cc_state(pScrn);
+ if (!pI830->video.gen4_cc_bo) {
+ drm_intel_bo_unreference(bind_bo);
+ return;
+ }
}
- }
- /* Set up the offset for translating from the given region (in screen
- * coordinates) to the backing pixmap.
- */
+ /* Set up the offset for translating from the given region (in screen
+ * coordinates) to the backing pixmap.
+ */
#ifdef COMPOSITE
- pix_xoff = -pPixmap->screen_x + pPixmap->drawable.x;
- pix_yoff = -pPixmap->screen_y + pPixmap->drawable.y;
+ pix_xoff = -pPixmap->screen_x + pPixmap->drawable.x;
+ pix_yoff = -pPixmap->screen_y + pPixmap->drawable.y;
#else
- pix_xoff = 0;
- pix_yoff = 0;
+ pix_xoff = 0;
+ pix_yoff = 0;
#endif
- dxo = dstRegion->extents.x1;
- dyo = dstRegion->extents.y1;
-
- /* Use normalized texture coordinates */
- src_scale_x = ((float)src_w / width) / (float)drw_w;
- src_scale_y = ((float)src_h / height) / (float)drw_h;
+ dxo = dstRegion->extents.x1;
+ dyo = dstRegion->extents.y1;
+
+ /* Use normalized texture coordinates */
+ src_scale_x = ((float)src_w / width) / (float)drw_w;
+ src_scale_y = ((float)src_h / height) / (float)drw_h;
+
+ pbox = REGION_RECTS(dstRegion);
+ nbox = REGION_NUM_RECTS(dstRegion);
+ while (nbox--) {
+ int box_x1 = pbox->x1;
+ int box_y1 = pbox->y1;
+ int box_x2 = pbox->x2;
+ int box_y2 = pbox->y2;
+ int i;
+ drm_intel_bo *vb_bo;
+ float *vb;
+ drm_intel_bo *bo_table[] = {
+ NULL, /* vb_bo */
+ pI830->batch_bo,
+ bind_bo,
+ pI830->video.gen4_sampler_bo,
+ pI830->video.gen4_sip_kernel_bo,
+ pI830->video.gen4_vs_bo,
+ pI830->video.gen4_sf_bo,
+ pI830->video.gen4_wm_packed_bo,
+ pI830->video.gen4_wm_planar_bo,
+ pI830->video.gen4_cc_bo,
+ };
+
+ pbox++;
+
+ if (intel_alloc_and_map(pI830, "textured video vb", 4096,
+ &vb_bo, &vb) != 0)
+ break;
+ bo_table[0] = vb_bo;
+
+ i = 0;
+ vb[i++] = (box_x2 - dxo) * src_scale_x;
+ vb[i++] = (box_y2 - dyo) * src_scale_y;
+ vb[i++] = (float)box_x2 + pix_xoff;
+ vb[i++] = (float)box_y2 + pix_yoff;
+
+ vb[i++] = (box_x1 - dxo) * src_scale_x;
+ vb[i++] = (box_y2 - dyo) * src_scale_y;
+ vb[i++] = (float)box_x1 + pix_xoff;
+ vb[i++] = (float)box_y2 + pix_yoff;
+
+ vb[i++] = (box_x1 - dxo) * src_scale_x;
+ vb[i++] = (box_y1 - dyo) * src_scale_y;
+ vb[i++] = (float)box_x1 + pix_xoff;
+ vb[i++] = (float)box_y1 + pix_yoff;
+
+ drm_intel_bo_unmap(vb_bo);
+
+ if (!IS_IGDNG(pI830))
+ i965_pre_draw_debug(pScrn);
+
+ /* If this command won't fit in the current batch, flush.
+ * Assume that it does after being flushed.
+ */
+ if (drm_intel_bufmgr_check_aperture_space(bo_table,
+ ARRAY_SIZE(bo_table))
+ < 0) {
+ intel_batch_flush(pScrn, FALSE);
+ }
+
+ intel_batch_start_atomic(pScrn, 100);
+
+ i965_emit_video_setup(pScrn, bind_bo, n_src_surf);
+
+ BEGIN_BATCH(12);
+ /* Set up the pointer to our vertex buffer */
+ OUT_BATCH(BRW_3DSTATE_VERTEX_BUFFERS | 3);
+ /* four 32-bit floats per vertex */
+ OUT_BATCH((0 << VB0_BUFFER_INDEX_SHIFT) |
+ VB0_VERTEXDATA | ((4 * 4) << VB0_BUFFER_PITCH_SHIFT));
+ OUT_RELOC(vb_bo, I915_GEM_DOMAIN_VERTEX, 0, 0);
+ if (IS_IGDNG(pI830))
+ OUT_RELOC(vb_bo, I915_GEM_DOMAIN_VERTEX, 0,
+ (vb_bo->offset + i) * 4);
+ else
+ OUT_BATCH(3); /* four corners to our rectangle */
+ OUT_BATCH(0); /* reserved */
+
+ OUT_BATCH(BRW_3DPRIMITIVE | BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL | (_3DPRIM_RECTLIST << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) | (0 << 9) | /* CTG - indirect vertex count */
+ 4);
+ OUT_BATCH(3); /* vertex count per instance */
+ OUT_BATCH(0); /* start vertex offset */
+ OUT_BATCH(1); /* single instance */
+ OUT_BATCH(0); /* start instance location */
+ OUT_BATCH(0); /* index buffer offset, ignored */
+ OUT_BATCH(MI_NOOP);
+ ADVANCE_BATCH();
+
+ intel_batch_end_atomic(pScrn);
+
+ drm_intel_bo_unreference(vb_bo);
+
+ if (!IS_IGDNG(pI830))
+ i965_post_draw_debug(pScrn);
- pbox = REGION_RECTS(dstRegion);
- nbox = REGION_NUM_RECTS(dstRegion);
- while (nbox--) {
- int box_x1 = pbox->x1;
- int box_y1 = pbox->y1;
- int box_x2 = pbox->x2;
- int box_y2 = pbox->y2;
- int i;
- drm_intel_bo *vb_bo;
- float *vb;
- drm_intel_bo *bo_table[] = {
- NULL, /* vb_bo */
- pI830->batch_bo,
- bind_bo,
- pI830->video.gen4_sampler_bo,
- pI830->video.gen4_sip_kernel_bo,
- pI830->video.gen4_vs_bo,
- pI830->video.gen4_sf_bo,
- pI830->video.gen4_wm_packed_bo,
- pI830->video.gen4_wm_planar_bo,
- pI830->video.gen4_cc_bo,
- };
-
- pbox++;
-
- if (intel_alloc_and_map(pI830, "textured video vb", 4096,
- &vb_bo, &vb) != 0)
- break;
- bo_table[0] = vb_bo;
-
- i = 0;
- vb[i++] = (box_x2 - dxo) * src_scale_x;
- vb[i++] = (box_y2 - dyo) * src_scale_y;
- vb[i++] = (float) box_x2 + pix_xoff;
- vb[i++] = (float) box_y2 + pix_yoff;
-
- vb[i++] = (box_x1 - dxo) * src_scale_x;
- vb[i++] = (box_y2 - dyo) * src_scale_y;
- vb[i++] = (float) box_x1 + pix_xoff;
- vb[i++] = (float) box_y2 + pix_yoff;
-
- vb[i++] = (box_x1 - dxo) * src_scale_x;
- vb[i++] = (box_y1 - dyo) * src_scale_y;
- vb[i++] = (float) box_x1 + pix_xoff;
- vb[i++] = (float) box_y1 + pix_yoff;
-
- drm_intel_bo_unmap(vb_bo);
-
- if (!IS_IGDNG(pI830))
- i965_pre_draw_debug(pScrn);
-
- /* If this command won't fit in the current batch, flush.
- * Assume that it does after being flushed.
- */
- if (drm_intel_bufmgr_check_aperture_space(bo_table,
- ARRAY_SIZE(bo_table)) < 0) {
- intel_batch_flush(pScrn, FALSE);
}
- intel_batch_start_atomic(pScrn, 100);
-
- i965_emit_video_setup(pScrn, bind_bo, n_src_surf);
-
- BEGIN_BATCH(12);
- /* Set up the pointer to our vertex buffer */
- OUT_BATCH(BRW_3DSTATE_VERTEX_BUFFERS | 3);
- /* four 32-bit floats per vertex */
- OUT_BATCH((0 << VB0_BUFFER_INDEX_SHIFT) |
- VB0_VERTEXDATA |
- ((4 * 4) << VB0_BUFFER_PITCH_SHIFT));
- OUT_RELOC(vb_bo, I915_GEM_DOMAIN_VERTEX, 0, 0);
- if (IS_IGDNG(pI830))
- OUT_RELOC(vb_bo, I915_GEM_DOMAIN_VERTEX, 0, (vb_bo->offset + i) * 4);
- else
- OUT_BATCH(3); /* four corners to our rectangle */
- OUT_BATCH(0); /* reserved */
-
- OUT_BATCH(BRW_3DPRIMITIVE |
- BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL |
- (_3DPRIM_RECTLIST << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) |
- (0 << 9) | /* CTG - indirect vertex count */
- 4);
- OUT_BATCH(3); /* vertex count per instance */
- OUT_BATCH(0); /* start vertex offset */
- OUT_BATCH(1); /* single instance */
- OUT_BATCH(0); /* start instance location */
- OUT_BATCH(0); /* index buffer offset, ignored */
- OUT_BATCH(MI_NOOP);
- ADVANCE_BATCH();
-
- intel_batch_end_atomic(pScrn);
-
- drm_intel_bo_unreference(vb_bo);
-
- if (!IS_IGDNG(pI830))
- i965_post_draw_debug(pScrn);
-
- }
-
- /* release reference once we're finished */
- drm_intel_bo_unreference(bind_bo);
+ /* release reference once we're finished */
+ drm_intel_bo_unreference(bind_bo);
#if WATCH_STATS
- /* i830_dump_error_state(pScrn); */
+ /* i830_dump_error_state(pScrn); */
#endif
}
-void
-i965_free_video(ScrnInfoPtr scrn)
+void i965_free_video(ScrnInfoPtr scrn)
{
- I830Ptr pI830 = I830PTR(scrn);
-
- drm_intel_bo_unreference(pI830->video.gen4_vs_bo);
- pI830->video.gen4_vs_bo = NULL;
- drm_intel_bo_unreference(pI830->video.gen4_sf_bo);
- pI830->video.gen4_sf_bo = NULL;
- drm_intel_bo_unreference(pI830->video.gen4_cc_bo);
- pI830->video.gen4_cc_bo = NULL;
- drm_intel_bo_unreference(pI830->video.gen4_wm_packed_bo);
- pI830->video.gen4_wm_packed_bo = NULL;
- drm_intel_bo_unreference(pI830->video.gen4_wm_planar_bo);
- pI830->video.gen4_wm_planar_bo = NULL;
- drm_intel_bo_unreference(pI830->video.gen4_cc_vp_bo);
- pI830->video.gen4_cc_vp_bo = NULL;
- drm_intel_bo_unreference(pI830->video.gen4_sampler_bo);
- pI830->video.gen4_sampler_bo = NULL;
- drm_intel_bo_unreference(pI830->video.gen4_sip_kernel_bo);
- pI830->video.gen4_sip_kernel_bo = NULL;
+ I830Ptr pI830 = I830PTR(scrn);
+
+ drm_intel_bo_unreference(pI830->video.gen4_vs_bo);
+ pI830->video.gen4_vs_bo = NULL;
+ drm_intel_bo_unreference(pI830->video.gen4_sf_bo);
+ pI830->video.gen4_sf_bo = NULL;
+ drm_intel_bo_unreference(pI830->video.gen4_cc_bo);
+ pI830->video.gen4_cc_bo = NULL;
+ drm_intel_bo_unreference(pI830->video.gen4_wm_packed_bo);
+ pI830->video.gen4_wm_packed_bo = NULL;
+ drm_intel_bo_unreference(pI830->video.gen4_wm_planar_bo);
+ pI830->video.gen4_wm_planar_bo = NULL;
+ drm_intel_bo_unreference(pI830->video.gen4_cc_vp_bo);
+ pI830->video.gen4_cc_vp_bo = NULL;
+ drm_intel_bo_unreference(pI830->video.gen4_sampler_bo);
+ pI830->video.gen4_sampler_bo = NULL;
+ drm_intel_bo_unreference(pI830->video.gen4_sip_kernel_bo);
+ pI830->video.gen4_sip_kernel_bo = NULL;
}
diff --git a/src/reg_dumper/audio.c b/src/reg_dumper/audio.c
index b6e5373c..91f7b141 100644
--- a/src/reg_dumper/audio.c
+++ b/src/reg_dumper/audio.c
@@ -38,7 +38,6 @@
#include <fcntl.h>
#include <getopt.h>
-
#include "reg_dumper.h"
#include "../i810_reg.h"
@@ -173,282 +172,289 @@ static char *video_dip_trans[] = {
static void do_self_tests(void)
{
- if (BIT(1, 0) != 1)
- exit(1);
- if (BIT(0x80000000, 31) != 1)
- exit(2);
- if (BITS(0xc0000000, 31, 30) != 3)
- exit(3);
+ if (BIT(1, 0) != 1)
+ exit(1);
+ if (BIT(0x80000000, 31) != 1)
+ exit(2);
+ if (BITS(0xc0000000, 31, 30) != 3)
+ exit(3);
}
int main(int argc, char **argv)
{
- I830Rec i830;
- I830Ptr pI830 = &i830;
- uint32_t dword;
- int i;
-
- do_self_tests();
- intel_i830rec_init(pI830);
-
- /* printf("%-18s %8s %s\n\n", "register name", "raw value", "description"); */
-
-#if 0 /* enable HDMI audio bits */
- dump_reg(SDVOB, "Digital Display Port B Control Register");
- dword |= SDVO_ENABLE;
- dword |= SDVO_BORDER_ENABLE;
- dword |= SDVO_AUDIO_ENABLE;
- dword |= SDVO_NULL_PACKETS_DURING_VSYNC;
- OUTREG(SDVOB, dword);
-
- dump_reg(PORT_HOTPLUG_EN, "Hot Plug Detect Enable");
- OUTREG(PORT_HOTPLUG_EN, dword | AUDIO_HOTPLUG_EN);
-
- dump_reg(VIDEO_DIP_CTL, "Video DIP Control");
- dword &= ~( VIDEO_DIP_ENABLE_AVI |
- VIDEO_DIP_ENABLE_VENDOR |
- VIDEO_DIP_ENABLE_SPD);
- OUTREG(VIDEO_DIP_CTL, dword);
- dword |= VIDEO_DIP_ENABLE;
- OUTREG(VIDEO_DIP_CTL, dword);
+ I830Rec i830;
+ I830Ptr pI830 = &i830;
+ uint32_t dword;
+ int i;
+
+ do_self_tests();
+ intel_i830rec_init(pI830);
+
+ /* printf("%-18s %8s %s\n\n", "register name", "raw value", "description"); */
+
+#if 0 /* enable HDMI audio bits */
+ dump_reg(SDVOB, "Digital Display Port B Control Register");
+ dword |= SDVO_ENABLE;
+ dword |= SDVO_BORDER_ENABLE;
+ dword |= SDVO_AUDIO_ENABLE;
+ dword |= SDVO_NULL_PACKETS_DURING_VSYNC;
+ OUTREG(SDVOB, dword);
+
+ dump_reg(PORT_HOTPLUG_EN, "Hot Plug Detect Enable");
+ OUTREG(PORT_HOTPLUG_EN, dword | AUDIO_HOTPLUG_EN);
+
+ dump_reg(VIDEO_DIP_CTL, "Video DIP Control");
+ dword &= ~(VIDEO_DIP_ENABLE_AVI |
+ VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
+ OUTREG(VIDEO_DIP_CTL, dword);
+ dword |= VIDEO_DIP_ENABLE;
+ OUTREG(VIDEO_DIP_CTL, dword);
#endif
-#if 0 /* disable HDMI audio bits */
- dump_reg(SDVOB, "Digital Display Port B Control Register");
- dword &= ~SDVO_AUDIO_ENABLE;
- dword &= ~SDVO_NULL_PACKETS_DURING_VSYNC;
- OUTREG(SDVOB, dword);
+#if 0 /* disable HDMI audio bits */
+ dump_reg(SDVOB, "Digital Display Port B Control Register");
+ dword &= ~SDVO_AUDIO_ENABLE;
+ dword &= ~SDVO_NULL_PACKETS_DURING_VSYNC;
+ OUTREG(SDVOB, dword);
#endif
- dump_reg(VIDEO_DIP_CTL, "Video DIP Control");
- dump_reg(SDVOB, "Digital Display Port B Control Register");
- dump_reg(SDVOC, "Digital Display Port C Control Register");
- dump_reg(PORT_HOTPLUG_EN, "Hot Plug Detect Enable");
-
- dump_reg(AUD_CONFIG, "Audio Configuration");
- dump_reg(AUD_DEBUG, "Audio Debug");
- dump_reg(AUD_VID_DID, "Audio Vendor ID / Device ID");
- dump_reg(AUD_RID, "Audio Revision ID");
- dump_reg(AUD_SUBN_CNT, "Audio Subordinate Node Count");
- dump_reg(AUD_FUNC_GRP, "Audio Function Group Type");
- dump_reg(AUD_SUBN_CNT2, "Audio Subordinate Node Count");
- dump_reg(AUD_GRP_CAP, "Audio Function Group Capabilities");
- dump_reg(AUD_PWRST, "Audio Power State");
- dump_reg(AUD_SUPPWR, "Audio Supported Power States");
- dump_reg(AUD_SID, "Audio Root Node Subsystem ID");
- dump_reg(AUD_OUT_CWCAP, "Audio Output Converter Widget Capabilities");
- dump_reg(AUD_OUT_PCMSIZE, "Audio PCM Size and Rates");
- dump_reg(AUD_OUT_STR, "Audio Stream Formats");
- dump_reg(AUD_OUT_DIG_CNVT, "Audio Digital Converter");
- dump_reg(AUD_OUT_CH_STR, "Audio Channel ID and Stream ID");
- dump_reg(AUD_OUT_STR_DESC, "Audio Stream Descriptor Format");
- dump_reg(AUD_PINW_CAP, "Audio Pin Complex Widget Capabilities");
- dump_reg(AUD_PIN_CAP, "Audio Pin Capabilities");
- dump_reg(AUD_PINW_CONNLNG, "Audio Connection List Length");
- dump_reg(AUD_PINW_CONNLST, "Audio Connection List Entry");
- dump_reg(AUD_PINW_CNTR, "Audio Pin Widget Control");
- dump_reg(AUD_PINW_UNSOLRESP,"Audio Unsolicited Response Enable");
- dump_reg(AUD_CNTL_ST, "Audio Control State Register");
- dump_reg(AUD_PINW_CONFIG, "Audio Configuration Default");
- dump_reg(AUD_HDMIW_STATUS, "Audio HDMI Status");
- dump_reg(AUD_HDMIW_HDMIEDID,"Audio HDMI Data EDID Block");
- dump_reg(AUD_HDMIW_INFOFR, "Audio HDMI Widget Data Island Packet");
- dump_reg(AUD_CONV_CHCNT, "Audio Converter Channel Count");
- dump_reg(AUD_CTS_ENABLE, "Audio CTS Programming Enable");
-
- printf("\nDetails:\n\n");
-
- dword = INREG(AUD_VID_DID);
- printf("AUD_VID_DID vendor id\t\t\t0x%x\n", dword >> 16);
- printf("AUD_VID_DID device id\t\t\t0x%x\n", dword & 0xffff);
-
- dword = INREG(AUD_RID);
- printf("AUD_RID major revision\t\t\t0x%lx\n", BITS(dword, 23, 20));
- printf("AUD_RID minor revision\t\t\t0x%lx\n", BITS(dword, 19, 16));
- printf("AUD_RID revision id\t\t\t0x%lx\n", BITS(dword, 15, 8));
- printf("AUD_RID stepping id\t\t\t0x%lx\n", BITS(dword, 7, 0));
-
- dword = INREG(SDVOB);
- printf("SDVOB enable\t\t\t\t%u\n", !!(dword & SDVO_ENABLE));
- printf("SDVOB HDMI encoding\t\t\t%u\n", !!(dword & SDVO_ENCODING_HDMI));
- printf("SDVOB SDVO encoding\t\t\t%u\n", !!(dword & SDVO_ENCODING_SDVO));
- printf("SDVOB null packets\t\t\t%u\n", !!(dword & SDVO_NULL_PACKETS_DURING_VSYNC));
- printf("SDVOB audio enabled\t\t\t%u\n", !!(dword & SDVO_AUDIO_ENABLE));
-
- dword = INREG(SDVOC);
- printf("SDVOC enable\t\t\t\t%u\n", !!(dword & SDVO_ENABLE));
- printf("SDVOC HDMI encoding\t\t\t%u\n", !!(dword & SDVO_ENCODING_HDMI));
- printf("SDVOC SDVO encoding\t\t\t%u\n", !!(dword & SDVO_ENCODING_SDVO));
- printf("SDVOC null packets\t\t\t%u\n", !!(dword & SDVO_NULL_PACKETS_DURING_VSYNC));
- printf("SDVOC audio enabled\t\t\t%u\n", !!(dword & SDVO_AUDIO_ENABLE));
-
- dword = INREG(PORT_HOTPLUG_EN);
- printf("PORT_HOTPLUG_EN DisplayPort/HDMI port B\t%ld\n", BIT(dword, 29)),
- printf("PORT_HOTPLUG_EN DisplayPort/HDMI port C\t%ld\n", BIT(dword, 28)),
- printf("PORT_HOTPLUG_EN DisplayPort port D\t%ld\n", BIT(dword, 27)),
- printf("PORT_HOTPLUG_EN SDVOB\t\t\t%ld\n", BIT(dword, 26)),
- printf("PORT_HOTPLUG_EN SDVOC\t\t\t%ld\n", BIT(dword, 25)),
- printf("PORT_HOTPLUG_EN audio\t\t\t%ld\n", BIT(dword, 24)),
- printf("PORT_HOTPLUG_EN TV\t\t\t%ld\n", BIT(dword, 23)),
- printf("PORT_HOTPLUG_EN CRT\t\t\t%ld\n", BIT(dword, 9)),
-
- dword = INREG(VIDEO_DIP_CTL);
- printf("VIDEO_DIP_CTL enable graphics DIP\t%ld\n", BIT(dword, 31)),
- printf("VIDEO_DIP_CTL port select\t\t[0x%lx] %s\n",
- BITS(dword, 30, 29), dip_port[BITS(dword, 30, 29)]);
- printf("VIDEO_DIP_CTL DIP buffer trans active\t%lu\n", BIT(dword, 28));
- printf("VIDEO_DIP_CTL AVI DIP enabled\t\t%lu\n", BIT(dword, 21));
- printf("VIDEO_DIP_CTL vendor DIP enabled\t%lu\n", BIT(dword, 22));
- printf("VIDEO_DIP_CTL SPD DIP enabled\t\t%lu\n", BIT(dword, 24));
- printf("VIDEO_DIP_CTL DIP buffer index\t\t[0x%lx] %s\n",
- BITS(dword, 20, 19), video_dip_index[BITS(dword, 20, 19)]);
- printf("VIDEO_DIP_CTL DIP trans freq\t\t[0x%lx] %s\n",
- BITS(dword, 17, 16), video_dip_trans[BITS(dword, 17, 16)]);
- printf("VIDEO_DIP_CTL DIP buffer size\t\t%lu\n", BITS(dword, 11, 8));
- printf("VIDEO_DIP_CTL DIP address\t\t%lu\n", BITS(dword, 3, 0));
-
- dword = INREG(AUD_CONFIG);
- printf("AUD_CONFIG pixel clock\t\t\t[0x%lx] %s\n", BITS(dword, 19, 16),
- OPNAME(pixel_clock, BITS(dword, 19, 16)));
- printf("AUD_CONFIG fabrication enabled\t\t%lu\n", BITS(dword, 2, 2));
- printf("AUD_CONFIG professional use allowed\t%lu\n", BIT(dword, 1));
- printf("AUD_CONFIG fuse enabled\t\t\t%lu\n", BIT(dword, 0));
-
- dword = INREG(AUD_DEBUG);
- printf("AUD_DEBUG function reset\t\t%lu\n", BIT(dword, 0));
-
- dword = INREG(AUD_SUBN_CNT);
- printf("AUD_SUBN_CNT starting node number\t0x%lx\n", BITS(dword, 23, 16));
- printf("AUD_SUBN_CNT total number of nodes\t0x%lx\n", BITS(dword, 7, 0));
-
- dword = INREG(AUD_SUBN_CNT2);
- printf("AUD_SUBN_CNT2 starting node number\t0x%lx\n", BITS(dword, 24, 16));
- printf("AUD_SUBN_CNT2 total number of nodes\t0x%lx\n", BITS(dword, 7, 0));
-
- dword = INREG(AUD_FUNC_GRP);
- printf("AUD_FUNC_GRP unsol capable\t\t%lu\n", BIT(dword, 8));
- printf("AUD_FUNC_GRP node type\t\t\t0x%lx\n", BITS(dword, 7, 0));
-
- dword = INREG(AUD_GRP_CAP);
- printf("AUD_GRP_CAP beep 0\t\t\t%lu\n", BIT(dword, 16));
- printf("AUD_GRP_CAP input delay\t\t\t%lu\n", BITS(dword, 11, 8));
- printf("AUD_GRP_CAP output delay\t\t%lu\n", BITS(dword, 3, 0));
-
- dword = INREG(AUD_PWRST);
- printf("AUD_PWRST device power state\t\t%s\n",
- power_state[BITS(dword, 5, 4)]);
- printf("AUD_PWRST device power state setting\t%s\n",
- power_state[BITS(dword, 1, 0)]);
-
- dword = INREG(AUD_SUPPWR);
- printf("AUD_SUPPWR support D0\t\t\t%lu\n", BIT(dword, 0));
- printf("AUD_SUPPWR support D1\t\t\t%lu\n", BIT(dword, 1));
- printf("AUD_SUPPWR support D2\t\t\t%lu\n", BIT(dword, 2));
- printf("AUD_SUPPWR support D3\t\t\t%lu\n", BIT(dword, 3));
-
- dword = INREG(AUD_OUT_CWCAP);
- printf("AUD_OUT_CWCAP widget type\t\t0x%lx\n", BITS(dword, 23, 20));
- printf("AUD_OUT_CWCAP sample delay\t\t0x%lx\n", BITS(dword, 19, 16));
- printf("AUD_OUT_CWCAP channel count\t\t%lu\n",
- BITS(dword, 15, 13) * 2 + BIT(dword, 0) + 1);
- printf("AUD_OUT_CWCAP L-R swap\t\t\t%lu\n", BIT(dword, 11));
- printf("AUD_OUT_CWCAP power control\t\t%lu\n", BIT(dword, 10));
- printf("AUD_OUT_CWCAP digital\t\t\t%lu\n", BIT(dword, 9));
- printf("AUD_OUT_CWCAP conn list\t\t\t%lu\n", BIT(dword, 8));
- printf("AUD_OUT_CWCAP unsol\t\t\t%lu\n", BIT(dword, 7));
- printf("AUD_OUT_CWCAP mute\t\t\t%lu\n", BIT(dword, 5));
- printf("AUD_OUT_CWCAP format override\t\t%lu\n", BIT(dword, 4));
- printf("AUD_OUT_CWCAP amp param override\t%lu\n", BIT(dword, 3));
- printf("AUD_OUT_CWCAP out amp present\t\t%lu\n", BIT(dword, 2));
- printf("AUD_OUT_CWCAP in amp present\t\t%lu\n", BIT(dword, 1));
-
- dword = INREG(AUD_OUT_DIG_CNVT);
- printf("AUD_OUT_DIG_CNVT SPDIF category\t\t0x%lx\n", BITS(dword, 14, 8));
- printf("AUD_OUT_DIG_CNVT SPDIF level\t\t%lu\n", BIT(dword, 7));
- printf("AUD_OUT_DIG_CNVT professional\t\t%lu\n", BIT(dword, 6));
- printf("AUD_OUT_DIG_CNVT non PCM\t\t%lu\n", BIT(dword, 5));
- printf("AUD_OUT_DIG_CNVT copyright asserted\t%lu\n", BIT(dword, 4));
- printf("AUD_OUT_DIG_CNVT filter preemphasis\t%lu\n", BIT(dword, 3));
- printf("AUD_OUT_DIG_CNVT validity config\t%lu\n", BIT(dword, 2));
- printf("AUD_OUT_DIG_CNVT validity flag\t\t%lu\n", BIT(dword, 1));
- printf("AUD_OUT_DIG_CNVT digital enable\t\t%lu\n", BIT(dword, 0));
-
- dword = INREG(AUD_OUT_CH_STR);
- printf("AUD_OUT_CH_STR stream id\t\t0x%lx\n", BITS(dword, 7, 4));
- printf("AUD_OUT_CH_STR lowest channel\t\t0x%lx\n", BITS(dword, 3, 0));
-
- dword = INREG(AUD_OUT_STR_DESC);
- printf("AUD_OUT_STR_DESC stream channels\t0x%lx\n", BITS(dword, 3, 0));
-
- dword = INREG(AUD_PINW_CAP);
- printf("AUD_PINW_CAP widget type\t\t0x%lx\n", BITS(dword, 23, 20));
- printf("AUD_PINW_CAP sample delay\t\t0x%lx\n", BITS(dword, 19, 16));
- printf("AUD_PINW_CAP channel count\t\t0x%lx\n",
- BITS(dword, 15, 13) * 2 + BIT(dword, 0));
- printf("AUD_PINW_CAP HDCP\t\t\t%lu\n", BIT(dword, 12));
- printf("AUD_PINW_CAP L-R swap\t\t\t%lu\n", BIT(dword, 11));
- printf("AUD_PINW_CAP power control\t\t%lu\n", BIT(dword, 10));
- printf("AUD_PINW_CAP digital\t\t\t%lu\n", BIT(dword, 9));
- printf("AUD_PINW_CAP conn list\t\t\t%lu\n", BIT(dword, 8));
- printf("AUD_PINW_CAP unsol\t\t\t%lu\n", BIT(dword, 7));
- printf("AUD_PINW_CAP mute\t\t\t%lu\n", BIT(dword, 5));
- printf("AUD_PINW_CAP format override\t\t%lu\n", BIT(dword, 4));
- printf("AUD_PINW_CAP amp param override\t\t%lu\n", BIT(dword, 3));
- printf("AUD_PINW_CAP out amp present\t\t%lu\n", BIT(dword, 2));
- printf("AUD_PINW_CAP in amp present\t\t%lu\n", BIT(dword, 1));
-
-
- dword = INREG(AUD_PIN_CAP);
- printf("AUD_PIN_CAP EAPD\t\t\t%lu\n", BIT(dword, 16));
- printf("AUD_PIN_CAP HDMI\t\t\t%lu\n", BIT(dword, 7));
- printf("AUD_PIN_CAP output\t\t\t%lu\n", BIT(dword, 4));
- printf("AUD_PIN_CAP presence detect\t\t%lu\n", BIT(dword, 2));
-
- dword = INREG(AUD_PINW_CNTR);
- printf("AUD_PINW_CNTR mute status\t\t%lu\n", BIT(dword, 8));
- printf("AUD_PINW_CNTR out enable\t\t%lu\n", BIT(dword, 6));
- printf("AUD_PINW_CNTR amp mute status\t\t%lu\n", BIT(dword, 8));
- printf("AUD_PINW_CNTR amp mute status\t\t%lu\n", BIT(dword, 8));
- printf("AUD_PINW_CNTR stream type\t\t[0x%lx] %s\n",
- BITS(dword, 2, 0),
- OPNAME(stream_type, BITS(dword, 2, 0)));
-
- dword = INREG(AUD_PINW_UNSOLRESP);
- printf("AUD_PINW_UNSOLRESP enable unsol resp\t%lu\n", BIT(dword, 31));
-
- dword = INREG(AUD_CNTL_ST);
- printf("AUD_CNTL_ST DIP audio enabled\t\t%lu\n", BIT(dword, 21));
- printf("AUD_CNTL_ST DIP ACP enabled\t\t%lu\n", BIT(dword, 22));
- printf("AUD_CNTL_ST DIP ISRCx enabled\t\t%lu\n", BIT(dword, 23));
- printf("AUD_CNTL_ST DIP port select\t\t[0x%lx] %s\n",
- BITS(dword, 30, 29), dip_port[BITS(dword, 30, 29)]);
- printf("AUD_CNTL_ST DIP buffer index\t\t[0x%lx] %s\n",
- BITS(dword, 20, 18), OPNAME(dip_index, BITS(dword, 20, 18)));
- printf("AUD_CNTL_ST DIP trans freq\t\t[0x%lx] %s\n",
- BITS(dword, 17, 16), dip_trans[BITS(dword, 17, 16)]);
- printf("AUD_CNTL_ST DIP address\t\t\t%lu\n", BITS(dword, 3, 0));
- printf("AUD_CNTL_ST CP ready\t\t\t%lu\n", BIT(dword, 15));
- printf("AUD_CNTL_ST ELD valid\t\t\t%lu\n", BIT(dword, 14));
- printf("AUD_CNTL_ST ELD ack\t\t\t%lu\n", BIT(dword, 4));
- printf("AUD_CNTL_ST ELD bufsize\t\t\t%lu\n", BITS(dword, 13, 9));
- printf("AUD_CNTL_ST ELD address\t\t\t%lu\n", BITS(dword, 8, 5));
-
- dword = INREG(AUD_HDMIW_STATUS);
- printf("AUD_HDMIW_STATUS CDCLK/DOTCLK underrun\t%lu\n", BIT(dword, 31));
- printf("AUD_HDMIW_STATUS CDCLK/DOTCLK overrun\t%lu\n", BIT(dword, 30));
- printf("AUD_HDMIW_STATUS BCLK/CDCLK underrun\t%lu\n", BIT(dword, 29));
- printf("AUD_HDMIW_STATUS BCLK/CDCLK overrun\t%lu\n", BIT(dword, 28));
-
- dword = INREG(AUD_CONV_CHCNT);
- printf("AUD_CONV_CHCNT HDMI HBR enabled\t\t%lu\n", BITS(dword, 15, 14));
- printf("AUD_CONV_CHCNT HDMI channel count\t%lu\n", BITS(dword, 11, 8) + 1);
-
- printf("AUD_CONV_CHCNT HDMI channel mapping:\n");
- for (i = 0; i < 8; i++) {
- OUTREG(AUD_CONV_CHCNT, i);
- dword = INREG(AUD_CONV_CHCNT);
- printf("\t\t\t\t\t[0x%x] %u => %lu \n", dword, i, BITS(dword, 7, 4));
- }
-
- return 0;
+ dump_reg(VIDEO_DIP_CTL, "Video DIP Control");
+ dump_reg(SDVOB, "Digital Display Port B Control Register");
+ dump_reg(SDVOC, "Digital Display Port C Control Register");
+ dump_reg(PORT_HOTPLUG_EN, "Hot Plug Detect Enable");
+
+ dump_reg(AUD_CONFIG, "Audio Configuration");
+ dump_reg(AUD_DEBUG, "Audio Debug");
+ dump_reg(AUD_VID_DID, "Audio Vendor ID / Device ID");
+ dump_reg(AUD_RID, "Audio Revision ID");
+ dump_reg(AUD_SUBN_CNT, "Audio Subordinate Node Count");
+ dump_reg(AUD_FUNC_GRP, "Audio Function Group Type");
+ dump_reg(AUD_SUBN_CNT2, "Audio Subordinate Node Count");
+ dump_reg(AUD_GRP_CAP, "Audio Function Group Capabilities");
+ dump_reg(AUD_PWRST, "Audio Power State");
+ dump_reg(AUD_SUPPWR, "Audio Supported Power States");
+ dump_reg(AUD_SID, "Audio Root Node Subsystem ID");
+ dump_reg(AUD_OUT_CWCAP, "Audio Output Converter Widget Capabilities");
+ dump_reg(AUD_OUT_PCMSIZE, "Audio PCM Size and Rates");
+ dump_reg(AUD_OUT_STR, "Audio Stream Formats");
+ dump_reg(AUD_OUT_DIG_CNVT, "Audio Digital Converter");
+ dump_reg(AUD_OUT_CH_STR, "Audio Channel ID and Stream ID");
+ dump_reg(AUD_OUT_STR_DESC, "Audio Stream Descriptor Format");
+ dump_reg(AUD_PINW_CAP, "Audio Pin Complex Widget Capabilities");
+ dump_reg(AUD_PIN_CAP, "Audio Pin Capabilities");
+ dump_reg(AUD_PINW_CONNLNG, "Audio Connection List Length");
+ dump_reg(AUD_PINW_CONNLST, "Audio Connection List Entry");
+ dump_reg(AUD_PINW_CNTR, "Audio Pin Widget Control");
+ dump_reg(AUD_PINW_UNSOLRESP, "Audio Unsolicited Response Enable");
+ dump_reg(AUD_CNTL_ST, "Audio Control State Register");
+ dump_reg(AUD_PINW_CONFIG, "Audio Configuration Default");
+ dump_reg(AUD_HDMIW_STATUS, "Audio HDMI Status");
+ dump_reg(AUD_HDMIW_HDMIEDID, "Audio HDMI Data EDID Block");
+ dump_reg(AUD_HDMIW_INFOFR, "Audio HDMI Widget Data Island Packet");
+ dump_reg(AUD_CONV_CHCNT, "Audio Converter Channel Count");
+ dump_reg(AUD_CTS_ENABLE, "Audio CTS Programming Enable");
+
+ printf("\nDetails:\n\n");
+
+ dword = INREG(AUD_VID_DID);
+ printf("AUD_VID_DID vendor id\t\t\t0x%x\n", dword >> 16);
+ printf("AUD_VID_DID device id\t\t\t0x%x\n", dword & 0xffff);
+
+ dword = INREG(AUD_RID);
+ printf("AUD_RID major revision\t\t\t0x%lx\n", BITS(dword, 23, 20));
+ printf("AUD_RID minor revision\t\t\t0x%lx\n", BITS(dword, 19, 16));
+ printf("AUD_RID revision id\t\t\t0x%lx\n", BITS(dword, 15, 8));
+ printf("AUD_RID stepping id\t\t\t0x%lx\n", BITS(dword, 7, 0));
+
+ dword = INREG(SDVOB);
+ printf("SDVOB enable\t\t\t\t%u\n", !!(dword & SDVO_ENABLE));
+ printf("SDVOB HDMI encoding\t\t\t%u\n", !!(dword & SDVO_ENCODING_HDMI));
+ printf("SDVOB SDVO encoding\t\t\t%u\n", !!(dword & SDVO_ENCODING_SDVO));
+ printf("SDVOB null packets\t\t\t%u\n",
+ !!(dword & SDVO_NULL_PACKETS_DURING_VSYNC));
+ printf("SDVOB audio enabled\t\t\t%u\n", !!(dword & SDVO_AUDIO_ENABLE));
+
+ dword = INREG(SDVOC);
+ printf("SDVOC enable\t\t\t\t%u\n", !!(dword & SDVO_ENABLE));
+ printf("SDVOC HDMI encoding\t\t\t%u\n", !!(dword & SDVO_ENCODING_HDMI));
+ printf("SDVOC SDVO encoding\t\t\t%u\n", !!(dword & SDVO_ENCODING_SDVO));
+ printf("SDVOC null packets\t\t\t%u\n",
+ !!(dword & SDVO_NULL_PACKETS_DURING_VSYNC));
+ printf("SDVOC audio enabled\t\t\t%u\n", !!(dword & SDVO_AUDIO_ENABLE));
+
+ dword = INREG(PORT_HOTPLUG_EN);
+ printf("PORT_HOTPLUG_EN DisplayPort/HDMI port B\t%ld\n",
+ BIT(dword, 29)),
+ printf("PORT_HOTPLUG_EN DisplayPort/HDMI port C\t%ld\n",
+ BIT(dword, 28)),
+ printf("PORT_HOTPLUG_EN DisplayPort port D\t%ld\n", BIT(dword, 27)),
+ printf("PORT_HOTPLUG_EN SDVOB\t\t\t%ld\n", BIT(dword, 26)),
+ printf("PORT_HOTPLUG_EN SDVOC\t\t\t%ld\n", BIT(dword, 25)),
+ printf("PORT_HOTPLUG_EN audio\t\t\t%ld\n", BIT(dword, 24)),
+ printf("PORT_HOTPLUG_EN TV\t\t\t%ld\n", BIT(dword, 23)),
+ printf("PORT_HOTPLUG_EN CRT\t\t\t%ld\n", BIT(dword, 9)), dword =
+ INREG(VIDEO_DIP_CTL);
+ printf("VIDEO_DIP_CTL enable graphics DIP\t%ld\n", BIT(dword, 31)),
+ printf("VIDEO_DIP_CTL port select\t\t[0x%lx] %s\n",
+ BITS(dword, 30, 29), dip_port[BITS(dword, 30, 29)]);
+ printf("VIDEO_DIP_CTL DIP buffer trans active\t%lu\n", BIT(dword, 28));
+ printf("VIDEO_DIP_CTL AVI DIP enabled\t\t%lu\n", BIT(dword, 21));
+ printf("VIDEO_DIP_CTL vendor DIP enabled\t%lu\n", BIT(dword, 22));
+ printf("VIDEO_DIP_CTL SPD DIP enabled\t\t%lu\n", BIT(dword, 24));
+ printf("VIDEO_DIP_CTL DIP buffer index\t\t[0x%lx] %s\n",
+ BITS(dword, 20, 19), video_dip_index[BITS(dword, 20, 19)]);
+ printf("VIDEO_DIP_CTL DIP trans freq\t\t[0x%lx] %s\n",
+ BITS(dword, 17, 16), video_dip_trans[BITS(dword, 17, 16)]);
+ printf("VIDEO_DIP_CTL DIP buffer size\t\t%lu\n", BITS(dword, 11, 8));
+ printf("VIDEO_DIP_CTL DIP address\t\t%lu\n", BITS(dword, 3, 0));
+
+ dword = INREG(AUD_CONFIG);
+ printf("AUD_CONFIG pixel clock\t\t\t[0x%lx] %s\n", BITS(dword, 19, 16),
+ OPNAME(pixel_clock, BITS(dword, 19, 16)));
+ printf("AUD_CONFIG fabrication enabled\t\t%lu\n", BITS(dword, 2, 2));
+ printf("AUD_CONFIG professional use allowed\t%lu\n", BIT(dword, 1));
+ printf("AUD_CONFIG fuse enabled\t\t\t%lu\n", BIT(dword, 0));
+
+ dword = INREG(AUD_DEBUG);
+ printf("AUD_DEBUG function reset\t\t%lu\n", BIT(dword, 0));
+
+ dword = INREG(AUD_SUBN_CNT);
+ printf("AUD_SUBN_CNT starting node number\t0x%lx\n",
+ BITS(dword, 23, 16));
+ printf("AUD_SUBN_CNT total number of nodes\t0x%lx\n",
+ BITS(dword, 7, 0));
+
+ dword = INREG(AUD_SUBN_CNT2);
+ printf("AUD_SUBN_CNT2 starting node number\t0x%lx\n",
+ BITS(dword, 24, 16));
+ printf("AUD_SUBN_CNT2 total number of nodes\t0x%lx\n",
+ BITS(dword, 7, 0));
+
+ dword = INREG(AUD_FUNC_GRP);
+ printf("AUD_FUNC_GRP unsol capable\t\t%lu\n", BIT(dword, 8));
+ printf("AUD_FUNC_GRP node type\t\t\t0x%lx\n", BITS(dword, 7, 0));
+
+ dword = INREG(AUD_GRP_CAP);
+ printf("AUD_GRP_CAP beep 0\t\t\t%lu\n", BIT(dword, 16));
+ printf("AUD_GRP_CAP input delay\t\t\t%lu\n", BITS(dword, 11, 8));
+ printf("AUD_GRP_CAP output delay\t\t%lu\n", BITS(dword, 3, 0));
+
+ dword = INREG(AUD_PWRST);
+ printf("AUD_PWRST device power state\t\t%s\n",
+ power_state[BITS(dword, 5, 4)]);
+ printf("AUD_PWRST device power state setting\t%s\n",
+ power_state[BITS(dword, 1, 0)]);
+
+ dword = INREG(AUD_SUPPWR);
+ printf("AUD_SUPPWR support D0\t\t\t%lu\n", BIT(dword, 0));
+ printf("AUD_SUPPWR support D1\t\t\t%lu\n", BIT(dword, 1));
+ printf("AUD_SUPPWR support D2\t\t\t%lu\n", BIT(dword, 2));
+ printf("AUD_SUPPWR support D3\t\t\t%lu\n", BIT(dword, 3));
+
+ dword = INREG(AUD_OUT_CWCAP);
+ printf("AUD_OUT_CWCAP widget type\t\t0x%lx\n", BITS(dword, 23, 20));
+ printf("AUD_OUT_CWCAP sample delay\t\t0x%lx\n", BITS(dword, 19, 16));
+ printf("AUD_OUT_CWCAP channel count\t\t%lu\n",
+ BITS(dword, 15, 13) * 2 + BIT(dword, 0) + 1);
+ printf("AUD_OUT_CWCAP L-R swap\t\t\t%lu\n", BIT(dword, 11));
+ printf("AUD_OUT_CWCAP power control\t\t%lu\n", BIT(dword, 10));
+ printf("AUD_OUT_CWCAP digital\t\t\t%lu\n", BIT(dword, 9));
+ printf("AUD_OUT_CWCAP conn list\t\t\t%lu\n", BIT(dword, 8));
+ printf("AUD_OUT_CWCAP unsol\t\t\t%lu\n", BIT(dword, 7));
+ printf("AUD_OUT_CWCAP mute\t\t\t%lu\n", BIT(dword, 5));
+ printf("AUD_OUT_CWCAP format override\t\t%lu\n", BIT(dword, 4));
+ printf("AUD_OUT_CWCAP amp param override\t%lu\n", BIT(dword, 3));
+ printf("AUD_OUT_CWCAP out amp present\t\t%lu\n", BIT(dword, 2));
+ printf("AUD_OUT_CWCAP in amp present\t\t%lu\n", BIT(dword, 1));
+
+ dword = INREG(AUD_OUT_DIG_CNVT);
+ printf("AUD_OUT_DIG_CNVT SPDIF category\t\t0x%lx\n",
+ BITS(dword, 14, 8));
+ printf("AUD_OUT_DIG_CNVT SPDIF level\t\t%lu\n", BIT(dword, 7));
+ printf("AUD_OUT_DIG_CNVT professional\t\t%lu\n", BIT(dword, 6));
+ printf("AUD_OUT_DIG_CNVT non PCM\t\t%lu\n", BIT(dword, 5));
+ printf("AUD_OUT_DIG_CNVT copyright asserted\t%lu\n", BIT(dword, 4));
+ printf("AUD_OUT_DIG_CNVT filter preemphasis\t%lu\n", BIT(dword, 3));
+ printf("AUD_OUT_DIG_CNVT validity config\t%lu\n", BIT(dword, 2));
+ printf("AUD_OUT_DIG_CNVT validity flag\t\t%lu\n", BIT(dword, 1));
+ printf("AUD_OUT_DIG_CNVT digital enable\t\t%lu\n", BIT(dword, 0));
+
+ dword = INREG(AUD_OUT_CH_STR);
+ printf("AUD_OUT_CH_STR stream id\t\t0x%lx\n", BITS(dword, 7, 4));
+ printf("AUD_OUT_CH_STR lowest channel\t\t0x%lx\n", BITS(dword, 3, 0));
+
+ dword = INREG(AUD_OUT_STR_DESC);
+ printf("AUD_OUT_STR_DESC stream channels\t0x%lx\n", BITS(dword, 3, 0));
+
+ dword = INREG(AUD_PINW_CAP);
+ printf("AUD_PINW_CAP widget type\t\t0x%lx\n", BITS(dword, 23, 20));
+ printf("AUD_PINW_CAP sample delay\t\t0x%lx\n", BITS(dword, 19, 16));
+ printf("AUD_PINW_CAP channel count\t\t0x%lx\n",
+ BITS(dword, 15, 13) * 2 + BIT(dword, 0));
+ printf("AUD_PINW_CAP HDCP\t\t\t%lu\n", BIT(dword, 12));
+ printf("AUD_PINW_CAP L-R swap\t\t\t%lu\n", BIT(dword, 11));
+ printf("AUD_PINW_CAP power control\t\t%lu\n", BIT(dword, 10));
+ printf("AUD_PINW_CAP digital\t\t\t%lu\n", BIT(dword, 9));
+ printf("AUD_PINW_CAP conn list\t\t\t%lu\n", BIT(dword, 8));
+ printf("AUD_PINW_CAP unsol\t\t\t%lu\n", BIT(dword, 7));
+ printf("AUD_PINW_CAP mute\t\t\t%lu\n", BIT(dword, 5));
+ printf("AUD_PINW_CAP format override\t\t%lu\n", BIT(dword, 4));
+ printf("AUD_PINW_CAP amp param override\t\t%lu\n", BIT(dword, 3));
+ printf("AUD_PINW_CAP out amp present\t\t%lu\n", BIT(dword, 2));
+ printf("AUD_PINW_CAP in amp present\t\t%lu\n", BIT(dword, 1));
+
+ dword = INREG(AUD_PIN_CAP);
+ printf("AUD_PIN_CAP EAPD\t\t\t%lu\n", BIT(dword, 16));
+ printf("AUD_PIN_CAP HDMI\t\t\t%lu\n", BIT(dword, 7));
+ printf("AUD_PIN_CAP output\t\t\t%lu\n", BIT(dword, 4));
+ printf("AUD_PIN_CAP presence detect\t\t%lu\n", BIT(dword, 2));
+
+ dword = INREG(AUD_PINW_CNTR);
+ printf("AUD_PINW_CNTR mute status\t\t%lu\n", BIT(dword, 8));
+ printf("AUD_PINW_CNTR out enable\t\t%lu\n", BIT(dword, 6));
+ printf("AUD_PINW_CNTR amp mute status\t\t%lu\n", BIT(dword, 8));
+ printf("AUD_PINW_CNTR amp mute status\t\t%lu\n", BIT(dword, 8));
+ printf("AUD_PINW_CNTR stream type\t\t[0x%lx] %s\n",
+ BITS(dword, 2, 0), OPNAME(stream_type, BITS(dword, 2, 0)));
+
+ dword = INREG(AUD_PINW_UNSOLRESP);
+ printf("AUD_PINW_UNSOLRESP enable unsol resp\t%lu\n", BIT(dword, 31));
+
+ dword = INREG(AUD_CNTL_ST);
+ printf("AUD_CNTL_ST DIP audio enabled\t\t%lu\n", BIT(dword, 21));
+ printf("AUD_CNTL_ST DIP ACP enabled\t\t%lu\n", BIT(dword, 22));
+ printf("AUD_CNTL_ST DIP ISRCx enabled\t\t%lu\n", BIT(dword, 23));
+ printf("AUD_CNTL_ST DIP port select\t\t[0x%lx] %s\n",
+ BITS(dword, 30, 29), dip_port[BITS(dword, 30, 29)]);
+ printf("AUD_CNTL_ST DIP buffer index\t\t[0x%lx] %s\n",
+ BITS(dword, 20, 18), OPNAME(dip_index, BITS(dword, 20, 18)));
+ printf("AUD_CNTL_ST DIP trans freq\t\t[0x%lx] %s\n",
+ BITS(dword, 17, 16), dip_trans[BITS(dword, 17, 16)]);
+ printf("AUD_CNTL_ST DIP address\t\t\t%lu\n", BITS(dword, 3, 0));
+ printf("AUD_CNTL_ST CP ready\t\t\t%lu\n", BIT(dword, 15));
+ printf("AUD_CNTL_ST ELD valid\t\t\t%lu\n", BIT(dword, 14));
+ printf("AUD_CNTL_ST ELD ack\t\t\t%lu\n", BIT(dword, 4));
+ printf("AUD_CNTL_ST ELD bufsize\t\t\t%lu\n", BITS(dword, 13, 9));
+ printf("AUD_CNTL_ST ELD address\t\t\t%lu\n", BITS(dword, 8, 5));
+
+ dword = INREG(AUD_HDMIW_STATUS);
+ printf("AUD_HDMIW_STATUS CDCLK/DOTCLK underrun\t%lu\n", BIT(dword, 31));
+ printf("AUD_HDMIW_STATUS CDCLK/DOTCLK overrun\t%lu\n", BIT(dword, 30));
+ printf("AUD_HDMIW_STATUS BCLK/CDCLK underrun\t%lu\n", BIT(dword, 29));
+ printf("AUD_HDMIW_STATUS BCLK/CDCLK overrun\t%lu\n", BIT(dword, 28));
+
+ dword = INREG(AUD_CONV_CHCNT);
+ printf("AUD_CONV_CHCNT HDMI HBR enabled\t\t%lu\n", BITS(dword, 15, 14));
+ printf("AUD_CONV_CHCNT HDMI channel count\t%lu\n",
+ BITS(dword, 11, 8) + 1);
+
+ printf("AUD_CONV_CHCNT HDMI channel mapping:\n");
+ for (i = 0; i < 8; i++) {
+ OUTREG(AUD_CONV_CHCNT, i);
+ dword = INREG(AUD_CONV_CHCNT);
+ printf("\t\t\t\t\t[0x%x] %u => %lu \n", dword, i,
+ BITS(dword, 7, 4));
+ }
+
+ return 0;
}
diff --git a/src/reg_dumper/gtt.c b/src/reg_dumper/gtt.c
index c3316017..241e5e4d 100644
--- a/src/reg_dumper/gtt.c
+++ b/src/reg_dumper/gtt.c
@@ -57,13 +57,13 @@ int main(int argc, char **argv)
else if (IS_I965G(pI830))
gtt = (unsigned char *)(pI830->mmio + KB(512));
else {
- /* 915/945 chips has GTT range in bar 3*/
+ /* 915/945 chips has GTT range in bar 3 */
int err = 0;
- err = pci_device_map_range (pI830->PciInfo,
- pI830->PciInfo->regions[3].base_addr,
- pI830->PciInfo->regions[3].size,
- PCI_DEV_MAP_FLAG_WRITABLE,
- (void **)&gtt);
+ err = pci_device_map_range(pI830->PciInfo,
+ pI830->PciInfo->regions[3].base_addr,
+ pI830->PciInfo->regions[3].size,
+ PCI_DEV_MAP_FLAG_WRITABLE,
+ (void **)&gtt);
if (err != 0) {
fprintf(stderr, "mapping GTT bar failed\n");
exit(1);
@@ -105,8 +105,7 @@ int main(int argc, char **argv)
}
if (constant_length > 0) {
printf("0x%08x - 0x%08x: constant 0x%08x\n",
- start, end - KB(4),
- start_pte);
+ start, end - KB(4), start_pte);
start = end - KB(4);
continue;
}
diff --git a/src/reg_dumper/hotplug.c b/src/reg_dumper/hotplug.c
index de463844..9cfb59f6 100644
--- a/src/reg_dumper/hotplug.c
+++ b/src/reg_dumper/hotplug.c
@@ -37,112 +37,111 @@
#include "../i810_reg.h"
struct idle_flags {
- uint32_t instdone_flag;
- char *name;
- unsigned int count;
+ uint32_t instdone_flag;
+ char *name;
+ unsigned int count;
};
int main(int argc, char **argv)
{
- struct pci_device *dev;
- I830Rec i830;
- I830Ptr pI830 = &i830;
- ScrnInfoRec scrn;
- int err, mmio_bar;
- void *mmio;
- int i;
-
- err = pci_system_init();
- if (err != 0) {
- fprintf(stderr, "Couldn't initialize PCI system: %s\n", strerror(err));
- exit(1);
- }
-
- /* Grab the graphics card */
- dev = pci_device_find_by_slot(0, 0, 2, 0);
- if (dev == NULL)
- errx(1, "Couldn't find graphics card");
-
- err = pci_device_probe(dev);
- if (err != 0) {
- fprintf(stderr, "Couldn't probe graphics card: %s\n", strerror(err));
- exit(1);
- }
-
- if (dev->vendor_id != 0x8086)
- errx(1, "Graphics card is non-intel");
-
- i830.PciInfo = dev;
-
- mmio_bar = IS_I9XX((&i830)) ? 0 : 1;
-
- err = pci_device_map_range (dev,
- dev->regions[mmio_bar].base_addr,
- dev->regions[mmio_bar].size,
- PCI_DEV_MAP_FLAG_WRITABLE,
- &mmio);
-
- if (err != 0) {
- fprintf(stderr, "Couldn't map MMIO region: %s\n", strerror(err));
- exit(1);
- }
- i830.mmio = mmio;
-
- scrn.scrnIndex = 0;
- scrn.pI830 = &i830;
-
- OUTREG(SDVOB, (0x0 << 10));
- OUTREG(SDVOC, (0x0 << 10));
-
- OUTREG(PORT_HOTPLUG_EN,
- (1 << 29) |
- (1 << 28) |
- (1 << 27) |
- SDVOB_HOTPLUG_INT_EN |
- SDVOC_HOTPLUG_INT_EN |
- (1 << 24) |
- CRT_HOTPLUG_INT_EN |
- TV_HOTPLUG_INT_EN |
- CRT_HOTPLUG_INT_EN);
-
- for (i = 0;; i++) {
- OUTREG(PORT_HOTPLUG_STAT,
- (1 << 20) |
- (1 << 19) |
- (1 << 18) |
- (1 << 17) |
- CRT_HOTPLUG_INT_STATUS |
- TV_HOTPLUG_INT_STATUS |
- SDVOC_HOTPLUG_INT_STATUS |
- SDVOB_HOTPLUG_INT_STATUS);
- INREG(PORT_HOTPLUG_STAT);
-
- usleep(500 * 1000);
-
- printf("%5d: 0x%08x\n", i, INREG(PORT_HOTPLUG_STAT));
- sleep(1);
- }
-
- return 0;
+ struct pci_device *dev;
+ I830Rec i830;
+ I830Ptr pI830 = &i830;
+ ScrnInfoRec scrn;
+ int err, mmio_bar;
+ void *mmio;
+ int i;
+
+ err = pci_system_init();
+ if (err != 0) {
+ fprintf(stderr, "Couldn't initialize PCI system: %s\n",
+ strerror(err));
+ exit(1);
+ }
+
+ /* Grab the graphics card */
+ dev = pci_device_find_by_slot(0, 0, 2, 0);
+ if (dev == NULL)
+ errx(1, "Couldn't find graphics card");
+
+ err = pci_device_probe(dev);
+ if (err != 0) {
+ fprintf(stderr, "Couldn't probe graphics card: %s\n",
+ strerror(err));
+ exit(1);
+ }
+
+ if (dev->vendor_id != 0x8086)
+ errx(1, "Graphics card is non-intel");
+
+ i830.PciInfo = dev;
+
+ mmio_bar = IS_I9XX((&i830)) ? 0 : 1;
+
+ err = pci_device_map_range(dev,
+ dev->regions[mmio_bar].base_addr,
+ dev->regions[mmio_bar].size,
+ PCI_DEV_MAP_FLAG_WRITABLE, &mmio);
+
+ if (err != 0) {
+ fprintf(stderr, "Couldn't map MMIO region: %s\n",
+ strerror(err));
+ exit(1);
+ }
+ i830.mmio = mmio;
+
+ scrn.scrnIndex = 0;
+ scrn.pI830 = &i830;
+
+ OUTREG(SDVOB, (0x0 << 10));
+ OUTREG(SDVOC, (0x0 << 10));
+
+ OUTREG(PORT_HOTPLUG_EN,
+ (1 << 29) |
+ (1 << 28) |
+ (1 << 27) |
+ SDVOB_HOTPLUG_INT_EN |
+ SDVOC_HOTPLUG_INT_EN |
+ (1 << 24) |
+ CRT_HOTPLUG_INT_EN | TV_HOTPLUG_INT_EN | CRT_HOTPLUG_INT_EN);
+
+ for (i = 0;; i++) {
+ OUTREG(PORT_HOTPLUG_STAT,
+ (1 << 20) |
+ (1 << 19) |
+ (1 << 18) |
+ (1 << 17) |
+ CRT_HOTPLUG_INT_STATUS |
+ TV_HOTPLUG_INT_STATUS |
+ SDVOC_HOTPLUG_INT_STATUS | SDVOB_HOTPLUG_INT_STATUS);
+ INREG(PORT_HOTPLUG_STAT);
+
+ usleep(500 * 1000);
+
+ printf("%5d: 0x%08x\n", i, INREG(PORT_HOTPLUG_STAT));
+ sleep(1);
+ }
+
+ return 0;
}
void xf86DrvMsg(int scrnIndex, int severity, const char *format, ...)
{
- va_list va;
-
- switch (severity) {
- case X_INFO:
- printf("(II): ");
- break;
- case X_WARNING:
- printf("(WW): ");
- break;
- case X_ERROR:
- printf("(EE): ");
- break;
- }
-
- va_start(va, format);
- vprintf(format, va);
- va_end(va);
+ va_list va;
+
+ switch (severity) {
+ case X_INFO:
+ printf("(II): ");
+ break;
+ case X_WARNING:
+ printf("(WW): ");
+ break;
+ case X_ERROR:
+ printf("(EE): ");
+ break;
+ }
+
+ va_start(va, format);
+ vprintf(format, va);
+ va_end(va);
}
diff --git a/src/reg_dumper/idle.c b/src/reg_dumper/idle.c
index cbd68aa3..0ea636f3 100644
--- a/src/reg_dumper/idle.c
+++ b/src/reg_dumper/idle.c
@@ -37,56 +37,56 @@
#include "../i810_reg.h"
struct idle_flags {
- uint32_t instdone_flag;
- char *name;
- int ignore;
- unsigned int count;
+ uint32_t instdone_flag;
+ char *name;
+ int ignore;
+ unsigned int count;
};
struct idle_flags i915_idle_flags[] = {
- {IDCT_DONE, "IDCT", 1},
- {IQ_DONE, "IQ", 1},
- {PR_DONE, "PR", 1},
- {VLD_DONE, "VLD", 1},
- {IP_DONE, "IP", 1},
- {FBC_DONE, "FBC"},
- {BINNER_DONE, "BINNER"},
- {SF_DONE, "SF"},
- {SE_DONE, "SE"},
- {WM_DONE, "WM"},
- {IZ_DONE, "IZ"},
- {PERSPECTIVE_INTERP_DONE, "perspective interpolation"},
- {DISPATCHER_DONE, "dispatcher"},
- {PROJECTION_DONE, "projection and LOD"},
- {DEPENDENT_ADDRESS_DONE, "dependent address calc"},
- {TEXTURE_FETCH_DONE, "texture fetch"},
- {TEXTURE_DECOMPRESS_DONE, "texture decompress"},
- {SAMPLER_CACHE_DONE, "sampler cache"},
- {FILTER_DONE, "filter"},
- {BYPASS_FIFO_DONE, "bypass FIFO"},
- {PS_DONE, "PS"},
- {CC_DONE, "CC"},
- {MAP_FILTER_DONE, "map filter"},
- {MAP_L2_IDLE, "map L2", 1},
- {0x80000038, "reserved bits", 1},
- {0, "total"},
- {0, "other"},
+ {IDCT_DONE, "IDCT", 1},
+ {IQ_DONE, "IQ", 1},
+ {PR_DONE, "PR", 1},
+ {VLD_DONE, "VLD", 1},
+ {IP_DONE, "IP", 1},
+ {FBC_DONE, "FBC"},
+ {BINNER_DONE, "BINNER"},
+ {SF_DONE, "SF"},
+ {SE_DONE, "SE"},
+ {WM_DONE, "WM"},
+ {IZ_DONE, "IZ"},
+ {PERSPECTIVE_INTERP_DONE, "perspective interpolation"},
+ {DISPATCHER_DONE, "dispatcher"},
+ {PROJECTION_DONE, "projection and LOD"},
+ {DEPENDENT_ADDRESS_DONE, "dependent address calc"},
+ {TEXTURE_FETCH_DONE, "texture fetch"},
+ {TEXTURE_DECOMPRESS_DONE, "texture decompress"},
+ {SAMPLER_CACHE_DONE, "sampler cache"},
+ {FILTER_DONE, "filter"},
+ {BYPASS_FIFO_DONE, "bypass FIFO"},
+ {PS_DONE, "PS"},
+ {CC_DONE, "CC"},
+ {MAP_FILTER_DONE, "map filter"},
+ {MAP_L2_IDLE, "map L2", 1},
+ {0x80000038, "reserved bits", 1},
+ {0, "total"},
+ {0, "other"},
};
struct idle_flags i965_idle_flags[] = {
- {I965_SF_DONE, "SF"},
- {I965_SE_DONE, "SE"},
- {I965_WM_DONE, "WM"},
- {I965_TEXTURE_FETCH_DONE, "texture fetch"},
- {I965_SAMPLER_CACHE_DONE, "sampler cache"},
- {I965_FILTER_DONE, "filter"},
- {I965_PS_DONE, "PS"},
- {I965_CC_DONE, "CC"},
- {I965_MAP_FILTER_DONE, "map filter"},
- {I965_MAP_L2_IDLE, "map L2"},
- {I965_CP_DONE, "CP"},
- {0, "total"},
- {0, "other"},
+ {I965_SF_DONE, "SF"},
+ {I965_SE_DONE, "SE"},
+ {I965_WM_DONE, "WM"},
+ {I965_TEXTURE_FETCH_DONE, "texture fetch"},
+ {I965_SAMPLER_CACHE_DONE, "sampler cache"},
+ {I965_FILTER_DONE, "filter"},
+ {I965_PS_DONE, "PS"},
+ {I965_CC_DONE, "CC"},
+ {I965_MAP_FILTER_DONE, "map filter"},
+ {I965_MAP_L2_IDLE, "map L2"},
+ {I965_CP_DONE, "CP"},
+ {0, "total"},
+ {0, "other"},
};
/* Fills in the "other" and "total" fields' idle flags */
@@ -94,134 +94,138 @@ static void
setup_other_flags(I830Ptr pI830,
struct idle_flags *idle_flags, int idle_flag_count)
{
- uint32_t other_idle_flags, total_idle_flags = 0;
- int i;
-
- if (IS_I965G(pI830))
- other_idle_flags = ~(I965_RING_0_ENABLE);
- else
- other_idle_flags = ~(RING_0_ENABLE | RING_1_ENABLE | RING_2_ENABLE);
-
- for (i = 0; i < idle_flag_count - 2; i++) {
- other_idle_flags &= ~idle_flags[i].instdone_flag;
- if (!idle_flags[i].ignore)
- total_idle_flags |= idle_flags[i].instdone_flag;
- }
- idle_flags[idle_flag_count - 2].instdone_flag = total_idle_flags;
- idle_flags[idle_flag_count - 1].instdone_flag = other_idle_flags;
+ uint32_t other_idle_flags, total_idle_flags = 0;
+ int i;
+
+ if (IS_I965G(pI830))
+ other_idle_flags = ~(I965_RING_0_ENABLE);
+ else
+ other_idle_flags =
+ ~(RING_0_ENABLE | RING_1_ENABLE | RING_2_ENABLE);
+
+ for (i = 0; i < idle_flag_count - 2; i++) {
+ other_idle_flags &= ~idle_flags[i].instdone_flag;
+ if (!idle_flags[i].ignore)
+ total_idle_flags |= idle_flags[i].instdone_flag;
+ }
+ idle_flags[idle_flag_count - 2].instdone_flag = total_idle_flags;
+ idle_flags[idle_flag_count - 1].instdone_flag = other_idle_flags;
}
int main(int argc, char **argv)
{
- struct pci_device *dev;
- I830Rec i830;
- I830Ptr pI830 = &i830;
- ScrnInfoRec scrn;
- int err, mmio_bar;
- void *mmio;
- struct idle_flags *idle_flags;
- int idle_flag_count;
-
- err = pci_system_init();
- if (err != 0) {
- fprintf(stderr, "Couldn't initialize PCI system: %s\n", strerror(err));
- exit(1);
- }
-
- /* Grab the graphics card */
- dev = pci_device_find_by_slot(0, 0, 2, 0);
- if (dev == NULL)
- errx(1, "Couldn't find graphics card");
-
- err = pci_device_probe(dev);
- if (err != 0) {
- fprintf(stderr, "Couldn't probe graphics card: %s\n", strerror(err));
- exit(1);
- }
-
- if (dev->vendor_id != 0x8086)
- errx(1, "Graphics card is non-intel");
-
- i830.PciInfo = dev;
-
- mmio_bar = IS_I9XX((&i830)) ? 0 : 1;
-
- err = pci_device_map_range (dev,
- dev->regions[mmio_bar].base_addr,
- dev->regions[mmio_bar].size,
- PCI_DEV_MAP_FLAG_WRITABLE,
- &mmio);
-
- if (err != 0) {
- fprintf(stderr, "Couldn't map MMIO region: %s\n", strerror(err));
- exit(1);
- }
- i830.mmio = mmio;
-
- scrn.scrnIndex = 0;
- scrn.pI830 = &i830;
-
- if (IS_I965G(pI830)) {
- idle_flags = i965_idle_flags;
- idle_flag_count = ARRAY_SIZE(i965_idle_flags);
- } else {
- idle_flags = i915_idle_flags;
- idle_flag_count = ARRAY_SIZE(i915_idle_flags);
- }
-
- setup_other_flags(pI830, idle_flags, idle_flag_count);
-
- for (;;) {
- int i, j;
-
- for (i = 0; i < 100; i++) {
- uint32_t instdone;
-
- if (IS_I965G(pI830))
- instdone = INREG(INST_DONE_I965);
- else
- instdone = INREG(INST_DONE);
-
- for (j = 0; j < idle_flag_count; j++) {
- if ((instdone & idle_flags[j].instdone_flag) !=
- idle_flags[j].instdone_flag)
- idle_flags[j].count++;
- }
-
- usleep (10000);
+ struct pci_device *dev;
+ I830Rec i830;
+ I830Ptr pI830 = &i830;
+ ScrnInfoRec scrn;
+ int err, mmio_bar;
+ void *mmio;
+ struct idle_flags *idle_flags;
+ int idle_flag_count;
+
+ err = pci_system_init();
+ if (err != 0) {
+ fprintf(stderr, "Couldn't initialize PCI system: %s\n",
+ strerror(err));
+ exit(1);
+ }
+
+ /* Grab the graphics card */
+ dev = pci_device_find_by_slot(0, 0, 2, 0);
+ if (dev == NULL)
+ errx(1, "Couldn't find graphics card");
+
+ err = pci_device_probe(dev);
+ if (err != 0) {
+ fprintf(stderr, "Couldn't probe graphics card: %s\n",
+ strerror(err));
+ exit(1);
}
- for (j = 0; j < idle_flag_count; j++) {
- if (!idle_flags[j].ignore)
- printf("%25s: %3d\n", idle_flags[j].name, idle_flags[j].count);
- else
- printf("%25s: %3d (unreliable)\n",
- idle_flags[j].name, idle_flags[j].count);
- idle_flags[j].count = 0;
+ if (dev->vendor_id != 0x8086)
+ errx(1, "Graphics card is non-intel");
+
+ i830.PciInfo = dev;
+
+ mmio_bar = IS_I9XX((&i830)) ? 0 : 1;
+
+ err = pci_device_map_range(dev,
+ dev->regions[mmio_bar].base_addr,
+ dev->regions[mmio_bar].size,
+ PCI_DEV_MAP_FLAG_WRITABLE, &mmio);
+
+ if (err != 0) {
+ fprintf(stderr, "Couldn't map MMIO region: %s\n",
+ strerror(err));
+ exit(1);
}
- printf("\n");
- }
+ i830.mmio = mmio;
- return 0;
+ scrn.scrnIndex = 0;
+ scrn.pI830 = &i830;
+
+ if (IS_I965G(pI830)) {
+ idle_flags = i965_idle_flags;
+ idle_flag_count = ARRAY_SIZE(i965_idle_flags);
+ } else {
+ idle_flags = i915_idle_flags;
+ idle_flag_count = ARRAY_SIZE(i915_idle_flags);
+ }
+
+ setup_other_flags(pI830, idle_flags, idle_flag_count);
+
+ for (;;) {
+ int i, j;
+
+ for (i = 0; i < 100; i++) {
+ uint32_t instdone;
+
+ if (IS_I965G(pI830))
+ instdone = INREG(INST_DONE_I965);
+ else
+ instdone = INREG(INST_DONE);
+
+ for (j = 0; j < idle_flag_count; j++) {
+ if ((instdone & idle_flags[j].instdone_flag) !=
+ idle_flags[j].instdone_flag)
+ idle_flags[j].count++;
+ }
+
+ usleep(10000);
+ }
+
+ for (j = 0; j < idle_flag_count; j++) {
+ if (!idle_flags[j].ignore)
+ printf("%25s: %3d\n", idle_flags[j].name,
+ idle_flags[j].count);
+ else
+ printf("%25s: %3d (unreliable)\n",
+ idle_flags[j].name, idle_flags[j].count);
+ idle_flags[j].count = 0;
+ }
+ printf("\n");
+ }
+
+ return 0;
}
void xf86DrvMsg(int scrnIndex, int severity, const char *format, ...)
{
- va_list va;
-
- switch (severity) {
- case X_INFO:
- printf("(II): ");
- break;
- case X_WARNING:
- printf("(WW): ");
- break;
- case X_ERROR:
- printf("(EE): ");
- break;
- }
-
- va_start(va, format);
- vprintf(format, va);
- va_end(va);
+ va_list va;
+
+ switch (severity) {
+ case X_INFO:
+ printf("(II): ");
+ break;
+ case X_WARNING:
+ printf("(WW): ");
+ break;
+ case X_ERROR:
+ printf("(EE): ");
+ break;
+ }
+
+ va_start(va, format);
+ vprintf(format, va);
+ va_end(va);
}
diff --git a/src/reg_dumper/lid.c b/src/reg_dumper/lid.c
index 771d67d4..29e6cd56 100644
--- a/src/reg_dumper/lid.c
+++ b/src/reg_dumper/lid.c
@@ -42,105 +42,105 @@
#include "../i830_bios.h"
enum lid_status {
- LID_UNKNOWN = -1,
- LID_OPEN,
- LID_CLOSE,
+ LID_UNKNOWN = -1,
+ LID_OPEN,
+ LID_CLOSE,
};
#define ACPI_BUTTON "/proc/acpi/button/"
#define ACPI_LID "/proc/acpi/button/lid/"
-static int
-i830_lvds_acpi_lid_state(void)
+static int i830_lvds_acpi_lid_state(void)
{
- int fd;
- DIR *button_dir;
- DIR *lid_dir;
- struct dirent *lid_dent;
- char *state_name;
- char state[64];
- enum lid_status ret = LID_UNKNOWN;
-
- button_dir = opendir(ACPI_BUTTON);
- /* If acpi button driver is not loaded, bypass ACPI check method */
- if (button_dir == NULL)
- goto out;
- closedir(button_dir);
-
- lid_dir = opendir(ACPI_LID);
-
- /* no acpi lid object found */
- if (lid_dir == NULL)
- goto out;
-
- while (1) {
- lid_dent = readdir(lid_dir);
- if (lid_dent == NULL) {
- /* no LID object */
- closedir(lid_dir);
- goto out;
+ int fd;
+ DIR *button_dir;
+ DIR *lid_dir;
+ struct dirent *lid_dent;
+ char *state_name;
+ char state[64];
+ enum lid_status ret = LID_UNKNOWN;
+
+ button_dir = opendir(ACPI_BUTTON);
+ /* If acpi button driver is not loaded, bypass ACPI check method */
+ if (button_dir == NULL)
+ goto out;
+ closedir(button_dir);
+
+ lid_dir = opendir(ACPI_LID);
+
+ /* no acpi lid object found */
+ if (lid_dir == NULL)
+ goto out;
+
+ while (1) {
+ lid_dent = readdir(lid_dir);
+ if (lid_dent == NULL) {
+ /* no LID object */
+ closedir(lid_dir);
+ goto out;
+ }
+ if (strcmp(lid_dent->d_name, ".") &&
+ strcmp(lid_dent->d_name, "..")) {
+ break;
+ }
}
- if (strcmp(lid_dent->d_name, ".") &&
- strcmp(lid_dent->d_name, "..")) {
- break;
- }
- }
- state_name = malloc(strlen(ACPI_LID) + strlen(lid_dent->d_name) + 7);
- memset(state_name, 0, sizeof(state_name));
- strcat(state_name, ACPI_LID);
- strcat(state_name, lid_dent->d_name);
- strcat(state_name, "/state");
+ state_name = malloc(strlen(ACPI_LID) + strlen(lid_dent->d_name) + 7);
+ memset(state_name, 0, sizeof(state_name));
+ strcat(state_name, ACPI_LID);
+ strcat(state_name, lid_dent->d_name);
+ strcat(state_name, "/state");
- closedir(lid_dir);
+ closedir(lid_dir);
- if ((fd = open(state_name, O_RDONLY)) == -1) {
+ if ((fd = open(state_name, O_RDONLY)) == -1) {
+ free(state_name);
+ goto out;
+ }
free(state_name);
- goto out;
- }
- free(state_name);
- if (read(fd, state, 64) == -1) {
+ if (read(fd, state, 64) == -1) {
+ close(fd);
+ goto out;
+ }
close(fd);
- goto out;
- }
- close(fd);
- if (strstr(state, "open"))
- ret = LID_OPEN;
- else if (strstr(state, "closed"))
- ret = LID_CLOSE;
- else /* "unsupported" */
- ret = LID_UNKNOWN;
+ if (strstr(state, "open"))
+ ret = LID_OPEN;
+ else if (strstr(state, "closed"))
+ ret = LID_CLOSE;
+ else /* "unsupported" */
+ ret = LID_UNKNOWN;
out:
- return ret;
+ return ret;
}
int main(int argc, char **argv)
{
- I830Rec i830;
- I830Ptr pI830 = &i830;
- int swf14, acpi_lid;
-
- intel_i830rec_init(pI830);
-
- while (1) {
- swf14 = INREG(SWF14);
-
- printf("Intel LVDS Lid status:\n");
- printf("\tSWF14(0x%x) : %s\n", swf14, swf14 & SWF14_LID_SWITCH_EN ? "close" : "open");
-
- acpi_lid = i830_lvds_acpi_lid_state();
- switch (acpi_lid) {
- case LID_UNKNOWN:
- printf("\tACPI Lid state : unknown\n");
- break;
- case LID_OPEN:
- printf("\tACPI Lid state : open\n");
- break;
- case LID_CLOSE:
- printf("\tACPI Lid state : close\n");
- break;
+ I830Rec i830;
+ I830Ptr pI830 = &i830;
+ int swf14, acpi_lid;
+
+ intel_i830rec_init(pI830);
+
+ while (1) {
+ swf14 = INREG(SWF14);
+
+ printf("Intel LVDS Lid status:\n");
+ printf("\tSWF14(0x%x) : %s\n", swf14,
+ swf14 & SWF14_LID_SWITCH_EN ? "close" : "open");
+
+ acpi_lid = i830_lvds_acpi_lid_state();
+ switch (acpi_lid) {
+ case LID_UNKNOWN:
+ printf("\tACPI Lid state : unknown\n");
+ break;
+ case LID_OPEN:
+ printf("\tACPI Lid state : open\n");
+ break;
+ case LID_CLOSE:
+ printf("\tACPI Lid state : close\n");
+ break;
+ }
+ sleep(2);
}
- sleep(2);
- }
- return 0;
+ return 0;
}
diff --git a/src/reg_dumper/main.c b/src/reg_dumper/main.c
index ce883ef8..be9554ac 100644
--- a/src/reg_dumper/main.c
+++ b/src/reg_dumper/main.c
@@ -35,73 +35,75 @@
int main(int argc, char **argv)
{
- struct pci_device *dev;
- I830Rec i830;
- ScrnInfoRec scrn;
- int err, mmio_bar;
- void *mmio;
-
- err = pci_system_init();
- if (err != 0) {
- fprintf(stderr, "Couldn't initialize PCI system: %s\n", strerror(err));
- exit(1);
- }
-
- /* Grab the graphics card */
- dev = pci_device_find_by_slot(0, 0, 2, 0);
- if (dev == NULL)
- errx(1, "Couldn't find graphics card");
-
- err = pci_device_probe(dev);
- if (err != 0) {
- fprintf(stderr, "Couldn't probe graphics card: %s\n", strerror(err));
- exit(1);
- }
-
- if (dev->vendor_id != 0x8086)
- errx(1, "Graphics card is non-intel");
-
- i830.PciInfo = dev;
-
- mmio_bar = IS_I9XX((&i830)) ? 0 : 1;
-
- err = pci_device_map_range (dev,
- dev->regions[mmio_bar].base_addr,
- dev->regions[mmio_bar].size,
- PCI_DEV_MAP_FLAG_WRITABLE,
- &mmio);
-
- if (err != 0) {
- fprintf(stderr, "Couldn't map MMIO region: %s\n", strerror(err));
- exit(1);
- }
- i830.mmio = mmio;
-
- scrn.scrnIndex = 0;
- scrn.pI830 = &i830;
-
- i830DumpRegs(&scrn);
-
- return 0;
+ struct pci_device *dev;
+ I830Rec i830;
+ ScrnInfoRec scrn;
+ int err, mmio_bar;
+ void *mmio;
+
+ err = pci_system_init();
+ if (err != 0) {
+ fprintf(stderr, "Couldn't initialize PCI system: %s\n",
+ strerror(err));
+ exit(1);
+ }
+
+ /* Grab the graphics card */
+ dev = pci_device_find_by_slot(0, 0, 2, 0);
+ if (dev == NULL)
+ errx(1, "Couldn't find graphics card");
+
+ err = pci_device_probe(dev);
+ if (err != 0) {
+ fprintf(stderr, "Couldn't probe graphics card: %s\n",
+ strerror(err));
+ exit(1);
+ }
+
+ if (dev->vendor_id != 0x8086)
+ errx(1, "Graphics card is non-intel");
+
+ i830.PciInfo = dev;
+
+ mmio_bar = IS_I9XX((&i830)) ? 0 : 1;
+
+ err = pci_device_map_range(dev,
+ dev->regions[mmio_bar].base_addr,
+ dev->regions[mmio_bar].size,
+ PCI_DEV_MAP_FLAG_WRITABLE, &mmio);
+
+ if (err != 0) {
+ fprintf(stderr, "Couldn't map MMIO region: %s\n",
+ strerror(err));
+ exit(1);
+ }
+ i830.mmio = mmio;
+
+ scrn.scrnIndex = 0;
+ scrn.pI830 = &i830;
+
+ i830DumpRegs(&scrn);
+
+ return 0;
}
void xf86DrvMsg(int scrnIndex, int severity, const char *format, ...)
{
- va_list va;
-
- switch (severity) {
- case X_INFO:
- printf("(II): ");
- break;
- case X_WARNING:
- printf("(WW): ");
- break;
- case X_ERROR:
- printf("(EE): ");
- break;
- }
-
- va_start(va, format);
- vprintf(format, va);
- va_end(va);
+ va_list va;
+
+ switch (severity) {
+ case X_INFO:
+ printf("(II): ");
+ break;
+ case X_WARNING:
+ printf("(WW): ");
+ break;
+ case X_ERROR:
+ printf("(EE): ");
+ break;
+ }
+
+ va_start(va, format);
+ vprintf(format, va);
+ va_end(va);
}
diff --git a/src/reg_dumper/reg_dumper.h b/src/reg_dumper/reg_dumper.h
index 8c2eb0bb..15079372 100644
--- a/src/reg_dumper/reg_dumper.h
+++ b/src/reg_dumper/reg_dumper.h
@@ -47,20 +47,20 @@ typedef char Bool;
#define X_ERROR 2
typedef struct _i830 {
- /* Fields in common with the real pI830 */
- struct pci_device *PciInfo;
- Bool use_drm_mode;
+ /* Fields in common with the real pI830 */
+ struct pci_device *PciInfo;
+ Bool use_drm_mode;
- /* Fields used for setting up reg_dumper */
- volatile unsigned char *mmio;
+ /* Fields used for setting up reg_dumper */
+ volatile unsigned char *mmio;
} I830Rec, *I830Ptr;
typedef struct _scrn {
- /* Fields in common with the real pScrn */
- int scrnIndex;
+ /* Fields in common with the real pScrn */
+ int scrnIndex;
- /* Fields used for setting up reg_dumper */
- I830Ptr pI830;
+ /* Fields used for setting up reg_dumper */
+ I830Ptr pI830;
} ScrnInfoRec, *ScrnInfoPtr;
#define I830PTR(pScrn) (pScrn->pI830)
diff --git a/src/reg_dumper/statuspage.c b/src/reg_dumper/statuspage.c
index f439a960..84bffa13 100644
--- a/src/reg_dumper/statuspage.c
+++ b/src/reg_dumper/statuspage.c
@@ -44,41 +44,41 @@
int main(int argc, char **argv)
{
- I830Rec i830;
- I830Ptr pI830 = &i830;
- int devmem;
- uint32_t hws_offset;
- volatile uint32_t *hws;
+ I830Rec i830;
+ I830Ptr pI830 = &i830;
+ int devmem;
+ uint32_t hws_offset;
+ volatile uint32_t *hws;
- intel_i830rec_init(pI830);
+ intel_i830rec_init(pI830);
- if (HWS_NEED_GFX(pI830))
- errx(1, "status page in graphics virtual unsupported.\n");
+ if (HWS_NEED_GFX(pI830))
+ errx(1, "status page in graphics virtual unsupported.\n");
- hws_offset = INREG(HWS_PGA);
+ hws_offset = INREG(HWS_PGA);
- devmem = open("/dev/mem", O_RDWR, 0);
- if (devmem == -1)
- err(1, "Couldn't open /dev/mem");
+ devmem = open("/dev/mem", O_RDWR, 0);
+ if (devmem == -1)
+ err(1, "Couldn't open /dev/mem");
- hws = mmap(NULL, 4096, PROT_READ, MAP_SHARED, devmem, hws_offset);
- if (hws == MAP_FAILED)
- err(1, "Couldn't map /dev/mem at 0x%08x", hws_offset);
+ hws = mmap(NULL, 4096, PROT_READ, MAP_SHARED, devmem, hws_offset);
+ if (hws == MAP_FAILED)
+ err(1, "Couldn't map /dev/mem at 0x%08x", hws_offset);
- close(devmem);
+ close(devmem);
- for (;;) {
- int i;
+ for (;;) {
+ int i;
- printf("\n");
+ printf("\n");
- for (i = 0; i < 64; i += 4) {
- printf("0x%04x: 0x%08x 0x%08x 0x%08x 0x%08x\n", i * 4,
- hws[i], hws[i + 1], hws[i + 2], hws[i + 3]);
- }
+ for (i = 0; i < 64; i += 4) {
+ printf("0x%04x: 0x%08x 0x%08x 0x%08x 0x%08x\n", i * 4,
+ hws[i], hws[i + 1], hws[i + 2], hws[i + 3]);
+ }
- sleep(1);
- }
+ sleep(1);
+ }
- return 0;
+ return 0;
}
diff --git a/src/reg_dumper/stepping.c b/src/reg_dumper/stepping.c
index dd0cb427..ffc0fc20 100644
--- a/src/reg_dumper/stepping.c
+++ b/src/reg_dumper/stepping.c
@@ -35,103 +35,103 @@
int main(int argc, char **argv)
{
- struct pci_device *dev, *bridge;
- int err;
- uint8_t stepping;
- char *step_desc = "??";
+ struct pci_device *dev, *bridge;
+ int err;
+ uint8_t stepping;
+ char *step_desc = "??";
- err = pci_system_init();
- if (err != 0) {
- fprintf(stderr, "Couldn't initialize PCI system: %s\n", strerror(err));
- exit(1);
- }
+ err = pci_system_init();
+ if (err != 0) {
+ fprintf(stderr, "Couldn't initialize PCI system: %s\n",
+ strerror(err));
+ exit(1);
+ }
- /* Grab the graphics card */
- dev = pci_device_find_by_slot(0, 0, 2, 0);
- if (dev == NULL)
- errx(1, "Couldn't find graphics card");
+ /* Grab the graphics card */
+ dev = pci_device_find_by_slot(0, 0, 2, 0);
+ if (dev == NULL)
+ errx(1, "Couldn't find graphics card");
- err = pci_device_probe(dev);
- if (err != 0) {
- fprintf(stderr, "Couldn't probe graphics card: %s\n", strerror(err));
- exit(1);
- }
+ err = pci_device_probe(dev);
+ if (err != 0) {
+ fprintf(stderr, "Couldn't probe graphics card: %s\n",
+ strerror(err));
+ exit(1);
+ }
- if (dev->vendor_id != 0x8086)
- errx(1, "Graphics card is non-intel");
+ if (dev->vendor_id != 0x8086)
+ errx(1, "Graphics card is non-intel");
- bridge = pci_device_find_by_slot(0, 0, 0, 0);
- if (dev == NULL)
- errx(1, "Couldn't bridge");
+ bridge = pci_device_find_by_slot(0, 0, 0, 0);
+ if (dev == NULL)
+ errx(1, "Couldn't bridge");
- err = pci_device_cfg_read_u8(bridge, &stepping, 8);
- if (err != 0) {
- fprintf(stderr, "Couldn't read revision ID: %s\n", strerror(err));
- exit(1);
- }
+ err = pci_device_cfg_read_u8(bridge, &stepping, 8);
+ if (err != 0) {
+ fprintf(stderr, "Couldn't read revision ID: %s\n",
+ strerror(err));
+ exit(1);
+ }
- switch (dev->device_id) {
- case PCI_CHIP_I915_G:
- if (stepping < 0x04)
- step_desc = "<B1";
- else if (stepping == 0x04)
- step_desc = "B1";
- else if (stepping == 0x0e)
- step_desc = "C2";
- else if (stepping > 0x0e)
- step_desc = ">C2";
- else
- step_desc = ">B1 <C2";
- break;
- case PCI_CHIP_I915_GM:
- if (stepping < 0x03)
- step_desc = "<B1";
- else if (stepping == 0x03)
- step_desc = "B1/C0";
- else if (stepping == 0x04)
- step_desc = "C1/C2";
- else
- step_desc = ">C2";
- break;
- case PCI_CHIP_I945_GM:
- if (stepping < 0x03)
- step_desc = "<A3";
- else if (stepping == 0x03)
- step_desc = "A3";
- else
- step_desc = ">A3";
- break;
- case PCI_CHIP_I965_G:
- case PCI_CHIP_I965_Q:
- if (stepping < 0x02)
- step_desc = "<C1";
- else if (stepping == 0x02)
- step_desc = "C1/C2";
- else
- step_desc = ">C2";
- break;
- case PCI_CHIP_I965_GM:
- if (stepping < 0x03)
- step_desc = "<C0";
- else if (stepping == 0x03)
- step_desc = "C0";
- else
- step_desc = ">C0";
- break;
- case PCI_CHIP_G35_G:
- if (stepping < 0x03)
- step_desc = "<E0";
- else if (stepping == 0x03)
- step_desc = "E0";
- else
- step_desc = ">E0";
- break;
- }
+ switch (dev->device_id) {
+ case PCI_CHIP_I915_G:
+ if (stepping < 0x04)
+ step_desc = "<B1";
+ else if (stepping == 0x04)
+ step_desc = "B1";
+ else if (stepping == 0x0e)
+ step_desc = "C2";
+ else if (stepping > 0x0e)
+ step_desc = ">C2";
+ else
+ step_desc = ">B1 <C2";
+ break;
+ case PCI_CHIP_I915_GM:
+ if (stepping < 0x03)
+ step_desc = "<B1";
+ else if (stepping == 0x03)
+ step_desc = "B1/C0";
+ else if (stepping == 0x04)
+ step_desc = "C1/C2";
+ else
+ step_desc = ">C2";
+ break;
+ case PCI_CHIP_I945_GM:
+ if (stepping < 0x03)
+ step_desc = "<A3";
+ else if (stepping == 0x03)
+ step_desc = "A3";
+ else
+ step_desc = ">A3";
+ break;
+ case PCI_CHIP_I965_G:
+ case PCI_CHIP_I965_Q:
+ if (stepping < 0x02)
+ step_desc = "<C1";
+ else if (stepping == 0x02)
+ step_desc = "C1/C2";
+ else
+ step_desc = ">C2";
+ break;
+ case PCI_CHIP_I965_GM:
+ if (stepping < 0x03)
+ step_desc = "<C0";
+ else if (stepping == 0x03)
+ step_desc = "C0";
+ else
+ step_desc = ">C0";
+ break;
+ case PCI_CHIP_G35_G:
+ if (stepping < 0x03)
+ step_desc = "<E0";
+ else if (stepping == 0x03)
+ step_desc = "E0";
+ else
+ step_desc = ">E0";
+ break;
+ }
- printf("Vendor: 0x%04x, Device: 0x%04x, Revision: 0x%02x (%s)\n",
- dev->vendor_id,
- dev->device_id,
- stepping,
- step_desc);
- return 0;
+ printf("Vendor: 0x%04x, Device: 0x%04x, Revision: 0x%02x (%s)\n",
+ dev->vendor_id, dev->device_id, stepping, step_desc);
+ return 0;
}
diff --git a/src/reg_dumper/util.c b/src/reg_dumper/util.c
index 4d6380e9..61210f67 100644
--- a/src/reg_dumper/util.c
+++ b/src/reg_dumper/util.c
@@ -41,43 +41,45 @@
*/
void intel_i830rec_init(I830Ptr pI830)
{
- struct pci_device *dev;
- int err, mmio_bar;
- void *mmio;
+ struct pci_device *dev;
+ int err, mmio_bar;
+ void *mmio;
- err = pci_system_init();
- if (err != 0) {
- fprintf(stderr, "Couldn't initialize PCI system: %s\n", strerror(err));
- exit(1);
- }
+ err = pci_system_init();
+ if (err != 0) {
+ fprintf(stderr, "Couldn't initialize PCI system: %s\n",
+ strerror(err));
+ exit(1);
+ }
- /* Grab the graphics card */
- dev = pci_device_find_by_slot(0, 0, 2, 0);
- if (dev == NULL)
- errx(1, "Couldn't find graphics card");
+ /* Grab the graphics card */
+ dev = pci_device_find_by_slot(0, 0, 2, 0);
+ if (dev == NULL)
+ errx(1, "Couldn't find graphics card");
- err = pci_device_probe(dev);
- if (err != 0) {
- fprintf(stderr, "Couldn't probe graphics card: %s\n", strerror(err));
- exit(1);
- }
+ err = pci_device_probe(dev);
+ if (err != 0) {
+ fprintf(stderr, "Couldn't probe graphics card: %s\n",
+ strerror(err));
+ exit(1);
+ }
- if (dev->vendor_id != 0x8086)
- errx(1, "Graphics card is non-intel");
+ if (dev->vendor_id != 0x8086)
+ errx(1, "Graphics card is non-intel");
- pI830->PciInfo = dev;
+ pI830->PciInfo = dev;
- mmio_bar = IS_I9XX(pI830) ? 0 : 1;
+ mmio_bar = IS_I9XX(pI830) ? 0 : 1;
- err = pci_device_map_range (dev,
- dev->regions[mmio_bar].base_addr,
- dev->regions[mmio_bar].size,
- PCI_DEV_MAP_FLAG_WRITABLE,
- &mmio);
+ err = pci_device_map_range(dev,
+ dev->regions[mmio_bar].base_addr,
+ dev->regions[mmio_bar].size,
+ PCI_DEV_MAP_FLAG_WRITABLE, &mmio);
- if (err != 0) {
- fprintf(stderr, "Couldn't map MMIO region: %s\n", strerror(err));
- exit(1);
- }
- pI830->mmio = mmio;
+ if (err != 0) {
+ fprintf(stderr, "Couldn't map MMIO region: %s\n",
+ strerror(err));
+ exit(1);
+ }
+ pI830->mmio = mmio;
}
diff --git a/src/reg_dumper/xprintf.c b/src/reg_dumper/xprintf.c
index 125ae870..7b8ac997 100644
--- a/src/reg_dumper/xprintf.c
+++ b/src/reg_dumper/xprintf.c
@@ -28,33 +28,31 @@
#include <stdarg.h>
#include "reg_dumper.h"
-static char *
-XNFvprintf(const char *format, va_list va)
+static char *XNFvprintf(const char *format, va_list va)
{
- char *ret;
- int size;
- va_list va2;
+ char *ret;
+ int size;
+ va_list va2;
- va_copy(va2, va);
- size = vsnprintf(NULL, 0, format, va2);
- va_end(va2);
+ va_copy(va2, va);
+ size = vsnprintf(NULL, 0, format, va2);
+ va_end(va2);
- ret = (char *)malloc(size + 1);
- if (ret == NULL)
- return NULL;
+ ret = (char *)malloc(size + 1);
+ if (ret == NULL)
+ return NULL;
- vsnprintf(ret, size + 1, format, va);
- ret[size] = 0;
- return ret;
+ vsnprintf(ret, size + 1, format, va);
+ ret[size] = 0;
+ return ret;
}
-char *
-XNFprintf(const char *format, ...)
+char *XNFprintf(const char *format, ...)
{
- char *ret;
- va_list va;
- va_start(va, format);
- ret = XNFvprintf(format, va);
- va_end(va);
- return ret;
+ char *ret;
+ va_list va;
+ va_start(va, format);
+ ret = XNFvprintf(format, va);
+ va_end(va);
+ return ret;
}
diff --git a/src/xvmc/dri2.c b/src/xvmc/dri2.c
index f967432b..1ba94823 100644
--- a/src/xvmc/dri2.c
+++ b/src/xvmc/dri2.c
@@ -30,7 +30,6 @@
* Kristian Høgsberg (krh@redhat.com)
*/
-
#define NEED_REPLIES
#include <X11/Xlibint.h>
#include <X11/extensions/Xext.h>
@@ -41,261 +40,259 @@
static char dri2ExtensionName[] = DRI2_NAME;
static XExtensionInfo *dri2Info;
-static XEXT_GENERATE_CLOSE_DISPLAY (DRI2CloseDisplay, dri2Info)
+static XEXT_GENERATE_CLOSE_DISPLAY(DRI2CloseDisplay, dri2Info)
static /* const */ XExtensionHooks dri2ExtensionHooks = {
- NULL, /* create_gc */
- NULL, /* copy_gc */
- NULL, /* flush_gc */
- NULL, /* free_gc */
- NULL, /* create_font */
- NULL, /* free_font */
- DRI2CloseDisplay, /* close_display */
- NULL, /* wire_to_event */
- NULL, /* event_to_wire */
- NULL, /* error */
- NULL, /* error_string */
+ NULL, /* create_gc */
+ NULL, /* copy_gc */
+ NULL, /* flush_gc */
+ NULL, /* free_gc */
+ NULL, /* create_font */
+ NULL, /* free_font */
+ DRI2CloseDisplay, /* close_display */
+ NULL, /* wire_to_event */
+ NULL, /* event_to_wire */
+ NULL, /* error */
+ NULL, /* error_string */
};
-static XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay, dri2Info,
- dri2ExtensionName,
- &dri2ExtensionHooks,
- 0, NULL)
+static XEXT_GENERATE_FIND_DISPLAY(DRI2FindDisplay, dri2Info,
+ dri2ExtensionName,
+ &dri2ExtensionHooks, 0, NULL)
-Bool DRI2QueryExtension(Display *dpy, int *eventBase, int *errorBase)
+Bool DRI2QueryExtension(Display * dpy, int *eventBase, int *errorBase)
{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+ XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- if (XextHasExtension(info)) {
- *eventBase = info->codes->first_event;
- *errorBase = info->codes->first_error;
- return True;
- }
+ if (XextHasExtension(info)) {
+ *eventBase = info->codes->first_event;
+ *errorBase = info->codes->first_error;
+ return True;
+ }
- return False;
+ return False;
}
-Bool DRI2QueryVersion(Display *dpy, int *major, int *minor)
+Bool DRI2QueryVersion(Display * dpy, int *major, int *minor)
{
- XExtDisplayInfo *info = DRI2FindDisplay (dpy);
- xDRI2QueryVersionReply rep;
- xDRI2QueryVersionReq *req;
-
- XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
- LockDisplay(dpy);
- GetReq(DRI2QueryVersion, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2QueryVersion;
- req->majorVersion = DRI2_MAJOR;
- req->minorVersion = DRI2_MINOR;
- if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+ XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+ xDRI2QueryVersionReply rep;
+ xDRI2QueryVersionReq *req;
+
+ XextCheckExtension(dpy, info, dri2ExtensionName, False);
+
+ LockDisplay(dpy);
+ GetReq(DRI2QueryVersion, req);
+ req->reqType = info->codes->major_opcode;
+ req->dri2ReqType = X_DRI2QueryVersion;
+ req->majorVersion = DRI2_MAJOR;
+ req->minorVersion = DRI2_MINOR;
+ if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return False;
+ }
+ *major = rep.majorVersion;
+ *minor = rep.minorVersion;
UnlockDisplay(dpy);
SyncHandle();
- return False;
- }
- *major = rep.majorVersion;
- *minor = rep.minorVersion;
- UnlockDisplay(dpy);
- SyncHandle();
- return True;
+ return True;
}
-Bool DRI2Connect(Display *dpy, XID window,
+Bool DRI2Connect(Display * dpy, XID window,
char **driverName, char **deviceName)
{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2ConnectReply rep;
- xDRI2ConnectReq *req;
-
- XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
- LockDisplay(dpy);
- GetReq(DRI2Connect, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2Connect;
- req->window = window;
- req->driverType = DRI2DriverDRI;
- if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
- UnlockDisplay(dpy);
- SyncHandle();
- return False;
- }
+ XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+ xDRI2ConnectReply rep;
+ xDRI2ConnectReq *req;
+
+ XextCheckExtension(dpy, info, dri2ExtensionName, False);
+
+ LockDisplay(dpy);
+ GetReq(DRI2Connect, req);
+ req->reqType = info->codes->major_opcode;
+ req->dri2ReqType = X_DRI2Connect;
+ req->window = window;
+ req->driverType = DRI2DriverDRI;
+ if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return False;
+ }
+
+ if (rep.driverNameLength == 0 && rep.deviceNameLength == 0) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return False;
+ }
+
+ *driverName = Xmalloc(rep.driverNameLength + 1);
+ if (*driverName == NULL) {
+ _XEatData(dpy,
+ ((rep.driverNameLength + 3) & ~3) +
+ ((rep.deviceNameLength + 3) & ~3));
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return False;
+ }
+ _XReadPad(dpy, *driverName, rep.driverNameLength);
+ (*driverName)[rep.driverNameLength] = '\0';
+
+ *deviceName = Xmalloc(rep.deviceNameLength + 1);
+ if (*deviceName == NULL) {
+ Xfree(*driverName);
+ _XEatData(dpy, ((rep.deviceNameLength + 3) & ~3));
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return False;
+ }
+ _XReadPad(dpy, *deviceName, rep.deviceNameLength);
+ (*deviceName)[rep.deviceNameLength] = '\0';
- if (rep.driverNameLength == 0 && rep.deviceNameLength == 0) {
UnlockDisplay(dpy);
SyncHandle();
- return False;
- }
-
- *driverName = Xmalloc(rep.driverNameLength + 1);
- if (*driverName == NULL) {
- _XEatData(dpy,
- ((rep.driverNameLength + 3) & ~3) +
- ((rep.deviceNameLength + 3) & ~3));
- UnlockDisplay(dpy);
- SyncHandle();
- return False;
- }
- _XReadPad(dpy, *driverName, rep.driverNameLength);
- (*driverName)[rep.driverNameLength] = '\0';
-
- *deviceName = Xmalloc(rep.deviceNameLength + 1);
- if (*deviceName == NULL) {
- Xfree(*driverName);
- _XEatData(dpy, ((rep.deviceNameLength + 3) & ~3));
- UnlockDisplay(dpy);
- SyncHandle();
- return False;
- }
- _XReadPad(dpy, *deviceName, rep.deviceNameLength);
- (*deviceName)[rep.deviceNameLength] = '\0';
-
- UnlockDisplay(dpy);
- SyncHandle();
- return True;
+ return True;
}
-Bool DRI2Authenticate(Display *dpy, XID window, drm_magic_t magic)
+Bool DRI2Authenticate(Display * dpy, XID window, drm_magic_t magic)
{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2AuthenticateReq *req;
- xDRI2AuthenticateReply rep;
+ XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+ xDRI2AuthenticateReq *req;
+ xDRI2AuthenticateReply rep;
+
+ XextCheckExtension(dpy, info, dri2ExtensionName, False);
- XextCheckExtension (dpy, info, dri2ExtensionName, False);
+ LockDisplay(dpy);
+ GetReq(DRI2Authenticate, req);
+ req->reqType = info->codes->major_opcode;
+ req->dri2ReqType = X_DRI2Authenticate;
+ req->window = window;
+ req->magic = magic;
- LockDisplay(dpy);
- GetReq(DRI2Authenticate, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2Authenticate;
- req->window = window;
- req->magic = magic;
+ if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return False;
+ }
- if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
UnlockDisplay(dpy);
SyncHandle();
- return False;
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
- return rep.authenticated;
+ return rep.authenticated;
}
-void DRI2CreateDrawable(Display *dpy, XID drawable)
+void DRI2CreateDrawable(Display * dpy, XID drawable)
{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2CreateDrawableReq *req;
-
- XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
-
- LockDisplay(dpy);
- GetReq(DRI2CreateDrawable, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2CreateDrawable;
- req->drawable = drawable;
- UnlockDisplay(dpy);
- SyncHandle();
+ XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+ xDRI2CreateDrawableReq *req;
+
+ XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
+
+ LockDisplay(dpy);
+ GetReq(DRI2CreateDrawable, req);
+ req->reqType = info->codes->major_opcode;
+ req->dri2ReqType = X_DRI2CreateDrawable;
+ req->drawable = drawable;
+ UnlockDisplay(dpy);
+ SyncHandle();
}
-void DRI2DestroyDrawable(Display *dpy, XID drawable)
+void DRI2DestroyDrawable(Display * dpy, XID drawable)
{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2DestroyDrawableReq *req;
+ XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+ xDRI2DestroyDrawableReq *req;
- XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
+ XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
- XSync(dpy, False);
+ XSync(dpy, False);
- LockDisplay(dpy);
- GetReq(DRI2DestroyDrawable, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2DestroyDrawable;
- req->drawable = drawable;
- UnlockDisplay(dpy);
- SyncHandle();
+ LockDisplay(dpy);
+ GetReq(DRI2DestroyDrawable, req);
+ req->reqType = info->codes->major_opcode;
+ req->dri2ReqType = X_DRI2DestroyDrawable;
+ req->drawable = drawable;
+ UnlockDisplay(dpy);
+ SyncHandle();
}
-DRI2Buffer *DRI2GetBuffers(Display *dpy, XID drawable,
+DRI2Buffer *DRI2GetBuffers(Display * dpy, XID drawable,
int *width, int *height,
- unsigned int *attachments, int count,
- int *outCount)
+ unsigned int *attachments, int count, int *outCount)
{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2GetBuffersReply rep;
- xDRI2GetBuffersReq *req;
- DRI2Buffer *buffers;
- xDRI2Buffer repBuffer;
- CARD32 *p;
- int i;
-
- XextCheckExtension (dpy, info, dri2ExtensionName, False);
-
- LockDisplay(dpy);
- GetReqExtra(DRI2GetBuffers, count * 4, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2GetBuffers;
- req->drawable = drawable;
- req->count = count;
- p = (CARD32 *) &req[1];
- for (i = 0; i < count; i++)
- p[i] = attachments[i];
-
- if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
- UnlockDisplay(dpy);
- SyncHandle();
- return NULL;
- }
+ XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+ xDRI2GetBuffersReply rep;
+ xDRI2GetBuffersReq *req;
+ DRI2Buffer *buffers;
+ xDRI2Buffer repBuffer;
+ CARD32 *p;
+ int i;
+
+ XextCheckExtension(dpy, info, dri2ExtensionName, False);
+
+ LockDisplay(dpy);
+ GetReqExtra(DRI2GetBuffers, count * 4, req);
+ req->reqType = info->codes->major_opcode;
+ req->dri2ReqType = X_DRI2GetBuffers;
+ req->drawable = drawable;
+ req->count = count;
+ p = (CARD32 *) & req[1];
+ for (i = 0; i < count; i++)
+ p[i] = attachments[i];
+
+ if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return NULL;
+ }
+
+ *width = rep.width;
+ *height = rep.height;
+ *outCount = rep.count;
+
+ buffers = Xmalloc(rep.count * sizeof buffers[0]);
+ if (buffers == NULL) {
+ _XEatData(dpy, rep.count * sizeof repBuffer);
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return NULL;
+ }
+
+ for (i = 0; i < rep.count; i++) {
+ _XReadPad(dpy, (char *)&repBuffer, sizeof repBuffer);
+ buffers[i].attachment = repBuffer.attachment;
+ buffers[i].name = repBuffer.name;
+ buffers[i].pitch = repBuffer.pitch;
+ buffers[i].cpp = repBuffer.cpp;
+ buffers[i].flags = repBuffer.flags;
+ }
- *width = rep.width;
- *height = rep.height;
- *outCount = rep.count;
-
- buffers = Xmalloc(rep.count * sizeof buffers[0]);
- if (buffers == NULL) {
- _XEatData(dpy, rep.count * sizeof repBuffer);
UnlockDisplay(dpy);
SyncHandle();
- return NULL;
- }
-
- for (i = 0; i < rep.count; i++) {
- _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
- buffers[i].attachment = repBuffer.attachment;
- buffers[i].name = repBuffer.name;
- buffers[i].pitch = repBuffer.pitch;
- buffers[i].cpp = repBuffer.cpp;
- buffers[i].flags = repBuffer.flags;
- }
-
- UnlockDisplay(dpy);
- SyncHandle();
-
- return buffers;
+
+ return buffers;
}
-void DRI2CopyRegion(Display *dpy, XID drawable, XserverRegion region,
+void DRI2CopyRegion(Display * dpy, XID drawable, XserverRegion region,
CARD32 dest, CARD32 src)
{
- XExtDisplayInfo *info = DRI2FindDisplay(dpy);
- xDRI2CopyRegionReq *req;
- xDRI2CopyRegionReply rep;
+ XExtDisplayInfo *info = DRI2FindDisplay(dpy);
+ xDRI2CopyRegionReq *req;
+ xDRI2CopyRegionReply rep;
- XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
+ XextSimpleCheckExtension(dpy, info, dri2ExtensionName);
- LockDisplay(dpy);
- GetReq(DRI2CopyRegion, req);
- req->reqType = info->codes->major_opcode;
- req->dri2ReqType = X_DRI2CopyRegion;
- req->drawable = drawable;
- req->region = region;
- req->dest = dest;
- req->src = src;
+ LockDisplay(dpy);
+ GetReq(DRI2CopyRegion, req);
+ req->reqType = info->codes->major_opcode;
+ req->dri2ReqType = X_DRI2CopyRegion;
+ req->drawable = drawable;
+ req->region = region;
+ req->dest = dest;
+ req->src = src;
- _XReply(dpy, (xReply *)&rep, 0, xFalse);
+ _XReply(dpy, (xReply *) & rep, 0, xFalse);
- UnlockDisplay(dpy);
- SyncHandle();
+ UnlockDisplay(dpy);
+ SyncHandle();
}
diff --git a/src/xvmc/dri2.h b/src/xvmc/dri2.h
index 356c6bcb..ac6ce58d 100644
--- a/src/xvmc/dri2.h
+++ b/src/xvmc/dri2.h
@@ -37,34 +37,29 @@
#include <X11/extensions/dri2tokens.h>
typedef struct {
- unsigned int attachment;
- unsigned int name;
- unsigned int pitch;
- unsigned int cpp;
- unsigned int flags;
+ unsigned int attachment;
+ unsigned int name;
+ unsigned int pitch;
+ unsigned int cpp;
+ unsigned int flags;
} DRI2Buffer;
extern Bool
-DRI2QueryExtension(Display *display, int *eventBase, int *errorBase);
+DRI2QueryExtension(Display * display, int *eventBase, int *errorBase);
+extern Bool DRI2QueryVersion(Display * display, int *major, int *minor);
extern Bool
-DRI2QueryVersion(Display *display, int *major, int *minor);
-extern Bool
-DRI2Connect(Display *display, XID window,
+DRI2Connect(Display * display, XID window,
char **driverName, char **deviceName);
-extern Bool
-DRI2Authenticate(Display *display, XID window, drm_magic_t magic);
-extern void
-DRI2CreateDrawable(Display *display, XID drawable);
-extern void
-DRI2DestroyDrawable(Display *display, XID handle);
-extern DRI2Buffer *
-DRI2GetBuffers(Display *dpy, XID drawable,
- int *width, int *height,
- unsigned int *attachments, int count,
- int *outCount);
+extern Bool DRI2Authenticate(Display * display, XID window, drm_magic_t magic);
+extern void DRI2CreateDrawable(Display * display, XID drawable);
+extern void DRI2DestroyDrawable(Display * display, XID handle);
+extern DRI2Buffer *DRI2GetBuffers(Display * dpy, XID drawable,
+ int *width, int *height,
+ unsigned int *attachments, int count,
+ int *outCount);
extern void
-DRI2CopyRegion(Display *dpy, XID drawable, XserverRegion region,
+DRI2CopyRegion(Display * dpy, XID drawable, XserverRegion region,
CARD32 dest, CARD32 src);
#endif
diff --git a/src/xvmc/i915_program.h b/src/xvmc/i915_program.h
index 82c920e0..da315437 100644
--- a/src/xvmc/i915_program.h
+++ b/src/xvmc/i915_program.h
@@ -1,33 +1,33 @@
#ifndef _I915_PROGRAM_H
#define _I915_PROGRAM_H
-#define REG_TYPE_R 0 /* temporary regs, no need to
- * dcl, must be written before
- * read -- Preserved between
- * phases.
- */
-#define REG_TYPE_T 1 /* Interpolated values, must be
- * dcl'ed before use.
- *
- * 0..7: texture coord,
- * 8: diffuse spec,
- * 9: specular color,
- * 10: fog parameter in w.
- */
-#define REG_TYPE_CONST 2 /* Restriction: only one const
- * can be referenced per
- * instruction, though it may be
- * selected for multiple inputs.
- * Constants not initialized
- * default to zero.
- */
-#define REG_TYPE_S 3 /* sampler */
-#define REG_TYPE_OC 4 /* output color (rgba) */
-#define REG_TYPE_OD 5 /* output depth (w), xyz are
- * temporaries. If not written,
- * interpolated depth is used?
- */
-#define REG_TYPE_U 6 /* unpreserved temporaries */
+#define REG_TYPE_R 0 /* temporary regs, no need to
+ * dcl, must be written before
+ * read -- Preserved between
+ * phases.
+ */
+#define REG_TYPE_T 1 /* Interpolated values, must be
+ * dcl'ed before use.
+ *
+ * 0..7: texture coord,
+ * 8: diffuse spec,
+ * 9: specular color,
+ * 10: fog parameter in w.
+ */
+#define REG_TYPE_CONST 2 /* Restriction: only one const
+ * can be referenced per
+ * instruction, though it may be
+ * selected for multiple inputs.
+ * Constants not initialized
+ * default to zero.
+ */
+#define REG_TYPE_S 3 /* sampler */
+#define REG_TYPE_OC 4 /* output color (rgba) */
+#define REG_TYPE_OD 5 /* output depth (w), xyz are
+ * temporaries. If not written,
+ * interpolated depth is used?
+ */
+#define REG_TYPE_U 6 /* unpreserved temporaries */
#define REG_TYPE_MASK 0x7
#define REG_NR_MASK 0xf
@@ -43,34 +43,34 @@
#define T_TEX7 7
#define T_DIFFUSE 8
#define T_SPECULAR 9
-#define T_FOG_W 10 /* interpolated fog is in W coord */
+#define T_FOG_W 10 /* interpolated fog is in W coord */
/* Arithmetic instructions */
/* .replicate_swizzle == selection and replication of a particular
* scalar channel, ie., .xxxx, .yyyy, .zzzz or .wwww
*/
-#define A0_NOP (0x0<<24) /* no operation */
-#define A0_ADD (0x1<<24) /* dst = src0 + src1 */
-#define A0_MOV (0x2<<24) /* dst = src0 */
-#define A0_MUL (0x3<<24) /* dst = src0 * src1 */
-#define A0_MAD (0x4<<24) /* dst = src0 * src1 + src2 */
-#define A0_DP2ADD (0x5<<24) /* dst.xyzw = src0.xy dot src1.xy + src2.replicate_swizzle */
-#define A0_DP3 (0x6<<24) /* dst.xyzw = src0.xyz dot src1.xyz */
-#define A0_DP4 (0x7<<24) /* dst.xyzw = src0.xyzw dot src1.xyzw */
-#define A0_FRC (0x8<<24) /* dst = src0 - floor(src0) */
-#define A0_RCP (0x9<<24) /* dst.xyzw = 1/(src0.replicate_swizzle) */
-#define A0_RSQ (0xa<<24) /* dst.xyzw = 1/(sqrt(abs(src0.replicate_swizzle))) */
-#define A0_EXP (0xb<<24) /* dst.xyzw = exp2(src0.replicate_swizzle) */
-#define A0_LOG (0xc<<24) /* dst.xyzw = log2(abs(src0.replicate_swizzle)) */
-#define A0_CMP (0xd<<24) /* dst = (src0 >= 0.0) ? src1 : src2 */
-#define A0_MIN (0xe<<24) /* dst = (src0 < src1) ? src0 : src1 */
-#define A0_MAX (0xf<<24) /* dst = (src0 >= src1) ? src0 : src1 */
-#define A0_FLR (0x10<<24) /* dst = floor(src0) */
-#define A0_MOD (0x11<<24) /* dst = src0 fmod 1.0 */
-#define A0_TRC (0x12<<24) /* dst = int(src0) */
-#define A0_SGE (0x13<<24) /* dst = src0 >= src1 ? 1.0 : 0.0 */
-#define A0_SLT (0x14<<24) /* dst = src0 < src1 ? 1.0 : 0.0 */
+#define A0_NOP (0x0<<24) /* no operation */
+#define A0_ADD (0x1<<24) /* dst = src0 + src1 */
+#define A0_MOV (0x2<<24) /* dst = src0 */
+#define A0_MUL (0x3<<24) /* dst = src0 * src1 */
+#define A0_MAD (0x4<<24) /* dst = src0 * src1 + src2 */
+#define A0_DP2ADD (0x5<<24) /* dst.xyzw = src0.xy dot src1.xy + src2.replicate_swizzle */
+#define A0_DP3 (0x6<<24) /* dst.xyzw = src0.xyz dot src1.xyz */
+#define A0_DP4 (0x7<<24) /* dst.xyzw = src0.xyzw dot src1.xyzw */
+#define A0_FRC (0x8<<24) /* dst = src0 - floor(src0) */
+#define A0_RCP (0x9<<24) /* dst.xyzw = 1/(src0.replicate_swizzle) */
+#define A0_RSQ (0xa<<24) /* dst.xyzw = 1/(sqrt(abs(src0.replicate_swizzle))) */
+#define A0_EXP (0xb<<24) /* dst.xyzw = exp2(src0.replicate_swizzle) */
+#define A0_LOG (0xc<<24) /* dst.xyzw = log2(abs(src0.replicate_swizzle)) */
+#define A0_CMP (0xd<<24) /* dst = (src0 >= 0.0) ? src1 : src2 */
+#define A0_MIN (0xe<<24) /* dst = (src0 < src1) ? src0 : src1 */
+#define A0_MAX (0xf<<24) /* dst = (src0 >= src1) ? src0 : src1 */
+#define A0_FLR (0x10<<24) /* dst = floor(src0) */
+#define A0_MOD (0x11<<24) /* dst = src0 fmod 1.0 */
+#define A0_TRC (0x12<<24) /* dst = int(src0) */
+#define A0_SGE (0x13<<24) /* dst = src0 >= src1 ? 1.0 : 0.0 */
+#define A0_SLT (0x14<<24) /* dst = src0 < src1 ? 1.0 : 0.0 */
#define A0_DEST_SATURATE (1<<22)
#define A0_DEST_TYPE_SHIFT 19
/* Allow: R, OC, OD, U */
@@ -126,9 +126,9 @@
#define A2_SRC2_CHANNEL_W_SHIFT 0
/* Declaration instructions */
-#define D0_DCL (0x19<<24) /* Declare a t (interpolated attrib)
- * register or an s (sampler)
- * register. */
+#define D0_DCL (0x19<<24) /* Declare a t (interpolated attrib)
+ * register or an s (sampler)
+ * register. */
#define D0_SAMPLE_TYPE_SHIFT 22
#define D0_SAMPLE_TYPE_2D (0x0<<22)
#define D0_SAMPLE_TYPE_CUBE (0x1<<22)
@@ -160,23 +160,23 @@
#define D2_MBZ 0
/* Texture instructions */
-#define T0_TEXLD (0x15<<24) /* Sample texture using predeclared
- * sampler and address, and output
- * filtered texel data to destination
- * register */
-#define T0_TEXLDP (0x16<<24) /* Same as texld but performs a
- * perspective divide of the texture
- * coordinate .xyz values by .w before
- * sampling. */
-#define T0_TEXLDB (0x17<<24) /* Same as texld but biases the
- * computed LOD by w. Only S4.6 two's
- * comp is used. This implies that a
- * float to fixed conversion is
- * done. */
-#define T0_TEXKILL (0x18<<24) /* Does not perform a sampling
- * operation. Simply kills the pixel
- * if any channel of the address
- * register is < 0.0. */
+#define T0_TEXLD (0x15<<24) /* Sample texture using predeclared
+ * sampler and address, and output
+ * filtered texel data to destination
+ * register */
+#define T0_TEXLDP (0x16<<24) /* Same as texld but performs a
+ * perspective divide of the texture
+ * coordinate .xyz values by .w before
+ * sampling. */
+#define T0_TEXLDB (0x17<<24) /* Same as texld but biases the
+ * computed LOD by w. Only S4.6 two's
+ * comp is used. This implies that a
+ * float to fixed conversion is
+ * done. */
+#define T0_TEXKILL (0x18<<24) /* Does not perform a sampling
+ * operation. Simply kills the pixel
+ * if any channel of the address
+ * register is < 0.0. */
#define T0_DEST_TYPE_SHIFT 19
/* Allow: R, OC, OD, U */
/* Note: U (unpreserved) regs do not retain their values between
@@ -188,15 +188,14 @@
*/
#define T0_DEST_NR_SHIFT 14
/* Allow R: 0..15, OC,OD: 0..0, U: 0..2 */
-#define T0_SAMPLER_NR_SHIFT 0 /* This field ignored for TEXKILL */
+#define T0_SAMPLER_NR_SHIFT 0 /* This field ignored for TEXKILL */
#define T0_SAMPLER_NR_MASK (0xf<<0)
-#define T1_ADDRESS_REG_TYPE_SHIFT 24 /* Reg to use as texture coord */
+#define T1_ADDRESS_REG_TYPE_SHIFT 24 /* Reg to use as texture coord */
/* Allow R, T, OC, OD -- R, OC, OD are 'dependent' reads, new program phase */
#define T1_ADDRESS_REG_NR_SHIFT 17
#define T2_MBZ 0
-
/* Having zero and one in here makes the definition of swizzle a lot
* easier.
*/
@@ -215,7 +214,7 @@
#define UREG_CHANNEL_ONE_NEGATE_MBZ 1
#define UREG_CHANNEL_ONE_SHIFT 0
-#define UREG_BAD 0xffffffff /* not a valid ureg */
+#define UREG_BAD 0xffffffff /* not a valid ureg */
#define X SRC_X
#define Y SRC_Y
@@ -258,7 +257,6 @@
#define T1_ADDRESS_REG( reg ) ((GET_UREG_NR(reg) << T1_ADDRESS_REG_NR_SHIFT) | \
(GET_UREG_TYPE(reg) << T1_ADDRESS_REG_TYPE_SHIFT))
-
/* Macros for translating UREG's into the various register fields used
* by the I915 programmable unit.
*/
diff --git a/src/xvmc/i915_structs.h b/src/xvmc/i915_structs.h
index b5185cb7..f9e67477 100644
--- a/src/xvmc/i915_structs.h
+++ b/src/xvmc/i915_structs.h
@@ -35,53 +35,51 @@
#define OPC_MI_FLUSH (0x04)
-struct i915_mi_flush
-{
- struct {
- unsigned map_cache_invalidate : 1;
- unsigned pad0 : 1;
- unsigned render_cache_flush_inhibit : 1;
- unsigned scene_count : 1;
- unsigned end_scene : 1;
- unsigned pad1 : 18;
- unsigned opcode : 6;
- unsigned type : 3;
- } dw0;
+struct i915_mi_flush {
+ struct {
+ unsigned map_cache_invalidate:1;
+ unsigned pad0:1;
+ unsigned render_cache_flush_inhibit:1;
+ unsigned scene_count:1;
+ unsigned end_scene:1;
+ unsigned pad1:18;
+ unsigned opcode:6;
+ unsigned type:3;
+ } dw0;
};
/* BLT */
#define CMD_2D 0x02
#define OPC_COLOR_BLT (0x40)
-struct i915_color_blt
-{
- struct {
- unsigned length : 5;
- unsigned pad0 : 15;
- unsigned bpp_mask : 2;
- unsigned opcode : 7;
- unsigned type : 3;
- } dw0;
-
- struct {
- unsigned pitch : 16;
- unsigned rop : 8;
- unsigned color_depth : 2;
- unsigned pad0 : 6;
- } dw1;
-
- struct {
- unsigned width : 16;
- unsigned height : 16;
- } dw2;
-
- struct {
- unsigned address;
- } dw3;
-
- struct {
- unsigned pattern;
- } dw4;
+struct i915_color_blt {
+ struct {
+ unsigned length:5;
+ unsigned pad0:15;
+ unsigned bpp_mask:2;
+ unsigned opcode:7;
+ unsigned type:3;
+ } dw0;
+
+ struct {
+ unsigned pitch:16;
+ unsigned rop:8;
+ unsigned color_depth:2;
+ unsigned pad0:6;
+ } dw1;
+
+ struct {
+ unsigned width:16;
+ unsigned height:16;
+ } dw2;
+
+ struct {
+ unsigned address;
+ } dw3;
+
+ struct {
+ unsigned pattern;
+ } dw4;
};
/* 3D_INSTRUCTION */
@@ -89,7 +87,7 @@ struct i915_color_blt
#define OPC_3DMPEG_MACROBLOCK_IPICTURE (0x01 + (0x1e << 5))
#define OPC_3DMPEG_SET_ORIGIN (0x10 + (0x1e << 5))
-#define OPC_3DMPEG_MACROBLOCK (0x11 + (0x1e << 5))
+#define OPC_3DMPEG_MACROBLOCK (0x11 + (0x1e << 5))
#define OPC_3DMPEG_SLICE (0x12 + (0x1e << 5))
#define OPC_3DMPEG_QM_PALETTE_LOAD (0x13 + (0x1e << 5))
@@ -115,129 +113,119 @@ struct i915_color_blt
/*
* 3DMPEG instructions
*/
-struct i915_3dmpeg_macroblock_header
-{
- struct {
- unsigned length : 19;
- unsigned opcode : 10;
- unsigned type : 3;
- } dw0;
-
- struct {
- unsigned mb_intra : 1;
- unsigned forward : 1;
- unsigned backward : 1;
- unsigned h263_4mv : 1;
- unsigned pad0 : 1;
- unsigned dct_type : 1;
- unsigned pad1 : 2;
- unsigned motion_type : 2;
- unsigned pad2 : 2;
- unsigned vertical_field_select : 4;
- unsigned coded_block_pattern : 6;
- unsigned pad3 : 2;
- unsigned skipped_macroblocks : 7;
- unsigned pad4 : 1;
- } dw1;
+struct i915_3dmpeg_macroblock_header {
+ struct {
+ unsigned length:19;
+ unsigned opcode:10;
+ unsigned type:3;
+ } dw0;
+
+ struct {
+ unsigned mb_intra:1;
+ unsigned forward:1;
+ unsigned backward:1;
+ unsigned h263_4mv:1;
+ unsigned pad0:1;
+ unsigned dct_type:1;
+ unsigned pad1:2;
+ unsigned motion_type:2;
+ unsigned pad2:2;
+ unsigned vertical_field_select:4;
+ unsigned coded_block_pattern:6;
+ unsigned pad3:2;
+ unsigned skipped_macroblocks:7;
+ unsigned pad4:1;
+ } dw1;
+};
+
+struct i915_3dmpeg_macroblock_0mv {
+ struct i915_3dmpeg_macroblock_header header;
+};
+
+struct i915_3dmpeg_macroblock_1fbmv {
+ struct i915_3dmpeg_macroblock_header header;
+ unsigned dw2;
+ unsigned dw3;
+};
+struct i915_3dmpeg_macroblock_2fbmv {
+ struct i915_3dmpeg_macroblock_header header;
+ unsigned dw2;
+ unsigned dw3;
+ unsigned dw4;
+ unsigned dw5;
+};
+
+struct i915_3dmpeg_macroblock_5fmv {
+ struct i915_3dmpeg_macroblock_header header;
+ unsigned dw2;
+ unsigned dw3;
+ unsigned dw4;
+ unsigned dw5;
+ unsigned dw6;
+};
+
+struct i915_3dmpeg_macroblock_ipicture {
+ struct {
+ unsigned pad0:5;
+ unsigned dct_type:1;
+ unsigned pad1:13;
+ unsigned opcode:10;
+ unsigned type:3;
+ } dw0;
+};
+
+struct i915_3dmpeg_set_origin {
+ struct {
+ unsigned length:19;
+ unsigned opcode:10;
+ unsigned type:3;
+ } dw0;
+
+ struct {
+ unsigned v_origin:7;
+ unsigned pad0:1;
+ unsigned h_origin:7;
+ unsigned pad1:17;
+ } dw1;
+};
+
+struct i915_3dmpeg_slice {
+ struct {
+ unsigned length:19;
+ unsigned opcode:10;
+ unsigned type:3;
+ } dw0;
+
+ struct {
+ unsigned fst_mb_bit_off:3;
+ unsigned pad0:5;
+ unsigned mb_count:7;
+ unsigned pad1:1;
+ unsigned v_position:7;
+ unsigned pad2:1;
+ unsigned h_position:7;
+ unsigned pad3:1;
+ } dw1;
+
+ struct {
+ unsigned length_minus_one:17;
+ unsigned pad0:7;
+ unsigned qt_scale_code:5;
+ unsigned pad1:3;
+ } dw2;
+};
+
+struct i915_3dmpeg_qm_palette_load {
+ struct {
+ unsigned length:4;
+ unsigned pad0:15;
+ unsigned opcode:10;
+ unsigned type:3;
+ } dw0;
+
+ unsigned quantmatrix[16];
};
-struct i915_3dmpeg_macroblock_0mv
-{
- struct i915_3dmpeg_macroblock_header header;
-};
-
-struct i915_3dmpeg_macroblock_1fbmv
-{
- struct i915_3dmpeg_macroblock_header header;
- unsigned dw2;
- unsigned dw3;
-};
-struct i915_3dmpeg_macroblock_2fbmv
-{
- struct i915_3dmpeg_macroblock_header header;
- unsigned dw2;
- unsigned dw3;
- unsigned dw4;
- unsigned dw5;
-};
-
-struct i915_3dmpeg_macroblock_5fmv
-{
- struct i915_3dmpeg_macroblock_header header;
- unsigned dw2;
- unsigned dw3;
- unsigned dw4;
- unsigned dw5;
- unsigned dw6;
-};
-
-struct i915_3dmpeg_macroblock_ipicture
-{
- struct {
- unsigned pad0 : 5;
- unsigned dct_type : 1;
- unsigned pad1 : 13;
- unsigned opcode : 10;
- unsigned type : 3;
- } dw0;
-};
-
-struct i915_3dmpeg_set_origin
-{
- struct {
- unsigned length : 19;
- unsigned opcode : 10;
- unsigned type : 3;
- } dw0;
-
- struct {
- unsigned v_origin : 7;
- unsigned pad0 : 1;
- unsigned h_origin : 7;
- unsigned pad1 : 17;
- } dw1;
-};
-
-struct i915_3dmpeg_slice
-{
- struct {
- unsigned length : 19;
- unsigned opcode : 10;
- unsigned type : 3;
- } dw0;
-
- struct {
- unsigned fst_mb_bit_off : 3;
- unsigned pad0 : 5;
- unsigned mb_count : 7;
- unsigned pad1 : 1;
- unsigned v_position : 7;
- unsigned pad2 : 1;
- unsigned h_position : 7;
- unsigned pad3 : 1;
- } dw1;
-
- struct {
- unsigned length_minus_one : 17;
- unsigned pad0 : 7;
- unsigned qt_scale_code : 5;
- unsigned pad1 : 3;
- } dw2;
-};
-
-struct i915_3dmpeg_qm_palette_load
-{
- struct {
- unsigned length : 4;
- unsigned pad0 : 15;
- unsigned opcode : 10;
- unsigned type : 3;
- } dw0;
-
- unsigned quantmatrix[16];
-};
-
-
/*
* 3DSTATE instruction
*/
@@ -249,31 +237,30 @@ struct i915_3dmpeg_qm_palette_load
#define TILEWALK_XMAJOR 0
#define TILEWALK_YMAJOR 1
-struct i915_3dstate_buffer_info
-{
- struct {
- unsigned length : 16;
- unsigned opcode : 13;
- unsigned type : 3;
- } dw0;
-
- struct {
- unsigned pad0 : 2;
- unsigned pitch : 12;
- unsigned pad1 : 7;
- unsigned walk : 1;
- unsigned tiled_surface : 1;
- unsigned fence_regs : 1;
- unsigned buffer_id : 4;
- unsigned aux_id : 1;
- unsigned pad2 : 3;
- } dw1;
-
- struct {
- unsigned pad0 : 2;
- unsigned base_address : 27;
- unsigned pad1 : 3;
- } dw2;
+struct i915_3dstate_buffer_info {
+ struct {
+ unsigned length:16;
+ unsigned opcode:13;
+ unsigned type:3;
+ } dw0;
+
+ struct {
+ unsigned pad0:2;
+ unsigned pitch:12;
+ unsigned pad1:7;
+ unsigned walk:1;
+ unsigned tiled_surface:1;
+ unsigned fence_regs:1;
+ unsigned buffer_id:4;
+ unsigned aux_id:1;
+ unsigned pad2:3;
+ } dw1;
+
+ struct {
+ unsigned pad0:2;
+ unsigned base_address:27;
+ unsigned pad1:3;
+ } dw2;
};
#define COLORBUFFER_8BIT 0x00
@@ -288,33 +275,31 @@ struct i915_3dstate_buffer_info
#define COLORBUFFER_A1R5G5B5 0x09
#define COLORBUFFER_A2R10G10B10 0x0a
-
-struct i915_3dstate_dest_buffer_variables
-{
- struct {
- unsigned length : 16;
- unsigned opcode : 13;
- unsigned type : 3;
- } dw0;
-
- struct {
- unsigned v_ls_offset : 1;
- unsigned v_ls : 1;
- unsigned depth_fmt : 2;
- unsigned pad0 : 4;
- unsigned color_fmt : 4;
- unsigned yuv422_select : 3;
- unsigned pad1 : 1;
- unsigned dest_v_bias : 4;
- unsigned dest_h_bias : 4;
- unsigned dither_enhancement : 1;
- unsigned linear_gamma : 1;
- unsigned dither_pattern : 2;
- unsigned lod_preclamp : 1;
- unsigned edt_zone : 1; /* early depth test in zone rendering */
- unsigned texture_default_color : 1;
- unsigned edt_classic : 1; /* early depth test in classic mode */
- } dw1;
+struct i915_3dstate_dest_buffer_variables {
+ struct {
+ unsigned length:16;
+ unsigned opcode:13;
+ unsigned type:3;
+ } dw0;
+
+ struct {
+ unsigned v_ls_offset:1;
+ unsigned v_ls:1;
+ unsigned depth_fmt:2;
+ unsigned pad0:4;
+ unsigned color_fmt:4;
+ unsigned yuv422_select:3;
+ unsigned pad1:1;
+ unsigned dest_v_bias:4;
+ unsigned dest_h_bias:4;
+ unsigned dither_enhancement:1;
+ unsigned linear_gamma:1;
+ unsigned dither_pattern:2;
+ unsigned lod_preclamp:1;
+ unsigned edt_zone:1; /* early depth test in zone rendering */
+ unsigned texture_default_color:1;
+ unsigned edt_classic:1; /* early depth test in classic mode */
+ } dw1;
};
#define MPEG_DECODE_MC 0
@@ -331,56 +316,55 @@ struct i915_3dstate_dest_buffer_variables
#define MC_SUB_1V 0
#define MC_SUB_2V 1
-struct i915_3dstate_dest_buffer_variables_mpeg
-{
- struct {
- unsigned length : 16;
- unsigned opcode : 13;
- unsigned type : 3;
- } dw0;
-
- struct {
- unsigned picture_width : 7;
- unsigned pad0 : 1;
- unsigned v_subsample_factor : 2;
- unsigned h_subsample_factor : 2;
- unsigned tff : 1;
- unsigned mismatch : 1;
- unsigned pad1 : 1;
- unsigned intra8 : 1;
- unsigned abort_on_error : 8;
- unsigned pad2 : 4;
- unsigned bidir_avrg_control : 1;
- unsigned rcontrol : 1;
- unsigned decode_mode : 2;
- } dw1;
-
- struct {
- unsigned pad0 : 1;
- unsigned picture_coding_type : 2;
- unsigned pad1 : 2;
- unsigned scan_order : 1;
- unsigned pad2 : 2;
- unsigned q_scale_type : 1;
- unsigned concealment : 1;
- unsigned fpf_dct : 1;
- unsigned pad3 : 2;
- unsigned intra_dc : 2;
- unsigned intra_vlc : 1;
- unsigned f_code00 : 4;
- unsigned f_code01 : 4;
- unsigned f_code10 : 4;
- unsigned f_code11 : 4;
- } dw2;
+struct i915_3dstate_dest_buffer_variables_mpeg {
+ struct {
+ unsigned length:16;
+ unsigned opcode:13;
+ unsigned type:3;
+ } dw0;
+
+ struct {
+ unsigned picture_width:7;
+ unsigned pad0:1;
+ unsigned v_subsample_factor:2;
+ unsigned h_subsample_factor:2;
+ unsigned tff:1;
+ unsigned mismatch:1;
+ unsigned pad1:1;
+ unsigned intra8:1;
+ unsigned abort_on_error:8;
+ unsigned pad2:4;
+ unsigned bidir_avrg_control:1;
+ unsigned rcontrol:1;
+ unsigned decode_mode:2;
+ } dw1;
+
+ struct {
+ unsigned pad0:1;
+ unsigned picture_coding_type:2;
+ unsigned pad1:2;
+ unsigned scan_order:1;
+ unsigned pad2:2;
+ unsigned q_scale_type:1;
+ unsigned concealment:1;
+ unsigned fpf_dct:1;
+ unsigned pad3:2;
+ unsigned intra_dc:2;
+ unsigned intra_vlc:1;
+ unsigned f_code00:4;
+ unsigned f_code01:4;
+ unsigned f_code10:4;
+ unsigned f_code11:4;
+ } dw2;
};
struct i915_mc_static_indirect_state_buffer {
- struct i915_3dstate_buffer_info dest_y;
- struct i915_3dstate_buffer_info dest_u;
- struct i915_3dstate_buffer_info dest_v;
- struct i915_3dstate_dest_buffer_variables dest_buf;
- struct i915_3dstate_dest_buffer_variables_mpeg dest_buf_mpeg;
- struct i915_3dstate_buffer_info corr;
+ struct i915_3dstate_buffer_info dest_y;
+ struct i915_3dstate_buffer_info dest_u;
+ struct i915_3dstate_buffer_info dest_v;
+ struct i915_3dstate_dest_buffer_variables dest_buf;
+ struct i915_3dstate_dest_buffer_variables_mpeg dest_buf_mpeg;
+ struct i915_3dstate_buffer_info corr;
};
#define MAP_MAP0 0x0001
@@ -400,61 +384,59 @@ struct i915_mc_static_indirect_state_buffer {
#define MAP_MAP14 0x4000
#define MAP_MAP15 0x8000
-struct texture_map
-{
- struct {
- unsigned v_ls_offset : 1;
- unsigned v_ls : 1;
- unsigned base_address : 27;
- unsigned pad0 : 2;
- unsigned untrusted : 1;
- } tm0;
-
- struct {
- unsigned tile_walk : 1;
- unsigned tiled_surface : 1;
- unsigned utilize_fence_regs : 1;
- unsigned texel_fmt : 4;
- unsigned surface_fmt : 3;
- unsigned width : 11;
- unsigned height : 11;
- } tm1;
-
- struct {
- unsigned depth : 8;
- unsigned mipmap_layout : 1;
- unsigned max_lod : 6;
- unsigned cube_face : 6;
- unsigned pitch : 11;
- } tm2;
-};
-
-struct i915_3dstate_map_state
-{
- struct {
- unsigned length : 6;
- unsigned pad0 : 9;
- unsigned retain : 1;
- unsigned opcode : 13;
- unsigned type : 3;
- } dw0;
-
- struct {
- unsigned map_mask : 16;
- unsigned pad0 : 16;
- } dw1;
+struct texture_map {
+ struct {
+ unsigned v_ls_offset:1;
+ unsigned v_ls:1;
+ unsigned base_address:27;
+ unsigned pad0:2;
+ unsigned untrusted:1;
+ } tm0;
+
+ struct {
+ unsigned tile_walk:1;
+ unsigned tiled_surface:1;
+ unsigned utilize_fence_regs:1;
+ unsigned texel_fmt:4;
+ unsigned surface_fmt:3;
+ unsigned width:11;
+ unsigned height:11;
+ } tm1;
+
+ struct {
+ unsigned depth:8;
+ unsigned mipmap_layout:1;
+ unsigned max_lod:6;
+ unsigned cube_face:6;
+ unsigned pitch:11;
+ } tm2;
+};
+
+struct i915_3dstate_map_state {
+ struct {
+ unsigned length:6;
+ unsigned pad0:9;
+ unsigned retain:1;
+ unsigned opcode:13;
+ unsigned type:3;
+ } dw0;
+
+ struct {
+ unsigned map_mask:16;
+ unsigned pad0:16;
+ } dw1;
};
struct i915_mc_map_state {
- struct i915_3dstate_map_state y_map;
- struct texture_map y_forward;
- struct texture_map y_backward;
- struct i915_3dstate_map_state u_map;
- struct texture_map u_forward;
- struct texture_map u_backward;
- struct i915_3dstate_map_state v_map;
- struct texture_map v_forward;
- struct texture_map v_backward;
+ struct i915_3dstate_map_state y_map;
+ struct texture_map y_forward;
+ struct texture_map y_backward;
+ struct i915_3dstate_map_state u_map;
+ struct texture_map u_forward;
+ struct texture_map u_backward;
+ struct i915_3dstate_map_state v_map;
+ struct texture_map v_forward;
+ struct texture_map v_backward;
};
#define SAMPLER_SAMPLER0 0x0001
@@ -505,209 +487,202 @@ struct i915_mc_map_state {
#define TEXCOORDMODE_CLAMP_BORDER 4
#define TEXCOORDMODE_MIRROR_ONCE 5
-struct texture_sampler
-{
- struct {
- unsigned shadow_function : 3;
- unsigned max_anisotropy : 1;
- unsigned shadow_enable : 1;
- unsigned lod_bias : 9;
- unsigned min_filter : 3;
- unsigned mag_filter : 3;
- unsigned mip_filter : 2;
- unsigned base_level : 5;
- unsigned chromakey_index : 2;
- unsigned color_conversion : 1;
- unsigned planar2packet : 1;
- unsigned reverse_gamma : 1;
- } ts0;
-
- struct {
- unsigned east_deinterlacer : 1;
- unsigned map_index : 4;
- unsigned normalized_coor : 1;
- unsigned tcz_control : 3;
- unsigned tcy_control : 3;
- unsigned tcx_control : 3;
- unsigned chromakey_enable : 1;
- unsigned keyed_texture_filter : 1;
- unsigned kill_pixel : 1;
- unsigned pad0 : 6;
- unsigned min_lod : 8;
- } ts1;
-
- struct {
- unsigned default_color;
- } ts2;
-};
-
-struct i915_3dstate_sampler_state
-{
- struct {
- unsigned length : 6;
- unsigned pad0 : 10;
- unsigned opcode : 13;
- unsigned type : 3;
- } dw0;
-
- struct {
- unsigned sampler_masker : 16;
- unsigned pad0 : 16;
- } dw1;
- /* we always use two samplers for mc */
- struct texture_sampler sampler0;
- struct texture_sampler sampler1;
-};
-
-struct arithmetic_inst
-{
- struct {
- unsigned pad0 : 2;
- unsigned src0_reg : 5;
- unsigned src0_reg_t : 3;
- unsigned dest_channel_mask : 4;
- unsigned dest_reg : 4;
- unsigned pad1 : 1;
- unsigned dest_reg_t: 3;
- unsigned dest_saturate : 1;
- unsigned pad2 : 1;
- unsigned opcode : 5;
- unsigned pad3 : 3;
- } dw0;
-
- struct {
- unsigned src1_y_select : 3;
- unsigned src1_y_negate : 1;
- unsigned src1_x_select : 3;
- unsigned src1_x_negate : 1;
- unsigned src1_reg : 5;
- unsigned src1_reg_t : 3;
- unsigned src0_w_select : 3;
- unsigned src0_w_negate : 1;
- unsigned src0_z_select : 3;
- unsigned src0_z_negate : 1;
- unsigned src0_y_select : 3;
- unsigned src0_y_negate : 1;
- unsigned src0_x_select : 3;
- unsigned src0_x_negate : 1;
- } dw1;
-
- struct {
- unsigned src2_w_select : 3;
- unsigned src2_w_negate : 1;
- unsigned src2_z_select : 3;
- unsigned src2_z_negate : 1;
- unsigned src2_y_select : 3;
- unsigned src2_y_negate : 1;
- unsigned src2_x_select : 3;
- unsigned src2_x_negate : 1;
- unsigned src2_reg : 5;
- unsigned src2_reg_t : 3;
- unsigned src1_w_select : 3;
- unsigned src1_w_negate : 1;
- unsigned src1_z_select : 3;
- unsigned src1_z_negate : 1;
- } dw2;
-};
-
-struct texture_inst
-{
- struct {
- unsigned sampler_reg : 4;
- unsigned pad0 : 10;
- unsigned dest_reg : 4;
- unsigned pad1 : 1;
- unsigned dest_reg_t : 3;
- unsigned pad2 : 2;
- unsigned opcode : 5;
- unsigned pad3 : 3;
- } dw0;
-
- struct {
- unsigned pad0 : 16;
- unsigned address_reg : 5;
- unsigned pad1 : 3;
- unsigned address_reg_t : 3;
- unsigned pad2 : 5;
- } dw1;
-
- struct {
- unsigned pad0;
- } dw2;
-};
-
-struct declaration_inst
-{
- struct {
- unsigned pad0 : 10;
- unsigned decl_channel_mask : 4;
- unsigned decl_reg : 4;
- unsigned pad1 : 1;
- unsigned decl_reg_t : 2;
- unsigned pad2 : 1;
- unsigned sampler_type : 2;
- unsigned opcode : 5;
- unsigned pad3 : 3;
- } dw0;
-
- struct {
- unsigned pad0;
- } dw1;
-
- struct {
- unsigned pad0;
- } dw2;
-};
-
-union shader_inst
-{
- struct arithmetic_inst a;
- struct texture_inst t;
- struct declaration_inst d;
+struct texture_sampler {
+ struct {
+ unsigned shadow_function:3;
+ unsigned max_anisotropy:1;
+ unsigned shadow_enable:1;
+ unsigned lod_bias:9;
+ unsigned min_filter:3;
+ unsigned mag_filter:3;
+ unsigned mip_filter:2;
+ unsigned base_level:5;
+ unsigned chromakey_index:2;
+ unsigned color_conversion:1;
+ unsigned planar2packet:1;
+ unsigned reverse_gamma:1;
+ } ts0;
+
+ struct {
+ unsigned east_deinterlacer:1;
+ unsigned map_index:4;
+ unsigned normalized_coor:1;
+ unsigned tcz_control:3;
+ unsigned tcy_control:3;
+ unsigned tcx_control:3;
+ unsigned chromakey_enable:1;
+ unsigned keyed_texture_filter:1;
+ unsigned kill_pixel:1;
+ unsigned pad0:6;
+ unsigned min_lod:8;
+ } ts1;
+
+ struct {
+ unsigned default_color;
+ } ts2;
+};
+
+struct i915_3dstate_sampler_state {
+ struct {
+ unsigned length:6;
+ unsigned pad0:10;
+ unsigned opcode:13;
+ unsigned type:3;
+ } dw0;
+
+ struct {
+ unsigned sampler_masker:16;
+ unsigned pad0:16;
+ } dw1;
+ /* we always use two samplers for mc */
+ struct texture_sampler sampler0;
+ struct texture_sampler sampler1;
+};
+
+struct arithmetic_inst {
+ struct {
+ unsigned pad0:2;
+ unsigned src0_reg:5;
+ unsigned src0_reg_t:3;
+ unsigned dest_channel_mask:4;
+ unsigned dest_reg:4;
+ unsigned pad1:1;
+ unsigned dest_reg_t:3;
+ unsigned dest_saturate:1;
+ unsigned pad2:1;
+ unsigned opcode:5;
+ unsigned pad3:3;
+ } dw0;
+
+ struct {
+ unsigned src1_y_select:3;
+ unsigned src1_y_negate:1;
+ unsigned src1_x_select:3;
+ unsigned src1_x_negate:1;
+ unsigned src1_reg:5;
+ unsigned src1_reg_t:3;
+ unsigned src0_w_select:3;
+ unsigned src0_w_negate:1;
+ unsigned src0_z_select:3;
+ unsigned src0_z_negate:1;
+ unsigned src0_y_select:3;
+ unsigned src0_y_negate:1;
+ unsigned src0_x_select:3;
+ unsigned src0_x_negate:1;
+ } dw1;
+
+ struct {
+ unsigned src2_w_select:3;
+ unsigned src2_w_negate:1;
+ unsigned src2_z_select:3;
+ unsigned src2_z_negate:1;
+ unsigned src2_y_select:3;
+ unsigned src2_y_negate:1;
+ unsigned src2_x_select:3;
+ unsigned src2_x_negate:1;
+ unsigned src2_reg:5;
+ unsigned src2_reg_t:3;
+ unsigned src1_w_select:3;
+ unsigned src1_w_negate:1;
+ unsigned src1_z_select:3;
+ unsigned src1_z_negate:1;
+ } dw2;
+};
+
+struct texture_inst {
+ struct {
+ unsigned sampler_reg:4;
+ unsigned pad0:10;
+ unsigned dest_reg:4;
+ unsigned pad1:1;
+ unsigned dest_reg_t:3;
+ unsigned pad2:2;
+ unsigned opcode:5;
+ unsigned pad3:3;
+ } dw0;
+
+ struct {
+ unsigned pad0:16;
+ unsigned address_reg:5;
+ unsigned pad1:3;
+ unsigned address_reg_t:3;
+ unsigned pad2:5;
+ } dw1;
+
+ struct {
+ unsigned pad0;
+ } dw2;
+};
+
+struct declaration_inst {
+ struct {
+ unsigned pad0:10;
+ unsigned decl_channel_mask:4;
+ unsigned decl_reg:4;
+ unsigned pad1:1;
+ unsigned decl_reg_t:2;
+ unsigned pad2:1;
+ unsigned sampler_type:2;
+ unsigned opcode:5;
+ unsigned pad3:3;
+ } dw0;
+
+ struct {
+ unsigned pad0;
+ } dw1;
+
+ struct {
+ unsigned pad0;
+ } dw2;
+};
+
+union shader_inst {
+ struct arithmetic_inst a;
+ struct texture_inst t;
+ struct declaration_inst d;
};
struct i915_3dstate_pixel_shader_header {
- unsigned length : 9;
- unsigned pad0 : 6;
- unsigned retain : 1;
- unsigned opcode : 13;
- unsigned type : 3;
-};
-
-struct i915_3dstate_pixel_shader_program
-{
- struct i915_3dstate_pixel_shader_header shader0;
- /* mov oC, c0.0000 */
- uint32_t inst0[3];
-
- struct i915_3dstate_pixel_shader_header shader1;
- /* dcl t0.xy */
- /* dcl t1.xy */
- /* dcl_2D s0 */
- /* texld r0, t0, s0 */
- /* mov oC, r0 */
- uint32_t inst1[3*5];
-
- struct i915_3dstate_pixel_shader_header shader2;
- /* dcl t2.xy */
- /* dcl t3.xy */
- /* dcl_2D s1 */
- /* texld r0, t2, s1 */
- /* mov oC, r0 */
- uint32_t inst2[3*5];
-
- struct i915_3dstate_pixel_shader_header shader3;
- /* dcl t0.xy */
- /* dcl t1.xy */
- /* dcl t2.xy */
- /* dcl t3.xy */
- /* dcl_2D s0 */
- /* dcl_2D s1 */
- /* texld r0, t0, s0 */
- /* texld r0, t2, s1 */
- /* add r0, r0, r1*/
- /* mov oC, r0 */
- uint32_t inst3[3*10];
+ unsigned length:9;
+ unsigned pad0:6;
+ unsigned retain:1;
+ unsigned opcode:13;
+ unsigned type:3;
+};
+
+struct i915_3dstate_pixel_shader_program {
+ struct i915_3dstate_pixel_shader_header shader0;
+ /* mov oC, c0.0000 */
+ uint32_t inst0[3];
+
+ struct i915_3dstate_pixel_shader_header shader1;
+ /* dcl t0.xy */
+ /* dcl t1.xy */
+ /* dcl_2D s0 */
+ /* texld r0, t0, s0 */
+ /* mov oC, r0 */
+ uint32_t inst1[3 * 5];
+
+ struct i915_3dstate_pixel_shader_header shader2;
+ /* dcl t2.xy */
+ /* dcl t3.xy */
+ /* dcl_2D s1 */
+ /* texld r0, t2, s1 */
+ /* mov oC, r0 */
+ uint32_t inst2[3 * 5];
+
+ struct i915_3dstate_pixel_shader_header shader3;
+ /* dcl t0.xy */
+ /* dcl t1.xy */
+ /* dcl t2.xy */
+ /* dcl t3.xy */
+ /* dcl_2D s0 */
+ /* dcl_2D s1 */
+ /* texld r0, t0, s0 */
+ /* texld r0, t2, s1 */
+ /* add r0, r0, r1 */
+ /* mov oC, r0 */
+ uint32_t inst3[3 * 10];
};
#define REG_CR0 0x00000001
@@ -743,28 +718,26 @@ struct i915_3dstate_pixel_shader_program
#define REG_CR30 0x40000000
#define REG_CR31 0x80000000
-struct shader_constant
-{
- float x;
- float y;
- float z;
- float w;
+struct shader_constant {
+ float x;
+ float y;
+ float z;
+ float w;
};
-struct i915_3dstate_pixel_shader_constants
-{
- struct {
- unsigned length : 8;
- unsigned pad0 : 8;
- unsigned opcode : 13;
- unsigned type : 3;
- } dw0;
-
- struct {
- unsigned reg_mask;
- } dw1;
- /* we only need one constant */
- struct shader_constant value;
+struct i915_3dstate_pixel_shader_constants {
+ struct {
+ unsigned length:8;
+ unsigned pad0:8;
+ unsigned opcode:13;
+ unsigned type:3;
+ } dw0;
+
+ struct {
+ unsigned reg_mask;
+ } dw1;
+ /* we only need one constant */
+ struct shader_constant value;
};
#define BLOCK_SIS 0x01
@@ -774,39 +747,36 @@ struct i915_3dstate_pixel_shader_constants
#define BLOCK_PSP 0x10
#define BLOCK_PSC 0x20
-typedef struct _state_ddword
-{
- struct {
- unsigned valid : 1;
- unsigned force : 1;
- unsigned buffer_address : 30;
- } dw0;
-
- struct {
- unsigned length : 9;
- unsigned pad0 : 23;
- } dw1;
+typedef struct _state_ddword {
+ struct {
+ unsigned valid:1;
+ unsigned force:1;
+ unsigned buffer_address:30;
+ } dw0;
+
+ struct {
+ unsigned length:9;
+ unsigned pad0:23;
+ } dw1;
} sis_state, ssb_state, msb_state, psp_state, psc_state;
-typedef struct _state_dword
-{
- struct {
- unsigned valid : 1;
- unsigned reset : 1;
- unsigned buffer_address : 30;
- } dw0;
+typedef struct _state_dword {
+ struct {
+ unsigned valid:1;
+ unsigned reset:1;
+ unsigned buffer_address:30;
+ } dw0;
} dis_state;
-struct i915_3dstate_load_indirect
-{
- struct {
- unsigned length : 8;
- unsigned block_mask : 6;
- unsigned mem_select : 1;
- unsigned pad0 : 1;
- unsigned opcode : 13;
- unsigned type : 3;
- } dw0;
+struct i915_3dstate_load_indirect {
+ struct {
+ unsigned length:8;
+ unsigned block_mask:6;
+ unsigned mem_select:1;
+ unsigned pad0:1;
+ unsigned opcode:13;
+ unsigned type:3;
+ } dw0;
};
#define TEXCOORDFMT_2FP 0x00
@@ -816,52 +786,50 @@ struct i915_3dstate_load_indirect
#define TEXCOORDFMT_2FP_16 0x04
#define TEXCOORDFMT_4FP_16 0x05
#define TEXCOORDFMT_NOT_PRESENT 0x0f
-struct s2_dword
-{
- unsigned set0_texcoord_fmt : 4;
- unsigned set1_texcoord_fmt : 4;
- unsigned set2_texcoord_fmt : 4;
- unsigned set3_texcoord_fmt : 4;
- unsigned set4_texcoord_fmt : 4;
- unsigned set5_texcoord_fmt : 4;
- unsigned set6_texcoord_fmt : 4;
- unsigned set7_texcoord_fmt : 4;
-};
-
-struct s3_dword
-{
- unsigned set0_pcd : 1;
- unsigned set0_ws_tcz : 1;
- unsigned set0_ws_tcy : 1;
- unsigned set0_ws_tcx : 1;
- unsigned set1_pcd : 1;
- unsigned set1_ws_tcz : 1;
- unsigned set1_ws_tcy : 1;
- unsigned set1_ws_tcx : 1;
- unsigned set2_pcd : 1;
- unsigned set2_ws_tcz : 1;
- unsigned set2_ws_tcy : 1;
- unsigned set2_ws_tcx : 1;
- unsigned set3_pcd : 1;
- unsigned set3_ws_tcz : 1;
- unsigned set3_ws_tcy : 1;
- unsigned set3_ws_tcx : 1;
- unsigned set4_pcd : 1;
- unsigned set4_ws_tcz : 1;
- unsigned set4_ws_tcy : 1;
- unsigned set4_ws_tcx : 1;
- unsigned set5_pcd : 1;
- unsigned set5_ws_tcz : 1;
- unsigned set5_ws_tcy : 1;
- unsigned set5_ws_tcx : 1;
- unsigned set6_pcd : 1;
- unsigned set6_ws_tcz : 1;
- unsigned set6_ws_tcy : 1;
- unsigned set6_ws_tcx : 1;
- unsigned set7_pcd : 1;
- unsigned set7_ws_tcz : 1;
- unsigned set7_ws_tcy : 1;
- unsigned set7_ws_tcx : 1;
+struct s2_dword {
+ unsigned set0_texcoord_fmt:4;
+ unsigned set1_texcoord_fmt:4;
+ unsigned set2_texcoord_fmt:4;
+ unsigned set3_texcoord_fmt:4;
+ unsigned set4_texcoord_fmt:4;
+ unsigned set5_texcoord_fmt:4;
+ unsigned set6_texcoord_fmt:4;
+ unsigned set7_texcoord_fmt:4;
+};
+
+struct s3_dword {
+ unsigned set0_pcd:1;
+ unsigned set0_ws_tcz:1;
+ unsigned set0_ws_tcy:1;
+ unsigned set0_ws_tcx:1;
+ unsigned set1_pcd:1;
+ unsigned set1_ws_tcz:1;
+ unsigned set1_ws_tcy:1;
+ unsigned set1_ws_tcx:1;
+ unsigned set2_pcd:1;
+ unsigned set2_ws_tcz:1;
+ unsigned set2_ws_tcy:1;
+ unsigned set2_ws_tcx:1;
+ unsigned set3_pcd:1;
+ unsigned set3_ws_tcz:1;
+ unsigned set3_ws_tcy:1;
+ unsigned set3_ws_tcx:1;
+ unsigned set4_pcd:1;
+ unsigned set4_ws_tcz:1;
+ unsigned set4_ws_tcy:1;
+ unsigned set4_ws_tcx:1;
+ unsigned set5_pcd:1;
+ unsigned set5_ws_tcz:1;
+ unsigned set5_ws_tcy:1;
+ unsigned set5_ws_tcx:1;
+ unsigned set6_pcd:1;
+ unsigned set6_ws_tcz:1;
+ unsigned set6_ws_tcy:1;
+ unsigned set6_ws_tcx:1;
+ unsigned set7_pcd:1;
+ unsigned set7_ws_tcz:1;
+ unsigned set7_ws_tcy:1;
+ unsigned set7_ws_tcx:1;
};
#define VERTEXHAS_XYZ 1
@@ -876,103 +844,97 @@ struct s3_dword
#define SHADEMODE_LINEAR 0
#define SHADEMODE_FLAT 1
-struct s4_dword
-{
- unsigned anti_aliasing_enable : 1;
- unsigned sprite_point_enable : 1;
- unsigned fog_parameter_present : 1;
- unsigned local_depth_offset_enable : 1;
- unsigned force_specular_diffuse_color : 1;
- unsigned force_default_diffuse_color : 1;
- unsigned position_mask : 3;
- unsigned local_depth_offset_present : 1;
- unsigned diffuse_color_presetn : 1;
- unsigned specular_color_fog_factor_present : 1;
- unsigned point_width_present : 1;
- unsigned cull_mode : 2;
- unsigned color_shade_mode : 1;
- unsigned specular_shade_mode : 1;
- unsigned fog_shade_mode : 1;
- unsigned alpha_shade_mode : 1;
- unsigned line_width : 4;
- unsigned point_width : 9;
-};
-
-struct s5_dword
-{
- unsigned logic_op_enable : 1;
- unsigned color_dither_enable : 1;
- unsigned stencil_test_enable : 1;
- unsigned stencil_buffer_write_enable : 1;
- unsigned stencil_pass_depth_pass_op : 3;
- unsigned stencil_pass_depth_fail_op : 3;
- unsigned stencil_fail_op : 3;
- unsigned stencil_test_function : 3;
- unsigned stencil_reference_value : 8;
- unsigned fog_enable : 1;
- unsigned global_depth_offset_enable : 1;
- unsigned last_pixel_enable : 1;
- unsigned force_default_point_width : 1;
- unsigned color_buffer_component_write_disable : 4;
-};
-
-struct s6_dword
-{
- unsigned triangle_pv : 2;
- unsigned color_buffer_write : 1;
- unsigned depth_buffer_write : 1;
- unsigned dest_blend_factor : 4;
- unsigned src_blend_factor : 4;
- unsigned color_blend_function : 3;
- unsigned color_buffer_blend : 1;
- unsigned depth_test_function : 3;
- unsigned depth_test_enable : 1;
- unsigned alpha_reference_value : 8;
- unsigned alpha_test_function : 3;
- unsigned alpha_test_enable : 1;
-
-};
-
-struct s7_dword
-{
- unsigned global_depth_offset_const;
-};
-
-struct i915_3dstate_load_state_immediate_1
-{
- struct {
- unsigned length : 4;
- unsigned load_s0 : 1;
- unsigned load_s1 : 1;
- unsigned load_s2 : 1;
- unsigned load_s3 : 1;
- unsigned load_s4 : 1;
- unsigned load_s5 : 1;
- unsigned load_s6 : 1;
- unsigned load_s7 : 1;
- unsigned pad0 : 4;
- unsigned opcode : 13;
- unsigned type : 3;
- } dw0;
-};
-
-struct i915_3dstate_scissor_rectangle
-{
- struct {
- unsigned length : 16;
- unsigned opcode : 13;
- unsigned type : 3;
- } dw0;
-
- struct {
- unsigned min_x : 16;
- unsigned min_y : 16;
- } dw1;
-
- struct {
- unsigned max_x : 16;
- unsigned max_y : 16;
- } dw2;
+struct s4_dword {
+ unsigned anti_aliasing_enable:1;
+ unsigned sprite_point_enable:1;
+ unsigned fog_parameter_present:1;
+ unsigned local_depth_offset_enable:1;
+ unsigned force_specular_diffuse_color:1;
+ unsigned force_default_diffuse_color:1;
+ unsigned position_mask:3;
+ unsigned local_depth_offset_present:1;
+ unsigned diffuse_color_presetn:1;
+ unsigned specular_color_fog_factor_present:1;
+ unsigned point_width_present:1;
+ unsigned cull_mode:2;
+ unsigned color_shade_mode:1;
+ unsigned specular_shade_mode:1;
+ unsigned fog_shade_mode:1;
+ unsigned alpha_shade_mode:1;
+ unsigned line_width:4;
+ unsigned point_width:9;
+};
+
+struct s5_dword {
+ unsigned logic_op_enable:1;
+ unsigned color_dither_enable:1;
+ unsigned stencil_test_enable:1;
+ unsigned stencil_buffer_write_enable:1;
+ unsigned stencil_pass_depth_pass_op:3;
+ unsigned stencil_pass_depth_fail_op:3;
+ unsigned stencil_fail_op:3;
+ unsigned stencil_test_function:3;
+ unsigned stencil_reference_value:8;
+ unsigned fog_enable:1;
+ unsigned global_depth_offset_enable:1;
+ unsigned last_pixel_enable:1;
+ unsigned force_default_point_width:1;
+ unsigned color_buffer_component_write_disable:4;
+};
+
+struct s6_dword {
+ unsigned triangle_pv:2;
+ unsigned color_buffer_write:1;
+ unsigned depth_buffer_write:1;
+ unsigned dest_blend_factor:4;
+ unsigned src_blend_factor:4;
+ unsigned color_blend_function:3;
+ unsigned color_buffer_blend:1;
+ unsigned depth_test_function:3;
+ unsigned depth_test_enable:1;
+ unsigned alpha_reference_value:8;
+ unsigned alpha_test_function:3;
+ unsigned alpha_test_enable:1;
+
+};
+
+struct s7_dword {
+ unsigned global_depth_offset_const;
+};
+
+struct i915_3dstate_load_state_immediate_1 {
+ struct {
+ unsigned length:4;
+ unsigned load_s0:1;
+ unsigned load_s1:1;
+ unsigned load_s2:1;
+ unsigned load_s3:1;
+ unsigned load_s4:1;
+ unsigned load_s5:1;
+ unsigned load_s6:1;
+ unsigned load_s7:1;
+ unsigned pad0:4;
+ unsigned opcode:13;
+ unsigned type:3;
+ } dw0;
+};
+
+struct i915_3dstate_scissor_rectangle {
+ struct {
+ unsigned length:16;
+ unsigned opcode:13;
+ unsigned type:3;
+ } dw0;
+
+ struct {
+ unsigned min_x:16;
+ unsigned min_y:16;
+ } dw1;
+
+ struct {
+ unsigned max_x:16;
+ unsigned max_y:16;
+ } dw2;
};
#define VERTEX_INLINE 0x00
@@ -991,40 +953,37 @@ struct i915_3dstate_scissor_rectangle
#define PRIM_CLEAR_RECT 0x0a
#define PRIM_ZONE_INIT 0x0d
-struct texture_coordinate_set
-{
- unsigned tcx;
- unsigned tcy;
-};
-
-struct vertex_data
-{
- unsigned x;
- unsigned y;
- struct texture_coordinate_set tc0;
- struct texture_coordinate_set tc1;
-};
-
-struct i915_3dprimitive
-{
- union {
- struct {
- unsigned length : 18;
- unsigned prim : 5;
- unsigned vertex_location : 1;
- unsigned opcode : 5;
- unsigned type : 3;
- } inline_prim;
-
- struct {
- unsigned vertex_count : 16;
- unsigned pad0 : 1;
- unsigned vertex_access_mode : 1;
- unsigned prim : 5;
- unsigned vertex_location : 1;
- unsigned opcode : 5;
- unsigned type : 3;
- } indirect_prim;
- } dw0;
+struct texture_coordinate_set {
+ unsigned tcx;
+ unsigned tcy;
+};
+
+struct vertex_data {
+ unsigned x;
+ unsigned y;
+ struct texture_coordinate_set tc0;
+ struct texture_coordinate_set tc1;
+};
+
+struct i915_3dprimitive {
+ union {
+ struct {
+ unsigned length:18;
+ unsigned prim:5;
+ unsigned vertex_location:1;
+ unsigned opcode:5;
+ unsigned type:3;
+ } inline_prim;
+
+ struct {
+ unsigned vertex_count:16;
+ unsigned pad0:1;
+ unsigned vertex_access_mode:1;
+ unsigned prim:5;
+ unsigned vertex_location:1;
+ unsigned opcode:5;
+ unsigned type:3;
+ } indirect_prim;
+ } dw0;
};
#endif /*_I915_STRUCTS_H */
diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index d6f7f01d..84bdaf26 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -39,94 +39,93 @@
SIZE_Y420(surface->width, surface->height))
typedef union {
- int16_t component[2];
- int32_t v;
+ int16_t component[2];
+ int32_t v;
} vector_t;
#if 0
static int findOverlap(unsigned int width, unsigned int height,
- short *dstX, short *dstY,
- short *srcX, short *srcY,
- unsigned short *areaW, unsigned short *areaH)
+ short *dstX, short *dstY,
+ short *srcX, short *srcY,
+ unsigned short *areaW, unsigned short *areaH)
{
- int w, h;
- unsigned int mWidth, mHeight;
-
- w = *areaW;
- h = *areaH;
-
- if ((*dstX >= width) || (*dstY >= height))
- return 1;
-
- if (*dstX < 0) {
- w += *dstX;
- *srcX -= *dstX;
- *dstX = 0;
- }
-
- if (*dstY < 0) {
- h += *dstY;
- *srcY -= *dstY;
- *dstY = 0;
- }
-
- if ((w <= 0) || ((h <= 0)))
- return 1;
-
- mWidth = width - *dstX;
- mHeight = height - *dstY;
- *areaW = (w <= mWidth) ? w : mWidth;
- *areaH = (h <= mHeight) ? h : mHeight;
- return 0;
+ int w, h;
+ unsigned int mWidth, mHeight;
+
+ w = *areaW;
+ h = *areaH;
+
+ if ((*dstX >= width) || (*dstY >= height))
+ return 1;
+
+ if (*dstX < 0) {
+ w += *dstX;
+ *srcX -= *dstX;
+ *dstX = 0;
+ }
+
+ if (*dstY < 0) {
+ h += *dstY;
+ *srcY -= *dstY;
+ *dstY = 0;
+ }
+
+ if ((w <= 0) || ((h <= 0)))
+ return 1;
+
+ mWidth = width - *dstX;
+ mHeight = height - *dstY;
+ *areaW = (w <= mWidth) ? w : mWidth;
+ *areaH = (h <= mHeight) ? h : mHeight;
+ return 0;
}
#endif
static void i915_inst_arith(unsigned int *inst,
- unsigned int op,
- unsigned int dest,
- unsigned int mask,
- unsigned int saturate,
- unsigned int src0, unsigned int src1, unsigned int src2)
+ unsigned int op,
+ unsigned int dest,
+ unsigned int mask,
+ unsigned int saturate,
+ unsigned int src0, unsigned int src1,
+ unsigned int src2)
{
- dest = UREG(GET_UREG_TYPE(dest), GET_UREG_NR(dest));
- *inst = (op | A0_DEST(dest) | mask | saturate | A0_SRC0(src0));
- inst++;
- *inst = (A1_SRC0(src0) | A1_SRC1(src1));
- inst++;
- *inst = (A2_SRC1(src1) | A2_SRC2(src2));
+ dest = UREG(GET_UREG_TYPE(dest), GET_UREG_NR(dest));
+ *inst = (op | A0_DEST(dest) | mask | saturate | A0_SRC0(src0));
+ inst++;
+ *inst = (A1_SRC0(src0) | A1_SRC1(src1));
+ inst++;
+ *inst = (A2_SRC1(src1) | A2_SRC2(src2));
}
static void i915_inst_decl(unsigned int *inst,
- unsigned int type,
- unsigned int nr,
- unsigned int d0_flags)
+ unsigned int type,
+ unsigned int nr, unsigned int d0_flags)
{
- unsigned int reg = UREG(type, nr);
+ unsigned int reg = UREG(type, nr);
- *inst = (D0_DCL | D0_DEST(reg) | d0_flags);
- inst++;
- *inst = D1_MBZ;
- inst++;
- *inst = D2_MBZ;
+ *inst = (D0_DCL | D0_DEST(reg) | d0_flags);
+ inst++;
+ *inst = D1_MBZ;
+ inst++;
+ *inst = D2_MBZ;
}
static void i915_inst_texld(unsigned int *inst,
- unsigned int op,
- unsigned int dest,
- unsigned int coord,
- unsigned int sampler)
+ unsigned int op,
+ unsigned int dest,
+ unsigned int coord, unsigned int sampler)
{
- dest = UREG(GET_UREG_TYPE(dest), GET_UREG_NR(dest));
- *inst = (op | T0_DEST(dest) | T0_SAMPLER(sampler));
- inst++;
- *inst = T1_ADDRESS_REG(coord);
- inst++;
- *inst = T2_MBZ;
+ dest = UREG(GET_UREG_TYPE(dest), GET_UREG_NR(dest));
+ *inst = (op | T0_DEST(dest) | T0_SAMPLER(sampler));
+ inst++;
+ *inst = T1_ADDRESS_REG(coord);
+ inst++;
+ *inst = T2_MBZ;
}
static void i915_emit_batch(void *data, int size, int flag)
{
- intelBatchbufferData(data, size, flag);
+ intelBatchbufferData(data, size, flag);
}
/* one time context initialization buffer */
@@ -138,2331 +137,2418 @@ static int one_time_load_state_imm1_size, one_time_load_indirect_size;
static uint32_t *mc_render_load_indirect;
static int mc_render_load_indirect_size;
-static void i915_mc_one_time_context_init(XvMCContext *context)
+static void i915_mc_one_time_context_init(XvMCContext * context)
{
- unsigned int dest, src0, src1, src2;
- i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
- int i;
- struct i915_3dstate_sampler_state *sampler_state;
- struct i915_3dstate_pixel_shader_program *pixel_shader_program;
- struct i915_3dstate_pixel_shader_constants *pixel_shader_constants;
-
- /* sampler static state */
- sampler_state = (struct i915_3dstate_sampler_state *)pI915XvMC->ssb.map;
- /* pixel shader static state */
- pixel_shader_program = (struct i915_3dstate_pixel_shader_program *)pI915XvMC->psp.map;
- /* pixel shader contant static state */
- pixel_shader_constants = (struct i915_3dstate_pixel_shader_constants *)pI915XvMC->psc.map;
-
- memset(sampler_state, 0, sizeof(*sampler_state));
- sampler_state->dw0.type = CMD_3D;
- sampler_state->dw0.opcode = OPC_3DSTATE_SAMPLER_STATE;
- sampler_state->dw0.length = 6;
- sampler_state->dw1.sampler_masker = SAMPLER_SAMPLER0 | SAMPLER_SAMPLER1;
-
- sampler_state->sampler0.ts0.reverse_gamma = 0;
- sampler_state->sampler0.ts0.planar2packet = 0;
- sampler_state->sampler0.ts0.color_conversion = 0;
- sampler_state->sampler0.ts0.chromakey_index = 0;
- sampler_state->sampler0.ts0.base_level = 0;
- sampler_state->sampler0.ts0.mip_filter = MIPFILTER_NONE; /* NONE */
- sampler_state->sampler0.ts0.mag_filter = MAPFILTER_LINEAR; /* LINEAR */
- sampler_state->sampler0.ts0.min_filter = MAPFILTER_LINEAR; /* LINEAR */
- sampler_state->sampler0.ts0.lod_bias = 0; /* 0.0 */
- sampler_state->sampler0.ts0.shadow_enable = 0;
- sampler_state->sampler0.ts0.max_anisotropy = ANISORATIO_2;
- sampler_state->sampler0.ts0.shadow_function = PREFILTEROP_ALWAYS;
- sampler_state->sampler0.ts1.min_lod = 0; /* 0.0 Maximum Mip Level */
- sampler_state->sampler0.ts1.kill_pixel = 0;
- sampler_state->sampler0.ts1.keyed_texture_filter = 0;
- sampler_state->sampler0.ts1.chromakey_enable = 0;
- sampler_state->sampler0.ts1.tcx_control = TEXCOORDMODE_CLAMP;
- sampler_state->sampler0.ts1.tcy_control = TEXCOORDMODE_CLAMP;
- sampler_state->sampler0.ts1.tcz_control = TEXCOORDMODE_CLAMP;
- sampler_state->sampler0.ts1.normalized_coor = 0;
- sampler_state->sampler0.ts1.map_index = 0;
- sampler_state->sampler0.ts1.east_deinterlacer = 0;
- sampler_state->sampler0.ts2.default_color = 0;
-
- sampler_state->sampler1.ts0.reverse_gamma = 0;
- sampler_state->sampler1.ts0.planar2packet = 0;
- sampler_state->sampler1.ts0.color_conversion = 0;
- sampler_state->sampler1.ts0.chromakey_index = 0;
- sampler_state->sampler1.ts0.base_level = 0;
- sampler_state->sampler1.ts0.mip_filter = MIPFILTER_NONE; /* NONE */
- sampler_state->sampler1.ts0.mag_filter = MAPFILTER_LINEAR; /* LINEAR */
- sampler_state->sampler1.ts0.min_filter = MAPFILTER_LINEAR; /* LINEAR */
- sampler_state->sampler1.ts0.lod_bias = 0; /* 0.0 */
- sampler_state->sampler1.ts0.shadow_enable = 0;
- sampler_state->sampler1.ts0.max_anisotropy = ANISORATIO_2;
- sampler_state->sampler1.ts0.shadow_function = PREFILTEROP_ALWAYS;
- sampler_state->sampler1.ts1.min_lod = 0; /* 0.0 Maximum Mip Level */
- sampler_state->sampler1.ts1.kill_pixel = 0;
- sampler_state->sampler1.ts1.keyed_texture_filter = 0;
- sampler_state->sampler1.ts1.chromakey_enable = 0;
- sampler_state->sampler1.ts1.tcx_control = TEXCOORDMODE_CLAMP;
- sampler_state->sampler1.ts1.tcy_control = TEXCOORDMODE_CLAMP;
- sampler_state->sampler1.ts1.tcz_control = TEXCOORDMODE_CLAMP;
- sampler_state->sampler1.ts1.normalized_coor = 0;
- sampler_state->sampler1.ts1.map_index = 1;
- sampler_state->sampler1.ts1.east_deinterlacer = 0;
- sampler_state->sampler1.ts2.default_color = 0;
-
- memset(pixel_shader_program, 0, sizeof(*pixel_shader_program));
- pixel_shader_program->shader0.type = CMD_3D;
- pixel_shader_program->shader0.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
- pixel_shader_program->shader0.retain = 1;
- pixel_shader_program->shader0.length = 2; /* 1 inst */
- i = 0;
-
- dest = UREG(REG_TYPE_OC, 0);
- src0 = UREG(REG_TYPE_CONST, 0);
- src1 = 0;
- src2 = 0;
- i915_inst_arith(&pixel_shader_program->inst0[i], A0_MOV,
- dest, A0_DEST_CHANNEL_ALL, A0_DEST_SATURATE, src0, src1, src2);
-
- pixel_shader_program->shader1.type = CMD_3D;
- pixel_shader_program->shader1.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
- pixel_shader_program->shader1.retain = 1;
- pixel_shader_program->shader1.length = 14; /* 5 inst */
- i = 0;
- /* dcl t0.xy */
- i915_inst_decl(&pixel_shader_program->inst1[i], REG_TYPE_T, T_TEX0, D0_CHANNEL_XY);
- i+=3;
- /* dcl t1.xy */
- i915_inst_decl(&pixel_shader_program->inst1[i], REG_TYPE_T, T_TEX1, D0_CHANNEL_XY);
- /* dcl_2D s0 */
- i += 3;
- i915_inst_decl(&pixel_shader_program->inst1[i], REG_TYPE_S, 0, D0_SAMPLE_TYPE_2D);
- /* texld r0, t0, s0 */
- i += 3;
- dest = UREG(REG_TYPE_R, 0);
- src0 = UREG(REG_TYPE_T, 0); /* COORD */
- src1 = UREG(REG_TYPE_S, 0); /* SAMPLER */
- i915_inst_texld(&pixel_shader_program->inst1[i], T0_TEXLD, dest, src0, src1);
- /* mov oC, r0 */
- i += 3;
- dest = UREG(REG_TYPE_OC, 0);
- src0 = UREG(REG_TYPE_R, 0);
- src1 = src2 = 0;
- i915_inst_arith(&pixel_shader_program->inst1[i], A0_MOV, dest, A0_DEST_CHANNEL_ALL,
- A0_DEST_SATURATE, src0, src1, src2);
-
-
- pixel_shader_program->shader2.type = CMD_3D;
- pixel_shader_program->shader2.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
- pixel_shader_program->shader2.retain = 1;
- pixel_shader_program->shader2.length = 14; /* 5 inst */
- i = 0;
- /* dcl t2.xy */
- i915_inst_decl(&pixel_shader_program->inst2[i], REG_TYPE_T, T_TEX2, D0_CHANNEL_XY);
- /* dcl t3.xy */
- i += 3;
- i915_inst_decl(&pixel_shader_program->inst2[i], REG_TYPE_T, T_TEX3, D0_CHANNEL_XY);
- /* dcl_2D s1 */
- i += 3;
- i915_inst_decl(&pixel_shader_program->inst2[i], REG_TYPE_S, 1, D0_SAMPLE_TYPE_2D);
- /* texld r0, t2, s1 */
- i += 3;
- dest = UREG(REG_TYPE_R, 0);
- src0 = UREG(REG_TYPE_T, 2); /* COORD */
- src1 = UREG(REG_TYPE_S, 1); /* SAMPLER */
- i915_inst_texld(&pixel_shader_program->inst2[i], T0_TEXLD, dest, src0, src1);
- /* mov oC, r0 */
- i += 3;
- dest = UREG(REG_TYPE_OC, 0);
- src0 = UREG(REG_TYPE_R, 0);
- src1 = src2 = 0;
- i915_inst_arith(&pixel_shader_program->inst2[i], A0_MOV, dest, A0_DEST_CHANNEL_ALL,
- A0_DEST_SATURATE, src0, src1, src2);
-
- /* Shader 3 */
- pixel_shader_program->shader3.type = CMD_3D;
- pixel_shader_program->shader3.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
- pixel_shader_program->shader3.retain = 1;
- pixel_shader_program->shader3.length = 29; /* 10 inst */
- i = 0;
- /* dcl t0.xy */
- i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_T, T_TEX0, D0_CHANNEL_XY);
- /* dcl t1.xy */
- i += 3;
- i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_T, T_TEX1, D0_CHANNEL_XY);
- /* dcl t2.xy */
- i += 3;
- i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_T, T_TEX2, D0_CHANNEL_XY);
- /* dcl t3.xy */
- i += 3;
- i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_T, T_TEX3, D0_CHANNEL_XY);
- /* dcl_2D s0 */
- i += 3;
- i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_S, 0, D0_SAMPLE_TYPE_2D);
- /* dcl_2D s1 */
- i += 3;
- i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_S, 1, D0_SAMPLE_TYPE_2D);
- /* texld r0, t0, s0 */
- i += 3;
- dest = UREG(REG_TYPE_R, 0);
- src0 = UREG(REG_TYPE_T, 0); /* COORD */
- src1 = UREG(REG_TYPE_S, 0); /* SAMPLER */
- i915_inst_texld(&pixel_shader_program->inst3[i], T0_TEXLD, dest, src0, src1);
- /* texld r1, t2, s1 */
- i += 3;
- dest = UREG(REG_TYPE_R, 1);
- src0 = UREG(REG_TYPE_T, 2); /* COORD */
- src1 = UREG(REG_TYPE_S, 1); /* SAMPLER */
- i915_inst_texld(&pixel_shader_program->inst3[i], T0_TEXLD, dest, src0, src1);
- /* add r0, r0, r1 */
- i += 3;
- dest = UREG(REG_TYPE_R, 0);
- src0 = UREG(REG_TYPE_R, 0);
- src1 = UREG(REG_TYPE_R, 1);
- src2 = 0;
- i915_inst_arith(&pixel_shader_program->inst3[i], A0_ADD, dest, A0_DEST_CHANNEL_ALL,
- 0 /* A0_DEST_SATURATE */, src0, src1, src2);
- /* mul oC, r0, c0 */
- i += 3;
- dest = UREG(REG_TYPE_OC, 0);
- src0 = UREG(REG_TYPE_R, 0);
- src1 = UREG(REG_TYPE_CONST, 0);
- src2 = 0;
- i915_inst_arith(&pixel_shader_program->inst3[i], A0_MUL, dest, A0_DEST_CHANNEL_ALL,
- A0_DEST_SATURATE, src0, src1, src2);
-
- memset(pixel_shader_constants, 0, sizeof(*pixel_shader_constants));
- pixel_shader_constants->dw0.type = CMD_3D;
- pixel_shader_constants->dw0.opcode = OPC_3DSTATE_PIXEL_SHADER_CONSTANTS;
- pixel_shader_constants->dw0.length = 4;
- pixel_shader_constants->dw1.reg_mask = REG_CR0;
- pixel_shader_constants->value.x = 0.5;
- pixel_shader_constants->value.y = 0.5;
- pixel_shader_constants->value.z = 0.5;
- pixel_shader_constants->value.w = 0.5;
+ unsigned int dest, src0, src1, src2;
+ i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
+ int i;
+ struct i915_3dstate_sampler_state *sampler_state;
+ struct i915_3dstate_pixel_shader_program *pixel_shader_program;
+ struct i915_3dstate_pixel_shader_constants *pixel_shader_constants;
+
+ /* sampler static state */
+ sampler_state = (struct i915_3dstate_sampler_state *)pI915XvMC->ssb.map;
+ /* pixel shader static state */
+ pixel_shader_program =
+ (struct i915_3dstate_pixel_shader_program *)pI915XvMC->psp.map;
+ /* pixel shader contant static state */
+ pixel_shader_constants =
+ (struct i915_3dstate_pixel_shader_constants *)pI915XvMC->psc.map;
+
+ memset(sampler_state, 0, sizeof(*sampler_state));
+ sampler_state->dw0.type = CMD_3D;
+ sampler_state->dw0.opcode = OPC_3DSTATE_SAMPLER_STATE;
+ sampler_state->dw0.length = 6;
+ sampler_state->dw1.sampler_masker = SAMPLER_SAMPLER0 | SAMPLER_SAMPLER1;
+
+ sampler_state->sampler0.ts0.reverse_gamma = 0;
+ sampler_state->sampler0.ts0.planar2packet = 0;
+ sampler_state->sampler0.ts0.color_conversion = 0;
+ sampler_state->sampler0.ts0.chromakey_index = 0;
+ sampler_state->sampler0.ts0.base_level = 0;
+ sampler_state->sampler0.ts0.mip_filter = MIPFILTER_NONE; /* NONE */
+ sampler_state->sampler0.ts0.mag_filter = MAPFILTER_LINEAR; /* LINEAR */
+ sampler_state->sampler0.ts0.min_filter = MAPFILTER_LINEAR; /* LINEAR */
+ sampler_state->sampler0.ts0.lod_bias = 0; /* 0.0 */
+ sampler_state->sampler0.ts0.shadow_enable = 0;
+ sampler_state->sampler0.ts0.max_anisotropy = ANISORATIO_2;
+ sampler_state->sampler0.ts0.shadow_function = PREFILTEROP_ALWAYS;
+ sampler_state->sampler0.ts1.min_lod = 0; /* 0.0 Maximum Mip Level */
+ sampler_state->sampler0.ts1.kill_pixel = 0;
+ sampler_state->sampler0.ts1.keyed_texture_filter = 0;
+ sampler_state->sampler0.ts1.chromakey_enable = 0;
+ sampler_state->sampler0.ts1.tcx_control = TEXCOORDMODE_CLAMP;
+ sampler_state->sampler0.ts1.tcy_control = TEXCOORDMODE_CLAMP;
+ sampler_state->sampler0.ts1.tcz_control = TEXCOORDMODE_CLAMP;
+ sampler_state->sampler0.ts1.normalized_coor = 0;
+ sampler_state->sampler0.ts1.map_index = 0;
+ sampler_state->sampler0.ts1.east_deinterlacer = 0;
+ sampler_state->sampler0.ts2.default_color = 0;
+
+ sampler_state->sampler1.ts0.reverse_gamma = 0;
+ sampler_state->sampler1.ts0.planar2packet = 0;
+ sampler_state->sampler1.ts0.color_conversion = 0;
+ sampler_state->sampler1.ts0.chromakey_index = 0;
+ sampler_state->sampler1.ts0.base_level = 0;
+ sampler_state->sampler1.ts0.mip_filter = MIPFILTER_NONE; /* NONE */
+ sampler_state->sampler1.ts0.mag_filter = MAPFILTER_LINEAR; /* LINEAR */
+ sampler_state->sampler1.ts0.min_filter = MAPFILTER_LINEAR; /* LINEAR */
+ sampler_state->sampler1.ts0.lod_bias = 0; /* 0.0 */
+ sampler_state->sampler1.ts0.shadow_enable = 0;
+ sampler_state->sampler1.ts0.max_anisotropy = ANISORATIO_2;
+ sampler_state->sampler1.ts0.shadow_function = PREFILTEROP_ALWAYS;
+ sampler_state->sampler1.ts1.min_lod = 0; /* 0.0 Maximum Mip Level */
+ sampler_state->sampler1.ts1.kill_pixel = 0;
+ sampler_state->sampler1.ts1.keyed_texture_filter = 0;
+ sampler_state->sampler1.ts1.chromakey_enable = 0;
+ sampler_state->sampler1.ts1.tcx_control = TEXCOORDMODE_CLAMP;
+ sampler_state->sampler1.ts1.tcy_control = TEXCOORDMODE_CLAMP;
+ sampler_state->sampler1.ts1.tcz_control = TEXCOORDMODE_CLAMP;
+ sampler_state->sampler1.ts1.normalized_coor = 0;
+ sampler_state->sampler1.ts1.map_index = 1;
+ sampler_state->sampler1.ts1.east_deinterlacer = 0;
+ sampler_state->sampler1.ts2.default_color = 0;
+
+ memset(pixel_shader_program, 0, sizeof(*pixel_shader_program));
+ pixel_shader_program->shader0.type = CMD_3D;
+ pixel_shader_program->shader0.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
+ pixel_shader_program->shader0.retain = 1;
+ pixel_shader_program->shader0.length = 2; /* 1 inst */
+ i = 0;
+
+ dest = UREG(REG_TYPE_OC, 0);
+ src0 = UREG(REG_TYPE_CONST, 0);
+ src1 = 0;
+ src2 = 0;
+ i915_inst_arith(&pixel_shader_program->inst0[i], A0_MOV,
+ dest, A0_DEST_CHANNEL_ALL, A0_DEST_SATURATE, src0, src1,
+ src2);
+
+ pixel_shader_program->shader1.type = CMD_3D;
+ pixel_shader_program->shader1.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
+ pixel_shader_program->shader1.retain = 1;
+ pixel_shader_program->shader1.length = 14; /* 5 inst */
+ i = 0;
+ /* dcl t0.xy */
+ i915_inst_decl(&pixel_shader_program->inst1[i], REG_TYPE_T, T_TEX0,
+ D0_CHANNEL_XY);
+ i += 3;
+ /* dcl t1.xy */
+ i915_inst_decl(&pixel_shader_program->inst1[i], REG_TYPE_T, T_TEX1,
+ D0_CHANNEL_XY);
+ /* dcl_2D s0 */
+ i += 3;
+ i915_inst_decl(&pixel_shader_program->inst1[i], REG_TYPE_S, 0,
+ D0_SAMPLE_TYPE_2D);
+ /* texld r0, t0, s0 */
+ i += 3;
+ dest = UREG(REG_TYPE_R, 0);
+ src0 = UREG(REG_TYPE_T, 0); /* COORD */
+ src1 = UREG(REG_TYPE_S, 0); /* SAMPLER */
+ i915_inst_texld(&pixel_shader_program->inst1[i], T0_TEXLD, dest, src0,
+ src1);
+ /* mov oC, r0 */
+ i += 3;
+ dest = UREG(REG_TYPE_OC, 0);
+ src0 = UREG(REG_TYPE_R, 0);
+ src1 = src2 = 0;
+ i915_inst_arith(&pixel_shader_program->inst1[i], A0_MOV, dest,
+ A0_DEST_CHANNEL_ALL, A0_DEST_SATURATE, src0, src1,
+ src2);
+
+ pixel_shader_program->shader2.type = CMD_3D;
+ pixel_shader_program->shader2.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
+ pixel_shader_program->shader2.retain = 1;
+ pixel_shader_program->shader2.length = 14; /* 5 inst */
+ i = 0;
+ /* dcl t2.xy */
+ i915_inst_decl(&pixel_shader_program->inst2[i], REG_TYPE_T, T_TEX2,
+ D0_CHANNEL_XY);
+ /* dcl t3.xy */
+ i += 3;
+ i915_inst_decl(&pixel_shader_program->inst2[i], REG_TYPE_T, T_TEX3,
+ D0_CHANNEL_XY);
+ /* dcl_2D s1 */
+ i += 3;
+ i915_inst_decl(&pixel_shader_program->inst2[i], REG_TYPE_S, 1,
+ D0_SAMPLE_TYPE_2D);
+ /* texld r0, t2, s1 */
+ i += 3;
+ dest = UREG(REG_TYPE_R, 0);
+ src0 = UREG(REG_TYPE_T, 2); /* COORD */
+ src1 = UREG(REG_TYPE_S, 1); /* SAMPLER */
+ i915_inst_texld(&pixel_shader_program->inst2[i], T0_TEXLD, dest, src0,
+ src1);
+ /* mov oC, r0 */
+ i += 3;
+ dest = UREG(REG_TYPE_OC, 0);
+ src0 = UREG(REG_TYPE_R, 0);
+ src1 = src2 = 0;
+ i915_inst_arith(&pixel_shader_program->inst2[i], A0_MOV, dest,
+ A0_DEST_CHANNEL_ALL, A0_DEST_SATURATE, src0, src1,
+ src2);
+
+ /* Shader 3 */
+ pixel_shader_program->shader3.type = CMD_3D;
+ pixel_shader_program->shader3.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
+ pixel_shader_program->shader3.retain = 1;
+ pixel_shader_program->shader3.length = 29; /* 10 inst */
+ i = 0;
+ /* dcl t0.xy */
+ i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_T, T_TEX0,
+ D0_CHANNEL_XY);
+ /* dcl t1.xy */
+ i += 3;
+ i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_T, T_TEX1,
+ D0_CHANNEL_XY);
+ /* dcl t2.xy */
+ i += 3;
+ i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_T, T_TEX2,
+ D0_CHANNEL_XY);
+ /* dcl t3.xy */
+ i += 3;
+ i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_T, T_TEX3,
+ D0_CHANNEL_XY);
+ /* dcl_2D s0 */
+ i += 3;
+ i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_S, 0,
+ D0_SAMPLE_TYPE_2D);
+ /* dcl_2D s1 */
+ i += 3;
+ i915_inst_decl(&pixel_shader_program->inst3[i], REG_TYPE_S, 1,
+ D0_SAMPLE_TYPE_2D);
+ /* texld r0, t0, s0 */
+ i += 3;
+ dest = UREG(REG_TYPE_R, 0);
+ src0 = UREG(REG_TYPE_T, 0); /* COORD */
+ src1 = UREG(REG_TYPE_S, 0); /* SAMPLER */
+ i915_inst_texld(&pixel_shader_program->inst3[i], T0_TEXLD, dest, src0,
+ src1);
+ /* texld r1, t2, s1 */
+ i += 3;
+ dest = UREG(REG_TYPE_R, 1);
+ src0 = UREG(REG_TYPE_T, 2); /* COORD */
+ src1 = UREG(REG_TYPE_S, 1); /* SAMPLER */
+ i915_inst_texld(&pixel_shader_program->inst3[i], T0_TEXLD, dest, src0,
+ src1);
+ /* add r0, r0, r1 */
+ i += 3;
+ dest = UREG(REG_TYPE_R, 0);
+ src0 = UREG(REG_TYPE_R, 0);
+ src1 = UREG(REG_TYPE_R, 1);
+ src2 = 0;
+ i915_inst_arith(&pixel_shader_program->inst3[i], A0_ADD, dest,
+ A0_DEST_CHANNEL_ALL, 0 /* A0_DEST_SATURATE */ , src0,
+ src1, src2);
+ /* mul oC, r0, c0 */
+ i += 3;
+ dest = UREG(REG_TYPE_OC, 0);
+ src0 = UREG(REG_TYPE_R, 0);
+ src1 = UREG(REG_TYPE_CONST, 0);
+ src2 = 0;
+ i915_inst_arith(&pixel_shader_program->inst3[i], A0_MUL, dest,
+ A0_DEST_CHANNEL_ALL, A0_DEST_SATURATE, src0, src1,
+ src2);
+
+ memset(pixel_shader_constants, 0, sizeof(*pixel_shader_constants));
+ pixel_shader_constants->dw0.type = CMD_3D;
+ pixel_shader_constants->dw0.opcode = OPC_3DSTATE_PIXEL_SHADER_CONSTANTS;
+ pixel_shader_constants->dw0.length = 4;
+ pixel_shader_constants->dw1.reg_mask = REG_CR0;
+ pixel_shader_constants->value.x = 0.5;
+ pixel_shader_constants->value.y = 0.5;
+ pixel_shader_constants->value.z = 0.5;
+ pixel_shader_constants->value.w = 0.5;
}
-static void i915_mc_one_time_state_init(XvMCContext *context)
+static void i915_mc_one_time_state_init(XvMCContext * context)
{
- struct s3_dword *s3 = NULL;
- struct s6_dword *s6 = NULL;
- dis_state *dis = NULL;
- ssb_state *ssb = NULL;
- psp_state *psp = NULL;
- psc_state *psc = NULL;
- i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
- struct i915_3dstate_load_state_immediate_1 *load_state_immediate_1;
- struct i915_3dstate_load_indirect *load_indirect;
- int mem_select;
-
- /* 3DSTATE_LOAD_STATE_IMMEDIATE_1 */
- one_time_load_state_imm1_size = sizeof(*load_state_immediate_1) + sizeof(*s3) + sizeof(*s6);
- one_time_load_state_imm1 = calloc(1, one_time_load_state_imm1_size);
- load_state_immediate_1 = (struct i915_3dstate_load_state_immediate_1 *)one_time_load_state_imm1;
- load_state_immediate_1->dw0.type = CMD_3D;
- load_state_immediate_1->dw0.opcode = OPC_3DSTATE_LOAD_STATE_IMMEDIATE_1;
- load_state_immediate_1->dw0.load_s3 = 1;
- load_state_immediate_1->dw0.load_s6 = 1;
- load_state_immediate_1->dw0.length = (one_time_load_state_imm1_size >> 2) - 2;
-
- s3 = (struct s3_dword *)(++load_state_immediate_1);
- s3->set0_pcd = 1;
- s3->set1_pcd = 1;
- s3->set2_pcd = 1;
- s3->set3_pcd = 1;
- s3->set4_pcd = 1;
- s3->set5_pcd = 1;
- s3->set6_pcd = 1;
- s3->set7_pcd = 1;
-
- s6 = (struct s6_dword *)(++s3);
- s6->alpha_test_enable = 0;
- s6->alpha_test_function = 0;
- s6->alpha_reference_value = 0;
- s6->depth_test_enable = 1;
- s6->depth_test_function = 0;
- s6->color_buffer_blend = 0;
- s6->color_blend_function = 0;
- s6->src_blend_factor = 1;
- s6->dest_blend_factor = 1;
- s6->depth_buffer_write = 0;
- s6->color_buffer_write = 1;
- s6->triangle_pv = 0;
-
- /* 3DSTATE_LOAD_INDIRECT */
- one_time_load_indirect_size = sizeof(*load_indirect) + sizeof(*dis) + sizeof(*ssb) + sizeof(*psp) + sizeof(*psc);
- one_time_load_indirect = calloc(1, one_time_load_indirect_size);
- load_indirect = (struct i915_3dstate_load_indirect *)one_time_load_indirect;
- load_indirect->dw0.type = CMD_3D;
- load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;
- load_indirect->dw0.block_mask = BLOCK_DIS | BLOCK_SSB | BLOCK_PSP | BLOCK_PSC;
- load_indirect->dw0.length = (one_time_load_indirect_size >> 2) - 2;
-
- if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
- pI915XvMC->deviceID == PCI_CHIP_I915_GM)
- mem_select = 0; /* use physical address */
- else
- mem_select = 1; /* use gfx address */
-
- load_indirect->dw0.mem_select = mem_select;
-
-
- /* Dynamic indirect state buffer */
- dis = (dis_state *)(++load_indirect);
- dis->dw0.valid = 0;
- dis->dw0.reset = 0;
- dis->dw0.buffer_address = 0;
-
- /* Sample state buffer */
- ssb = (ssb_state *)(++dis);
- ssb->dw0.valid = 1;
- ssb->dw0.force = 1;
- ssb->dw1.length = 7; /* 8 - 1 */
-
- if (mem_select)
- ssb->dw0.buffer_address = (pI915XvMC->ssb.offset >> 2);
- else
- ssb->dw0.buffer_address = (pI915XvMC->ssb.bus_addr >> 2);
-
- /* Pixel shader program buffer */
- psp = (psp_state *)(++ssb);
- psp->dw0.valid = 1;
- psp->dw0.force = 1;
- psp->dw1.length = 66; /* 4 + 16 + 16 + 31 - 1 */
-
- if (mem_select)
- psp->dw0.buffer_address = (pI915XvMC->psp.offset >> 2);
- else
- psp->dw0.buffer_address = (pI915XvMC->psp.bus_addr >> 2);
-
- /* Pixel shader constant buffer */
- psc = (psc_state *)(++psp);
- psc->dw0.valid = 1;
- psc->dw0.force = 1;
- psc->dw1.length = 5; /* 6 - 1 */
-
- if (mem_select)
- psc->dw0.buffer_address = (pI915XvMC->psc.offset >> 2);
- else
- psc->dw0.buffer_address = (pI915XvMC->psc.bus_addr >> 2);
+ struct s3_dword *s3 = NULL;
+ struct s6_dword *s6 = NULL;
+ dis_state *dis = NULL;
+ ssb_state *ssb = NULL;
+ psp_state *psp = NULL;
+ psc_state *psc = NULL;
+ i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
+ struct i915_3dstate_load_state_immediate_1 *load_state_immediate_1;
+ struct i915_3dstate_load_indirect *load_indirect;
+ int mem_select;
+
+ /* 3DSTATE_LOAD_STATE_IMMEDIATE_1 */
+ one_time_load_state_imm1_size =
+ sizeof(*load_state_immediate_1) + sizeof(*s3) + sizeof(*s6);
+ one_time_load_state_imm1 = calloc(1, one_time_load_state_imm1_size);
+ load_state_immediate_1 = (struct i915_3dstate_load_state_immediate_1 *)
+ one_time_load_state_imm1;
+ load_state_immediate_1->dw0.type = CMD_3D;
+ load_state_immediate_1->dw0.opcode = OPC_3DSTATE_LOAD_STATE_IMMEDIATE_1;
+ load_state_immediate_1->dw0.load_s3 = 1;
+ load_state_immediate_1->dw0.load_s6 = 1;
+ load_state_immediate_1->dw0.length =
+ (one_time_load_state_imm1_size >> 2) - 2;
+
+ s3 = (struct s3_dword *)(++load_state_immediate_1);
+ s3->set0_pcd = 1;
+ s3->set1_pcd = 1;
+ s3->set2_pcd = 1;
+ s3->set3_pcd = 1;
+ s3->set4_pcd = 1;
+ s3->set5_pcd = 1;
+ s3->set6_pcd = 1;
+ s3->set7_pcd = 1;
+
+ s6 = (struct s6_dword *)(++s3);
+ s6->alpha_test_enable = 0;
+ s6->alpha_test_function = 0;
+ s6->alpha_reference_value = 0;
+ s6->depth_test_enable = 1;
+ s6->depth_test_function = 0;
+ s6->color_buffer_blend = 0;
+ s6->color_blend_function = 0;
+ s6->src_blend_factor = 1;
+ s6->dest_blend_factor = 1;
+ s6->depth_buffer_write = 0;
+ s6->color_buffer_write = 1;
+ s6->triangle_pv = 0;
+
+ /* 3DSTATE_LOAD_INDIRECT */
+ one_time_load_indirect_size =
+ sizeof(*load_indirect) + sizeof(*dis) + sizeof(*ssb) +
+ sizeof(*psp) + sizeof(*psc);
+ one_time_load_indirect = calloc(1, one_time_load_indirect_size);
+ load_indirect =
+ (struct i915_3dstate_load_indirect *)one_time_load_indirect;
+ load_indirect->dw0.type = CMD_3D;
+ load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;
+ load_indirect->dw0.block_mask =
+ BLOCK_DIS | BLOCK_SSB | BLOCK_PSP | BLOCK_PSC;
+ load_indirect->dw0.length = (one_time_load_indirect_size >> 2) - 2;
+
+ if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
+ pI915XvMC->deviceID == PCI_CHIP_I915_GM)
+ mem_select = 0; /* use physical address */
+ else
+ mem_select = 1; /* use gfx address */
+
+ load_indirect->dw0.mem_select = mem_select;
+
+ /* Dynamic indirect state buffer */
+ dis = (dis_state *) (++load_indirect);
+ dis->dw0.valid = 0;
+ dis->dw0.reset = 0;
+ dis->dw0.buffer_address = 0;
+
+ /* Sample state buffer */
+ ssb = (ssb_state *) (++dis);
+ ssb->dw0.valid = 1;
+ ssb->dw0.force = 1;
+ ssb->dw1.length = 7; /* 8 - 1 */
+
+ if (mem_select)
+ ssb->dw0.buffer_address = (pI915XvMC->ssb.offset >> 2);
+ else
+ ssb->dw0.buffer_address = (pI915XvMC->ssb.bus_addr >> 2);
+
+ /* Pixel shader program buffer */
+ psp = (psp_state *) (++ssb);
+ psp->dw0.valid = 1;
+ psp->dw0.force = 1;
+ psp->dw1.length = 66; /* 4 + 16 + 16 + 31 - 1 */
+
+ if (mem_select)
+ psp->dw0.buffer_address = (pI915XvMC->psp.offset >> 2);
+ else
+ psp->dw0.buffer_address = (pI915XvMC->psp.bus_addr >> 2);
+
+ /* Pixel shader constant buffer */
+ psc = (psc_state *) (++psp);
+ psc->dw0.valid = 1;
+ psc->dw0.force = 1;
+ psc->dw1.length = 5; /* 6 - 1 */
+
+ if (mem_select)
+ psc->dw0.buffer_address = (pI915XvMC->psc.offset >> 2);
+ else
+ psc->dw0.buffer_address = (pI915XvMC->psc.bus_addr >> 2);
}
static void i915_mc_one_time_state_emit(void)
{
- i915_emit_batch(one_time_load_state_imm1, one_time_load_state_imm1_size, 0);
- i915_emit_batch(one_time_load_indirect, one_time_load_indirect_size, 0);
+ i915_emit_batch(one_time_load_state_imm1, one_time_load_state_imm1_size,
+ 0);
+ i915_emit_batch(one_time_load_indirect, one_time_load_indirect_size, 0);
}
-static void i915_mc_static_indirect_state_init(XvMCContext *context)
+static void i915_mc_static_indirect_state_init(XvMCContext * context)
{
- i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
- struct i915_mc_static_indirect_state_buffer *buffer_info =
- (struct i915_mc_static_indirect_state_buffer *)pI915XvMC->sis.map;
-
- memset(buffer_info, 0, sizeof(*buffer_info));
- /* dest Y */
- buffer_info->dest_y.dw0.type = CMD_3D;
- buffer_info->dest_y.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
- buffer_info->dest_y.dw0.length = 1;
- buffer_info->dest_y.dw1.aux_id = 0;
- buffer_info->dest_y.dw1.buffer_id = BUFFERID_COLOR_BACK;
- buffer_info->dest_y.dw1.fence_regs = 0; /* disabled */ /* FIXME: tiled y for performance */
- buffer_info->dest_y.dw1.tiled_surface = 0; /* linear */
- buffer_info->dest_y.dw1.walk = TILEWALK_XMAJOR;
-
- /* dest U */
- buffer_info->dest_u.dw0.type = CMD_3D;
- buffer_info->dest_u.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
- buffer_info->dest_u.dw0.length = 1;
- buffer_info->dest_u.dw1.aux_id = 0;
- buffer_info->dest_u.dw1.buffer_id = BUFFERID_COLOR_AUX;
- buffer_info->dest_u.dw1.fence_regs = 0;
- buffer_info->dest_u.dw1.tiled_surface = 0;
- buffer_info->dest_u.dw1.walk = TILEWALK_XMAJOR;
-
- /* dest V */
- buffer_info->dest_v.dw0.type = CMD_3D;
- buffer_info->dest_v.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
- buffer_info->dest_v.dw0.length = 1;
- buffer_info->dest_v.dw1.aux_id = 1;
- buffer_info->dest_v.dw1.buffer_id = BUFFERID_COLOR_AUX;
- buffer_info->dest_v.dw1.fence_regs = 0;
- buffer_info->dest_v.dw1.tiled_surface = 0;
- buffer_info->dest_v.dw1.walk = TILEWALK_XMAJOR;
-
- buffer_info->dest_buf.dw0.type = CMD_3D;
- buffer_info->dest_buf.dw0.opcode = OPC_3DSTATE_DEST_BUFFER_VARIABLES;
- buffer_info->dest_buf.dw0.length = 0;
- buffer_info->dest_buf.dw1.dest_v_bias = 8; /* 0.5 */
- buffer_info->dest_buf.dw1.dest_h_bias = 8; /* 0.5 */
- buffer_info->dest_buf.dw1.color_fmt = COLORBUFFER_8BIT;
- buffer_info->dest_buf.dw1.v_ls = 0; /* fill later */
- buffer_info->dest_buf.dw1.v_ls_offset = 0; /* fill later */
-
- buffer_info->dest_buf_mpeg.dw0.type = CMD_3D;
- buffer_info->dest_buf_mpeg.dw0.opcode = OPC_3DSTATE_DEST_BUFFER_VARIABLES_MPEG;
- buffer_info->dest_buf_mpeg.dw0.length = 1;
- buffer_info->dest_buf_mpeg.dw1.decode_mode = MPEG_DECODE_MC;
- buffer_info->dest_buf_mpeg.dw1.rcontrol = 0; /* for MPEG-1/MPEG-2 */
- buffer_info->dest_buf_mpeg.dw1.bidir_avrg_control = 0; /* for MPEG-1/MPEG-2/MPEG-4 */
- buffer_info->dest_buf_mpeg.dw1.abort_on_error = 1;
- buffer_info->dest_buf_mpeg.dw1.intra8 = 0; /* 16-bit formatted correction data */
- buffer_info->dest_buf_mpeg.dw1.tff = 1; /* fill later */
-
- buffer_info->dest_buf_mpeg.dw1.v_subsample_factor = MC_SUB_1V;
- buffer_info->dest_buf_mpeg.dw1.h_subsample_factor = MC_SUB_1H;
-
- buffer_info->corr.dw0.type = CMD_3D;
- buffer_info->corr.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
- buffer_info->corr.dw0.length = 1;
- buffer_info->corr.dw1.aux_id = 0;
- buffer_info->corr.dw1.buffer_id = BUFFERID_MC_INTRA_CORR;
- buffer_info->corr.dw1.aux_id = 0;
- buffer_info->corr.dw1.fence_regs = 0;
- buffer_info->corr.dw1.tiled_surface = 0;
- buffer_info->corr.dw1.walk = 0;
- buffer_info->corr.dw1.pitch = 0;
- buffer_info->corr.dw2.base_address = (pI915XvMC->corrdata.offset >> 2); /* starting DWORD address */
+ i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
+ struct i915_mc_static_indirect_state_buffer *buffer_info =
+ (struct i915_mc_static_indirect_state_buffer *)pI915XvMC->sis.map;
+
+ memset(buffer_info, 0, sizeof(*buffer_info));
+ /* dest Y */
+ buffer_info->dest_y.dw0.type = CMD_3D;
+ buffer_info->dest_y.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
+ buffer_info->dest_y.dw0.length = 1;
+ buffer_info->dest_y.dw1.aux_id = 0;
+ buffer_info->dest_y.dw1.buffer_id = BUFFERID_COLOR_BACK;
+ buffer_info->dest_y.dw1.fence_regs = 0; /* disabled *//* FIXME: tiled y for performance */
+ buffer_info->dest_y.dw1.tiled_surface = 0; /* linear */
+ buffer_info->dest_y.dw1.walk = TILEWALK_XMAJOR;
+
+ /* dest U */
+ buffer_info->dest_u.dw0.type = CMD_3D;
+ buffer_info->dest_u.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
+ buffer_info->dest_u.dw0.length = 1;
+ buffer_info->dest_u.dw1.aux_id = 0;
+ buffer_info->dest_u.dw1.buffer_id = BUFFERID_COLOR_AUX;
+ buffer_info->dest_u.dw1.fence_regs = 0;
+ buffer_info->dest_u.dw1.tiled_surface = 0;
+ buffer_info->dest_u.dw1.walk = TILEWALK_XMAJOR;
+
+ /* dest V */
+ buffer_info->dest_v.dw0.type = CMD_3D;
+ buffer_info->dest_v.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
+ buffer_info->dest_v.dw0.length = 1;
+ buffer_info->dest_v.dw1.aux_id = 1;
+ buffer_info->dest_v.dw1.buffer_id = BUFFERID_COLOR_AUX;
+ buffer_info->dest_v.dw1.fence_regs = 0;
+ buffer_info->dest_v.dw1.tiled_surface = 0;
+ buffer_info->dest_v.dw1.walk = TILEWALK_XMAJOR;
+
+ buffer_info->dest_buf.dw0.type = CMD_3D;
+ buffer_info->dest_buf.dw0.opcode = OPC_3DSTATE_DEST_BUFFER_VARIABLES;
+ buffer_info->dest_buf.dw0.length = 0;
+ buffer_info->dest_buf.dw1.dest_v_bias = 8; /* 0.5 */
+ buffer_info->dest_buf.dw1.dest_h_bias = 8; /* 0.5 */
+ buffer_info->dest_buf.dw1.color_fmt = COLORBUFFER_8BIT;
+ buffer_info->dest_buf.dw1.v_ls = 0; /* fill later */
+ buffer_info->dest_buf.dw1.v_ls_offset = 0; /* fill later */
+
+ buffer_info->dest_buf_mpeg.dw0.type = CMD_3D;
+ buffer_info->dest_buf_mpeg.dw0.opcode =
+ OPC_3DSTATE_DEST_BUFFER_VARIABLES_MPEG;
+ buffer_info->dest_buf_mpeg.dw0.length = 1;
+ buffer_info->dest_buf_mpeg.dw1.decode_mode = MPEG_DECODE_MC;
+ buffer_info->dest_buf_mpeg.dw1.rcontrol = 0; /* for MPEG-1/MPEG-2 */
+ buffer_info->dest_buf_mpeg.dw1.bidir_avrg_control = 0; /* for MPEG-1/MPEG-2/MPEG-4 */
+ buffer_info->dest_buf_mpeg.dw1.abort_on_error = 1;
+ buffer_info->dest_buf_mpeg.dw1.intra8 = 0; /* 16-bit formatted correction data */
+ buffer_info->dest_buf_mpeg.dw1.tff = 1; /* fill later */
+
+ buffer_info->dest_buf_mpeg.dw1.v_subsample_factor = MC_SUB_1V;
+ buffer_info->dest_buf_mpeg.dw1.h_subsample_factor = MC_SUB_1H;
+
+ buffer_info->corr.dw0.type = CMD_3D;
+ buffer_info->corr.dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
+ buffer_info->corr.dw0.length = 1;
+ buffer_info->corr.dw1.aux_id = 0;
+ buffer_info->corr.dw1.buffer_id = BUFFERID_MC_INTRA_CORR;
+ buffer_info->corr.dw1.aux_id = 0;
+ buffer_info->corr.dw1.fence_regs = 0;
+ buffer_info->corr.dw1.tiled_surface = 0;
+ buffer_info->corr.dw1.walk = 0;
+ buffer_info->corr.dw1.pitch = 0;
+ buffer_info->corr.dw2.base_address = (pI915XvMC->corrdata.offset >> 2); /* starting DWORD address */
}
-static void i915_mc_static_indirect_state_set(XvMCContext *context, XvMCSurface *dest,
- unsigned int picture_structure, unsigned int flags, unsigned int picture_coding_type)
+static void i915_mc_static_indirect_state_set(XvMCContext * context,
+ XvMCSurface * dest,
+ unsigned int picture_structure,
+ unsigned int flags,
+ unsigned int picture_coding_type)
{
- i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
- i915XvMCSurface *pI915Surface = (i915XvMCSurface *)dest->privData;
- struct i915_mc_static_indirect_state_buffer *buffer_info =
- (struct i915_mc_static_indirect_state_buffer *)pI915XvMC->sis.map;
- unsigned int w = dest->width;
-
- buffer_info->dest_y.dw1.pitch = (pI915Surface->yStride >> 2); /* in DWords */
- buffer_info->dest_y.dw2.base_address = (YOFFSET(pI915Surface) >> 2); /* starting DWORD address */
- buffer_info->dest_u.dw1.pitch = (pI915Surface->uvStride >> 2); /* in DWords */
- buffer_info->dest_u.dw2.base_address = (UOFFSET(pI915Surface) >> 2); /* starting DWORD address */
- buffer_info->dest_v.dw1.pitch = (pI915Surface->uvStride >> 2); /* in Dwords */
- buffer_info->dest_v.dw2.base_address = (VOFFSET(pI915Surface) >> 2); /* starting DWORD address */
-
- if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_FRAME_PICTURE) {
- ;
- } else if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_TOP_FIELD) {
- buffer_info->dest_buf.dw1.v_ls = 1;
- } else if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_BOTTOM_FIELD) {
- buffer_info->dest_buf.dw1.v_ls = 1;
- buffer_info->dest_buf.dw1.v_ls_offset = 1;
- }
-
- if (picture_structure & XVMC_FRAME_PICTURE) {
- ;
- } else if (picture_structure & XVMC_TOP_FIELD) {
- if (flags & XVMC_SECOND_FIELD)
- buffer_info->dest_buf_mpeg.dw1.tff = 0;
- else
- buffer_info->dest_buf_mpeg.dw1.tff = 1;
- } else if (picture_structure & XVMC_BOTTOM_FIELD) {
- if (flags & XVMC_SECOND_FIELD)
- buffer_info->dest_buf_mpeg.dw1.tff = 1;
- else
- buffer_info->dest_buf_mpeg.dw1.tff = 0;
- }
-
- buffer_info->dest_buf_mpeg.dw1.picture_width = (dest->width >> 4); /* in macroblocks */
- buffer_info->dest_buf_mpeg.dw2.picture_coding_type = picture_coding_type;
+ i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
+ i915XvMCSurface *pI915Surface = (i915XvMCSurface *) dest->privData;
+ struct i915_mc_static_indirect_state_buffer *buffer_info =
+ (struct i915_mc_static_indirect_state_buffer *)pI915XvMC->sis.map;
+ unsigned int w = dest->width;
+
+ buffer_info->dest_y.dw1.pitch = (pI915Surface->yStride >> 2); /* in DWords */
+ buffer_info->dest_y.dw2.base_address = (YOFFSET(pI915Surface) >> 2); /* starting DWORD address */
+ buffer_info->dest_u.dw1.pitch = (pI915Surface->uvStride >> 2); /* in DWords */
+ buffer_info->dest_u.dw2.base_address = (UOFFSET(pI915Surface) >> 2); /* starting DWORD address */
+ buffer_info->dest_v.dw1.pitch = (pI915Surface->uvStride >> 2); /* in Dwords */
+ buffer_info->dest_v.dw2.base_address = (VOFFSET(pI915Surface) >> 2); /* starting DWORD address */
+
+ if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_FRAME_PICTURE) {
+ ;
+ } else if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_TOP_FIELD) {
+ buffer_info->dest_buf.dw1.v_ls = 1;
+ } else if ((picture_structure & XVMC_FRAME_PICTURE) ==
+ XVMC_BOTTOM_FIELD) {
+ buffer_info->dest_buf.dw1.v_ls = 1;
+ buffer_info->dest_buf.dw1.v_ls_offset = 1;
+ }
+
+ if (picture_structure & XVMC_FRAME_PICTURE) {
+ ;
+ } else if (picture_structure & XVMC_TOP_FIELD) {
+ if (flags & XVMC_SECOND_FIELD)
+ buffer_info->dest_buf_mpeg.dw1.tff = 0;
+ else
+ buffer_info->dest_buf_mpeg.dw1.tff = 1;
+ } else if (picture_structure & XVMC_BOTTOM_FIELD) {
+ if (flags & XVMC_SECOND_FIELD)
+ buffer_info->dest_buf_mpeg.dw1.tff = 1;
+ else
+ buffer_info->dest_buf_mpeg.dw1.tff = 0;
+ }
+
+ buffer_info->dest_buf_mpeg.dw1.picture_width = (dest->width >> 4); /* in macroblocks */
+ buffer_info->dest_buf_mpeg.dw2.picture_coding_type =
+ picture_coding_type;
}
-static void i915_mc_map_state_init(XvMCContext *context)
+static void i915_mc_map_state_init(XvMCContext * context)
{
- i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
- unsigned int w = context->width;
- unsigned int h = context->height;
- struct i915_mc_map_state *map_state;
-
- map_state = (struct i915_mc_map_state *)pI915XvMC->msb.map;
-
- memset(map_state, 0, sizeof(*map_state));
-
- /* 3DSATE_MAP_STATE: Y */
- map_state->y_map.dw0.type = CMD_3D;
- map_state->y_map.dw0.opcode = OPC_3DSTATE_MAP_STATE;
- map_state->y_map.dw0.retain = 1;
- map_state->y_map.dw0.length = 6;
- map_state->y_map.dw1.map_mask = MAP_MAP0 | MAP_MAP1;
-
- /* Y Forward (Past) */
- map_state->y_forward.tm0.v_ls_offset = 0;
- map_state->y_forward.tm0.v_ls = 0;
- map_state->y_forward.tm1.tile_walk = TILEWALK_XMAJOR;
- map_state->y_forward.tm1.tiled_surface = 0;
- map_state->y_forward.tm1.utilize_fence_regs = 0;
- map_state->y_forward.tm1.texel_fmt = 0; /* 8bit */
- map_state->y_forward.tm1.surface_fmt = 1; /* 8bit */
- map_state->y_forward.tm1.width = w - 1;
- map_state->y_forward.tm1.height = h - 1;
- map_state->y_forward.tm2.depth = 0;
- map_state->y_forward.tm2.max_lod = 0;
- map_state->y_forward.tm2.cube_face = 0;
-
- /* Y Backward (Future) */
- map_state->y_backward.tm0.v_ls_offset = 0;
- map_state->y_backward.tm0.v_ls = 0;
- map_state->y_backward.tm1.tile_walk = TILEWALK_XMAJOR;
- map_state->y_backward.tm1.tiled_surface = 0;
- map_state->y_backward.tm1.utilize_fence_regs = 0;
- map_state->y_backward.tm1.texel_fmt = 0; /* 8bit */
- map_state->y_backward.tm1.surface_fmt = 1; /* 8bit */
- map_state->y_backward.tm1.width = w - 1;
- map_state->y_backward.tm1.height = h - 1;
- map_state->y_backward.tm2.depth = 0;
- map_state->y_backward.tm2.max_lod = 0;
- map_state->y_backward.tm2.cube_face = 0;
-
- /* 3DSATE_MAP_STATE: U */
- map_state->u_map.dw0.type = CMD_3D;
- map_state->u_map.dw0.opcode = OPC_3DSTATE_MAP_STATE;
- map_state->u_map.dw0.retain = 1;
- map_state->u_map.dw0.length = 6;
- map_state->u_map.dw1.map_mask = MAP_MAP0 | MAP_MAP1;
-
- /* U Forward */
- map_state->u_forward.tm0.v_ls_offset = 0;
- map_state->u_forward.tm0.v_ls = 0;
- map_state->u_forward.tm1.tile_walk = TILEWALK_XMAJOR;
- map_state->u_forward.tm1.tiled_surface = 0;
- map_state->u_forward.tm1.utilize_fence_regs = 0;
- map_state->u_forward.tm1.texel_fmt = 0; /* 8bit */
- map_state->u_forward.tm1.surface_fmt = 1; /* 8bit */
- map_state->u_forward.tm1.width = (w >> 1) - 1;
- map_state->u_forward.tm1.height = (h >> 1) - 1;
- map_state->u_forward.tm2.depth = 0;
- map_state->u_forward.tm2.max_lod = 0;
- map_state->u_forward.tm2.cube_face = 0;
-
- /* U Backward */
- map_state->u_backward.tm0.v_ls_offset = 0;
- map_state->u_backward.tm0.v_ls = 0;
- map_state->u_backward.tm1.tile_walk = TILEWALK_XMAJOR;
- map_state->u_backward.tm1.tiled_surface = 0;
- map_state->u_backward.tm1.utilize_fence_regs = 0;
- map_state->u_backward.tm1.texel_fmt = 0;
- map_state->u_backward.tm1.surface_fmt = 1;
- map_state->u_backward.tm1.width = (w >> 1) - 1;
- map_state->u_backward.tm1.height = (h >> 1) - 1;
- map_state->u_backward.tm2.depth = 0;
- map_state->u_backward.tm2.max_lod = 0;
- map_state->u_backward.tm2.cube_face = 0;
-
- /* 3DSATE_MAP_STATE: V */
- map_state->v_map.dw0.type = CMD_3D;
- map_state->v_map.dw0.opcode = OPC_3DSTATE_MAP_STATE;
- map_state->v_map.dw0.retain = 1;
- map_state->v_map.dw0.length = 6;
- map_state->v_map.dw1.map_mask = MAP_MAP0 | MAP_MAP1;
-
- /* V Forward */
- map_state->v_forward.tm0.v_ls_offset = 0;
- map_state->v_forward.tm0.v_ls = 0;
- map_state->v_forward.tm1.tile_walk = TILEWALK_XMAJOR;
- map_state->v_forward.tm1.tiled_surface = 0;
- map_state->v_forward.tm1.utilize_fence_regs = 0;
- map_state->v_forward.tm1.texel_fmt = 0;
- map_state->v_forward.tm1.surface_fmt = 1;
- map_state->v_forward.tm1.width = (w >> 1) - 1;
- map_state->v_forward.tm1.height = (h >> 1) - 1;
- map_state->v_forward.tm2.depth = 0;
- map_state->v_forward.tm2.max_lod = 0;
- map_state->v_forward.tm2.cube_face = 0;
-
- /* V Backward */
- map_state->v_backward.tm0.v_ls_offset = 0;
- map_state->v_backward.tm0.v_ls = 0;
- map_state->v_backward.tm1.tile_walk = TILEWALK_XMAJOR;
- map_state->v_backward.tm1.tiled_surface = 0;
- map_state->v_backward.tm1.utilize_fence_regs = 0;
- map_state->v_backward.tm1.texel_fmt = 0;
- map_state->v_backward.tm1.surface_fmt = 1;
- map_state->v_backward.tm1.width = (w >> 1) - 1;
- map_state->v_backward.tm1.height = (h >> 1) - 1;
- map_state->v_backward.tm2.depth = 0;
- map_state->v_backward.tm2.max_lod = 0;
- map_state->v_backward.tm2.cube_face = 0;
+ i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
+ unsigned int w = context->width;
+ unsigned int h = context->height;
+ struct i915_mc_map_state *map_state;
+
+ map_state = (struct i915_mc_map_state *)pI915XvMC->msb.map;
+
+ memset(map_state, 0, sizeof(*map_state));
+
+ /* 3DSATE_MAP_STATE: Y */
+ map_state->y_map.dw0.type = CMD_3D;
+ map_state->y_map.dw0.opcode = OPC_3DSTATE_MAP_STATE;
+ map_state->y_map.dw0.retain = 1;
+ map_state->y_map.dw0.length = 6;
+ map_state->y_map.dw1.map_mask = MAP_MAP0 | MAP_MAP1;
+
+ /* Y Forward (Past) */
+ map_state->y_forward.tm0.v_ls_offset = 0;
+ map_state->y_forward.tm0.v_ls = 0;
+ map_state->y_forward.tm1.tile_walk = TILEWALK_XMAJOR;
+ map_state->y_forward.tm1.tiled_surface = 0;
+ map_state->y_forward.tm1.utilize_fence_regs = 0;
+ map_state->y_forward.tm1.texel_fmt = 0; /* 8bit */
+ map_state->y_forward.tm1.surface_fmt = 1; /* 8bit */
+ map_state->y_forward.tm1.width = w - 1;
+ map_state->y_forward.tm1.height = h - 1;
+ map_state->y_forward.tm2.depth = 0;
+ map_state->y_forward.tm2.max_lod = 0;
+ map_state->y_forward.tm2.cube_face = 0;
+
+ /* Y Backward (Future) */
+ map_state->y_backward.tm0.v_ls_offset = 0;
+ map_state->y_backward.tm0.v_ls = 0;
+ map_state->y_backward.tm1.tile_walk = TILEWALK_XMAJOR;
+ map_state->y_backward.tm1.tiled_surface = 0;
+ map_state->y_backward.tm1.utilize_fence_regs = 0;
+ map_state->y_backward.tm1.texel_fmt = 0; /* 8bit */
+ map_state->y_backward.tm1.surface_fmt = 1; /* 8bit */
+ map_state->y_backward.tm1.width = w - 1;
+ map_state->y_backward.tm1.height = h - 1;
+ map_state->y_backward.tm2.depth = 0;
+ map_state->y_backward.tm2.max_lod = 0;
+ map_state->y_backward.tm2.cube_face = 0;
+
+ /* 3DSATE_MAP_STATE: U */
+ map_state->u_map.dw0.type = CMD_3D;
+ map_state->u_map.dw0.opcode = OPC_3DSTATE_MAP_STATE;
+ map_state->u_map.dw0.retain = 1;
+ map_state->u_map.dw0.length = 6;
+ map_state->u_map.dw1.map_mask = MAP_MAP0 | MAP_MAP1;
+
+ /* U Forward */
+ map_state->u_forward.tm0.v_ls_offset = 0;
+ map_state->u_forward.tm0.v_ls = 0;
+ map_state->u_forward.tm1.tile_walk = TILEWALK_XMAJOR;
+ map_state->u_forward.tm1.tiled_surface = 0;
+ map_state->u_forward.tm1.utilize_fence_regs = 0;
+ map_state->u_forward.tm1.texel_fmt = 0; /* 8bit */
+ map_state->u_forward.tm1.surface_fmt = 1; /* 8bit */
+ map_state->u_forward.tm1.width = (w >> 1) - 1;
+ map_state->u_forward.tm1.height = (h >> 1) - 1;
+ map_state->u_forward.tm2.depth = 0;
+ map_state->u_forward.tm2.max_lod = 0;
+ map_state->u_forward.tm2.cube_face = 0;
+
+ /* U Backward */
+ map_state->u_backward.tm0.v_ls_offset = 0;
+ map_state->u_backward.tm0.v_ls = 0;
+ map_state->u_backward.tm1.tile_walk = TILEWALK_XMAJOR;
+ map_state->u_backward.tm1.tiled_surface = 0;
+ map_state->u_backward.tm1.utilize_fence_regs = 0;
+ map_state->u_backward.tm1.texel_fmt = 0;
+ map_state->u_backward.tm1.surface_fmt = 1;
+ map_state->u_backward.tm1.width = (w >> 1) - 1;
+ map_state->u_backward.tm1.height = (h >> 1) - 1;
+ map_state->u_backward.tm2.depth = 0;
+ map_state->u_backward.tm2.max_lod = 0;
+ map_state->u_backward.tm2.cube_face = 0;
+
+ /* 3DSATE_MAP_STATE: V */
+ map_state->v_map.dw0.type = CMD_3D;
+ map_state->v_map.dw0.opcode = OPC_3DSTATE_MAP_STATE;
+ map_state->v_map.dw0.retain = 1;
+ map_state->v_map.dw0.length = 6;
+ map_state->v_map.dw1.map_mask = MAP_MAP0 | MAP_MAP1;
+
+ /* V Forward */
+ map_state->v_forward.tm0.v_ls_offset = 0;
+ map_state->v_forward.tm0.v_ls = 0;
+ map_state->v_forward.tm1.tile_walk = TILEWALK_XMAJOR;
+ map_state->v_forward.tm1.tiled_surface = 0;
+ map_state->v_forward.tm1.utilize_fence_regs = 0;
+ map_state->v_forward.tm1.texel_fmt = 0;
+ map_state->v_forward.tm1.surface_fmt = 1;
+ map_state->v_forward.tm1.width = (w >> 1) - 1;
+ map_state->v_forward.tm1.height = (h >> 1) - 1;
+ map_state->v_forward.tm2.depth = 0;
+ map_state->v_forward.tm2.max_lod = 0;
+ map_state->v_forward.tm2.cube_face = 0;
+
+ /* V Backward */
+ map_state->v_backward.tm0.v_ls_offset = 0;
+ map_state->v_backward.tm0.v_ls = 0;
+ map_state->v_backward.tm1.tile_walk = TILEWALK_XMAJOR;
+ map_state->v_backward.tm1.tiled_surface = 0;
+ map_state->v_backward.tm1.utilize_fence_regs = 0;
+ map_state->v_backward.tm1.texel_fmt = 0;
+ map_state->v_backward.tm1.surface_fmt = 1;
+ map_state->v_backward.tm1.width = (w >> 1) - 1;
+ map_state->v_backward.tm1.height = (h >> 1) - 1;
+ map_state->v_backward.tm2.depth = 0;
+ map_state->v_backward.tm2.max_lod = 0;
+ map_state->v_backward.tm2.cube_face = 0;
}
-static void i915_mc_map_state_set(XvMCContext *context,
- i915XvMCSurface *privPast,
- i915XvMCSurface *privFuture)
+static void i915_mc_map_state_set(XvMCContext * context,
+ i915XvMCSurface * privPast,
+ i915XvMCSurface * privFuture)
{
- i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
- struct i915_mc_map_state *map_state;
-
- map_state = (struct i915_mc_map_state *)pI915XvMC->msb.map;
-
- map_state->y_forward.tm0.base_address = (YOFFSET(privPast) >> 2);
- map_state->y_forward.tm2.pitch = (privPast->yStride >> 2) - 1; /* in DWords - 1 */
- map_state->y_backward.tm0.base_address = (YOFFSET(privFuture) >> 2);
- map_state->y_backward.tm2.pitch = (privFuture->yStride >> 2) - 1;
- map_state->u_forward.tm0.base_address = (UOFFSET(privPast) >> 2);
- map_state->u_forward.tm2.pitch = (privPast->uvStride >> 2) - 1; /* in DWords - 1 */
- map_state->u_backward.tm0.base_address = (UOFFSET(privFuture) >> 2);
- map_state->u_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
- map_state->v_forward.tm0.base_address = (VOFFSET(privPast) >> 2);
- map_state->v_forward.tm2.pitch = (privPast->uvStride >> 2) - 1; /* in DWords - 1 */
- map_state->v_backward.tm0.base_address = (VOFFSET(privFuture) >> 2);
- map_state->v_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
+ i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
+ struct i915_mc_map_state *map_state;
+
+ map_state = (struct i915_mc_map_state *)pI915XvMC->msb.map;
+
+ map_state->y_forward.tm0.base_address = (YOFFSET(privPast) >> 2);
+ map_state->y_forward.tm2.pitch = (privPast->yStride >> 2) - 1; /* in DWords - 1 */
+ map_state->y_backward.tm0.base_address = (YOFFSET(privFuture) >> 2);
+ map_state->y_backward.tm2.pitch = (privFuture->yStride >> 2) - 1;
+ map_state->u_forward.tm0.base_address = (UOFFSET(privPast) >> 2);
+ map_state->u_forward.tm2.pitch = (privPast->uvStride >> 2) - 1; /* in DWords - 1 */
+ map_state->u_backward.tm0.base_address = (UOFFSET(privFuture) >> 2);
+ map_state->u_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
+ map_state->v_forward.tm0.base_address = (VOFFSET(privPast) >> 2);
+ map_state->v_forward.tm2.pitch = (privPast->uvStride >> 2) - 1; /* in DWords - 1 */
+ map_state->v_backward.tm0.base_address = (VOFFSET(privFuture) >> 2);
+ map_state->v_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
}
static void i915_flush(int map, int render)
{
- struct i915_mi_flush mi_flush;
+ struct i915_mi_flush mi_flush;
- memset(&mi_flush, 0, sizeof(mi_flush));
- mi_flush.dw0.type = CMD_MI;
- mi_flush.dw0.opcode = OPC_MI_FLUSH;
- mi_flush.dw0.map_cache_invalidate = map;
- mi_flush.dw0.render_cache_flush_inhibit = render;
+ memset(&mi_flush, 0, sizeof(mi_flush));
+ mi_flush.dw0.type = CMD_MI;
+ mi_flush.dw0.opcode = OPC_MI_FLUSH;
+ mi_flush.dw0.map_cache_invalidate = map;
+ mi_flush.dw0.render_cache_flush_inhibit = render;
- intelBatchbufferData(&mi_flush, sizeof(mi_flush), 0);
+ intelBatchbufferData(&mi_flush, sizeof(mi_flush), 0);
}
-static void i915_mc_load_indirect_render_init(XvMCContext *context)
+static void i915_mc_load_indirect_render_init(XvMCContext * context)
{
- i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
- sis_state *sis;
- msb_state *msb;
- struct i915_3dstate_load_indirect *load_indirect;
- int mem_select;
-
- mc_render_load_indirect_size = sizeof(*load_indirect) + sizeof(*sis)
- + sizeof(*msb);
- mc_render_load_indirect = calloc(1, mc_render_load_indirect_size);
-
- load_indirect = (struct i915_3dstate_load_indirect *)mc_render_load_indirect;
- load_indirect->dw0.type = CMD_3D;
- load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;
- load_indirect->dw0.block_mask = BLOCK_SIS | BLOCK_MSB;
- load_indirect->dw0.length = (mc_render_load_indirect_size >> 2) - 2;
-
- if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
- pI915XvMC->deviceID == PCI_CHIP_I915_GM)
- mem_select = 0;
- else
- mem_select = 1;
-
- load_indirect->dw0.mem_select = mem_select;
-
- /* Static Indirect state buffer (dest buffer info) */
- sis = (sis_state *)(++load_indirect);
- sis->dw0.valid = 1;
- sis->dw0.force = 1;
- sis->dw1.length = 16; /* 4 * 3 + 2 + 3 - 1 */
-
- if (mem_select)
- sis->dw0.buffer_address = (pI915XvMC->sis.offset >> 2);
- else
- sis->dw0.buffer_address = (pI915XvMC->sis.bus_addr >> 2);
-
- /* Map state buffer (reference buffer info) */
- msb = (msb_state *)(++sis);
- msb->dw0.valid = 1;
- msb->dw0.force = 1;
- msb->dw1.length = 23; /* 3 * 8 - 1 */
-
- if (mem_select)
- msb->dw0.buffer_address = (pI915XvMC->msb.offset >> 2);
- else
- msb->dw0.buffer_address = (pI915XvMC->msb.bus_addr >> 2);
+ i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
+ sis_state *sis;
+ msb_state *msb;
+ struct i915_3dstate_load_indirect *load_indirect;
+ int mem_select;
+
+ mc_render_load_indirect_size = sizeof(*load_indirect) + sizeof(*sis)
+ + sizeof(*msb);
+ mc_render_load_indirect = calloc(1, mc_render_load_indirect_size);
+
+ load_indirect =
+ (struct i915_3dstate_load_indirect *)mc_render_load_indirect;
+ load_indirect->dw0.type = CMD_3D;
+ load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;
+ load_indirect->dw0.block_mask = BLOCK_SIS | BLOCK_MSB;
+ load_indirect->dw0.length = (mc_render_load_indirect_size >> 2) - 2;
+
+ if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
+ pI915XvMC->deviceID == PCI_CHIP_I915_GM)
+ mem_select = 0;
+ else
+ mem_select = 1;
+
+ load_indirect->dw0.mem_select = mem_select;
+
+ /* Static Indirect state buffer (dest buffer info) */
+ sis = (sis_state *) (++load_indirect);
+ sis->dw0.valid = 1;
+ sis->dw0.force = 1;
+ sis->dw1.length = 16; /* 4 * 3 + 2 + 3 - 1 */
+
+ if (mem_select)
+ sis->dw0.buffer_address = (pI915XvMC->sis.offset >> 2);
+ else
+ sis->dw0.buffer_address = (pI915XvMC->sis.bus_addr >> 2);
+
+ /* Map state buffer (reference buffer info) */
+ msb = (msb_state *) (++sis);
+ msb->dw0.valid = 1;
+ msb->dw0.force = 1;
+ msb->dw1.length = 23; /* 3 * 8 - 1 */
+
+ if (mem_select)
+ msb->dw0.buffer_address = (pI915XvMC->msb.offset >> 2);
+ else
+ msb->dw0.buffer_address = (pI915XvMC->msb.bus_addr >> 2);
}
static void i915_mc_load_indirect_render_emit(void)
{
- i915_emit_batch(mc_render_load_indirect, mc_render_load_indirect_size, 0);
+ i915_emit_batch(mc_render_load_indirect, mc_render_load_indirect_size,
+ 0);
}
-static void i915_mc_mpeg_set_origin(XvMCContext *context, XvMCMacroBlock *mb)
+static void i915_mc_mpeg_set_origin(XvMCContext * context, XvMCMacroBlock * mb)
{
- struct i915_3dmpeg_set_origin set_origin;
+ struct i915_3dmpeg_set_origin set_origin;
- /* 3DMPEG_SET_ORIGIN */
- memset(&set_origin, 0, sizeof(set_origin));
- set_origin.dw0.type = CMD_3D;
- set_origin.dw0.opcode = OPC_3DMPEG_SET_ORIGIN;
- set_origin.dw0.length = 0;
- set_origin.dw1.h_origin = mb->x;
- set_origin.dw1.v_origin = mb->y;
+ /* 3DMPEG_SET_ORIGIN */
+ memset(&set_origin, 0, sizeof(set_origin));
+ set_origin.dw0.type = CMD_3D;
+ set_origin.dw0.opcode = OPC_3DMPEG_SET_ORIGIN;
+ set_origin.dw0.length = 0;
+ set_origin.dw1.h_origin = mb->x;
+ set_origin.dw1.v_origin = mb->y;
- intelBatchbufferData(&set_origin, sizeof(set_origin), 0);
+ intelBatchbufferData(&set_origin, sizeof(set_origin), 0);
}
-static void i915_mc_mpeg_macroblock_ipicture(XvMCContext *context, XvMCMacroBlock *mb)
+static void i915_mc_mpeg_macroblock_ipicture(XvMCContext * context,
+ XvMCMacroBlock * mb)
{
- struct i915_3dmpeg_macroblock_ipicture macroblock_ipicture;
+ struct i915_3dmpeg_macroblock_ipicture macroblock_ipicture;
- /* 3DMPEG_MACROBLOCK_IPICTURE */
- memset(&macroblock_ipicture, 0, sizeof(macroblock_ipicture));
- macroblock_ipicture.dw0.type = CMD_3D;
- macroblock_ipicture.dw0.opcode = OPC_3DMPEG_MACROBLOCK_IPICTURE;
- macroblock_ipicture.dw0.dct_type = (mb->dct_type == XVMC_DCT_TYPE_FIELD);
+ /* 3DMPEG_MACROBLOCK_IPICTURE */
+ memset(&macroblock_ipicture, 0, sizeof(macroblock_ipicture));
+ macroblock_ipicture.dw0.type = CMD_3D;
+ macroblock_ipicture.dw0.opcode = OPC_3DMPEG_MACROBLOCK_IPICTURE;
+ macroblock_ipicture.dw0.dct_type =
+ (mb->dct_type == XVMC_DCT_TYPE_FIELD);
- intelBatchbufferData(&macroblock_ipicture, sizeof(macroblock_ipicture), 0);
+ intelBatchbufferData(&macroblock_ipicture, sizeof(macroblock_ipicture),
+ 0);
}
#if 0
-static void i915_mc_mpeg_macroblock_0mv(XvMCContext *context, XvMCMacroBlock *mb)
+static void i915_mc_mpeg_macroblock_0mv(XvMCContext * context,
+ XvMCMacroBlock * mb)
{
- struct i915_3dmpeg_macroblock_0mv macroblock_0mv;
-
- /* 3DMPEG_MACROBLOCK(0mv) */
- memset(&macroblock_0mv, 0, sizeof(macroblock_0mv));
- macroblock_0mv.header.dw0.type = CMD_3D;
- macroblock_0mv.header.dw0.opcode = OPC_3DMPEG_MACROBLOCK;
- macroblock_0mv.header.dw0.length = 0;
- macroblock_0mv.header.dw1.mb_intra = 1; /* should be 1 */
- macroblock_0mv.header.dw1.forward = 0; /* should be 0 */
- macroblock_0mv.header.dw1.backward = 0; /* should be 0 */
- macroblock_0mv.header.dw1.h263_4mv = 0; /* should be 0 */
- macroblock_0mv.header.dw1.dct_type = (mb->dct_type == XVMC_DCT_TYPE_FIELD);
+ struct i915_3dmpeg_macroblock_0mv macroblock_0mv;
+
+ /* 3DMPEG_MACROBLOCK(0mv) */
+ memset(&macroblock_0mv, 0, sizeof(macroblock_0mv));
+ macroblock_0mv.header.dw0.type = CMD_3D;
+ macroblock_0mv.header.dw0.opcode = OPC_3DMPEG_MACROBLOCK;
+ macroblock_0mv.header.dw0.length = 0;
+ macroblock_0mv.header.dw1.mb_intra = 1; /* should be 1 */
+ macroblock_0mv.header.dw1.forward = 0; /* should be 0 */
+ macroblock_0mv.header.dw1.backward = 0; /* should be 0 */
+ macroblock_0mv.header.dw1.h263_4mv = 0; /* should be 0 */
+ macroblock_0mv.header.dw1.dct_type =
+ (mb->dct_type == XVMC_DCT_TYPE_FIELD);
/*
if (!mb->coded_block_pattern)
macroblock_0mv.header.dw1.dct_type = XVMC_DCT_TYPE_FRAME;
*/
- macroblock_0mv.header.dw1.motion_type = 0; // (mb->motion_type & 0x3);
- macroblock_0mv.header.dw1.vertical_field_select = 0; // mb->motion_vertical_field_select & 0xf;
- macroblock_0mv.header.dw1.coded_block_pattern = mb->coded_block_pattern;
- macroblock_0mv.header.dw1.skipped_macroblocks = 0;
+ macroblock_0mv.header.dw1.motion_type = 0; // (mb->motion_type & 0x3);
+ macroblock_0mv.header.dw1.vertical_field_select = 0; // mb->motion_vertical_field_select & 0xf;
+ macroblock_0mv.header.dw1.coded_block_pattern = mb->coded_block_pattern;
+ macroblock_0mv.header.dw1.skipped_macroblocks = 0;
- intelBatchbufferData(&macroblock_0mv, sizeof(macroblock_0mv), 0);
+ intelBatchbufferData(&macroblock_0mv, sizeof(macroblock_0mv), 0);
}
#endif
-static void i915_mc_mpeg_macroblock_1fbmv(XvMCContext *context, XvMCMacroBlock *mb)
+static void i915_mc_mpeg_macroblock_1fbmv(XvMCContext * context,
+ XvMCMacroBlock * mb)
{
- struct i915_3dmpeg_macroblock_1fbmv macroblock_1fbmv;
- vector_t mv0[2];
-
- /* 3DMPEG_MACROBLOCK(1fbmv) */
- memset(&macroblock_1fbmv, 0, sizeof(macroblock_1fbmv));
- macroblock_1fbmv.header.dw0.type = CMD_3D;
- macroblock_1fbmv.header.dw0.opcode = OPC_3DMPEG_MACROBLOCK;
- macroblock_1fbmv.header.dw0.length = 2;
- macroblock_1fbmv.header.dw1.mb_intra = 0; /* should be 0 */
- macroblock_1fbmv.header.dw1.forward = ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD) ? 1 : 0);
- macroblock_1fbmv.header.dw1.backward = ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD) ? 1 : 0);
- macroblock_1fbmv.header.dw1.h263_4mv = 0; /* should be 0 */
- macroblock_1fbmv.header.dw1.dct_type = (mb->dct_type == XVMC_DCT_TYPE_FIELD);
-
- if (!(mb->coded_block_pattern & 0x3f))
- macroblock_1fbmv.header.dw1.dct_type = XVMC_DCT_TYPE_FRAME;
-
- macroblock_1fbmv.header.dw1.motion_type = (mb->motion_type & 0x03);
- macroblock_1fbmv.header.dw1.vertical_field_select = (mb->motion_vertical_field_select & 0x0f);
- macroblock_1fbmv.header.dw1.coded_block_pattern = mb->coded_block_pattern;
- macroblock_1fbmv.header.dw1.skipped_macroblocks = 0;
-
- mv0[0].component[0] = mb->PMV[0][0][0];
- mv0[0].component[1] = mb->PMV[0][0][1];
- mv0[1].component[0] = mb->PMV[0][1][0];
- mv0[1].component[1] = mb->PMV[0][1][1];
-
- macroblock_1fbmv.dw2 = mv0[0].v;
- macroblock_1fbmv.dw3 = mv0[1].v;
-
- intelBatchbufferData(&macroblock_1fbmv, sizeof(macroblock_1fbmv), 0);
+ struct i915_3dmpeg_macroblock_1fbmv macroblock_1fbmv;
+ vector_t mv0[2];
+
+ /* 3DMPEG_MACROBLOCK(1fbmv) */
+ memset(&macroblock_1fbmv, 0, sizeof(macroblock_1fbmv));
+ macroblock_1fbmv.header.dw0.type = CMD_3D;
+ macroblock_1fbmv.header.dw0.opcode = OPC_3DMPEG_MACROBLOCK;
+ macroblock_1fbmv.header.dw0.length = 2;
+ macroblock_1fbmv.header.dw1.mb_intra = 0; /* should be 0 */
+ macroblock_1fbmv.header.dw1.forward =
+ ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD) ? 1 : 0);
+ macroblock_1fbmv.header.dw1.backward =
+ ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD) ? 1 : 0);
+ macroblock_1fbmv.header.dw1.h263_4mv = 0; /* should be 0 */
+ macroblock_1fbmv.header.dw1.dct_type =
+ (mb->dct_type == XVMC_DCT_TYPE_FIELD);
+
+ if (!(mb->coded_block_pattern & 0x3f))
+ macroblock_1fbmv.header.dw1.dct_type = XVMC_DCT_TYPE_FRAME;
+
+ macroblock_1fbmv.header.dw1.motion_type = (mb->motion_type & 0x03);
+ macroblock_1fbmv.header.dw1.vertical_field_select =
+ (mb->motion_vertical_field_select & 0x0f);
+ macroblock_1fbmv.header.dw1.coded_block_pattern =
+ mb->coded_block_pattern;
+ macroblock_1fbmv.header.dw1.skipped_macroblocks = 0;
+
+ mv0[0].component[0] = mb->PMV[0][0][0];
+ mv0[0].component[1] = mb->PMV[0][0][1];
+ mv0[1].component[0] = mb->PMV[0][1][0];
+ mv0[1].component[1] = mb->PMV[0][1][1];
+
+ macroblock_1fbmv.dw2 = mv0[0].v;
+ macroblock_1fbmv.dw3 = mv0[1].v;
+
+ intelBatchbufferData(&macroblock_1fbmv, sizeof(macroblock_1fbmv), 0);
}
-static void i915_mc_mpeg_macroblock_2fbmv(XvMCContext *context, XvMCMacroBlock *mb, unsigned int ps)
+static void i915_mc_mpeg_macroblock_2fbmv(XvMCContext * context,
+ XvMCMacroBlock * mb, unsigned int ps)
{
- struct i915_3dmpeg_macroblock_2fbmv macroblock_2fbmv;
- vector_t mv0[2];
- vector_t mv1[2];
-
- /* 3DMPEG_MACROBLOCK(2fbmv) */
- memset(&macroblock_2fbmv, 0, sizeof(macroblock_2fbmv));
- macroblock_2fbmv.header.dw0.type = CMD_3D;
- macroblock_2fbmv.header.dw0.opcode = OPC_3DMPEG_MACROBLOCK;
- macroblock_2fbmv.header.dw0.length = 4;
- macroblock_2fbmv.header.dw1.mb_intra = 0; /* should be 0 */
- macroblock_2fbmv.header.dw1.forward = ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD) ? 1 : 0);
- macroblock_2fbmv.header.dw1.backward = ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD) ? 1 : 0);
- macroblock_2fbmv.header.dw1.h263_4mv = 0; /* should be 0 */
- macroblock_2fbmv.header.dw1.dct_type = (mb->dct_type == XVMC_DCT_TYPE_FIELD);
-
- if (!(mb->coded_block_pattern & 0x3f))
- macroblock_2fbmv.header.dw1.dct_type = XVMC_DCT_TYPE_FRAME;
-
- macroblock_2fbmv.header.dw1.motion_type = (mb->motion_type & 0x03);
- macroblock_2fbmv.header.dw1.vertical_field_select = (mb->motion_vertical_field_select & 0x0f);
- macroblock_2fbmv.header.dw1.coded_block_pattern = mb->coded_block_pattern;
- macroblock_2fbmv.header.dw1.skipped_macroblocks = 0;
-
- mv0[0].component[0] = mb->PMV[0][0][0];
- mv0[0].component[1] = mb->PMV[0][0][1];
- mv0[1].component[0] = mb->PMV[0][1][0];
- mv0[1].component[1] = mb->PMV[0][1][1];
- mv1[0].component[0] = mb->PMV[1][0][0];
- mv1[0].component[1] = mb->PMV[1][0][1];
- mv1[1].component[0] = mb->PMV[1][1][0];
- mv1[1].component[1] = mb->PMV[1][1][1];
-
- if ((ps & XVMC_FRAME_PICTURE) == XVMC_FRAME_PICTURE) {
- if ((mb->motion_type & 3) == XVMC_PREDICTION_FIELD) {
- mv0[0].component[1] = mb->PMV[0][0][1] >> 1;
- mv0[1].component[1] = mb->PMV[0][1][1] >> 1;
- mv1[0].component[1] = mb->PMV[1][0][1] >> 1;
- mv1[1].component[1] = mb->PMV[1][1][1] >> 1;
- } else if ((mb->motion_type & 3) == XVMC_PREDICTION_DUAL_PRIME) {
- mv0[0].component[1] = mb->PMV[0][0][1] >> 1;
- mv0[1].component[1] = mb->PMV[0][1][1] >> 1; // MPEG2 MV[0][1] isn't used
- mv1[0].component[1] = mb->PMV[1][0][1] >> 1;
- mv1[1].component[1] = mb->PMV[1][1][1] >> 1;
- }
- }
-
- macroblock_2fbmv.dw2 = mv0[0].v;
- macroblock_2fbmv.dw3 = mv0[1].v;
- macroblock_2fbmv.dw4 = mv1[0].v;
- macroblock_2fbmv.dw5 = mv1[1].v;
-
- intelBatchbufferData(&macroblock_2fbmv, sizeof(macroblock_2fbmv), 0);
+ struct i915_3dmpeg_macroblock_2fbmv macroblock_2fbmv;
+ vector_t mv0[2];
+ vector_t mv1[2];
+
+ /* 3DMPEG_MACROBLOCK(2fbmv) */
+ memset(&macroblock_2fbmv, 0, sizeof(macroblock_2fbmv));
+ macroblock_2fbmv.header.dw0.type = CMD_3D;
+ macroblock_2fbmv.header.dw0.opcode = OPC_3DMPEG_MACROBLOCK;
+ macroblock_2fbmv.header.dw0.length = 4;
+ macroblock_2fbmv.header.dw1.mb_intra = 0; /* should be 0 */
+ macroblock_2fbmv.header.dw1.forward =
+ ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD) ? 1 : 0);
+ macroblock_2fbmv.header.dw1.backward =
+ ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD) ? 1 : 0);
+ macroblock_2fbmv.header.dw1.h263_4mv = 0; /* should be 0 */
+ macroblock_2fbmv.header.dw1.dct_type =
+ (mb->dct_type == XVMC_DCT_TYPE_FIELD);
+
+ if (!(mb->coded_block_pattern & 0x3f))
+ macroblock_2fbmv.header.dw1.dct_type = XVMC_DCT_TYPE_FRAME;
+
+ macroblock_2fbmv.header.dw1.motion_type = (mb->motion_type & 0x03);
+ macroblock_2fbmv.header.dw1.vertical_field_select =
+ (mb->motion_vertical_field_select & 0x0f);
+ macroblock_2fbmv.header.dw1.coded_block_pattern =
+ mb->coded_block_pattern;
+ macroblock_2fbmv.header.dw1.skipped_macroblocks = 0;
+
+ mv0[0].component[0] = mb->PMV[0][0][0];
+ mv0[0].component[1] = mb->PMV[0][0][1];
+ mv0[1].component[0] = mb->PMV[0][1][0];
+ mv0[1].component[1] = mb->PMV[0][1][1];
+ mv1[0].component[0] = mb->PMV[1][0][0];
+ mv1[0].component[1] = mb->PMV[1][0][1];
+ mv1[1].component[0] = mb->PMV[1][1][0];
+ mv1[1].component[1] = mb->PMV[1][1][1];
+
+ if ((ps & XVMC_FRAME_PICTURE) == XVMC_FRAME_PICTURE) {
+ if ((mb->motion_type & 3) == XVMC_PREDICTION_FIELD) {
+ mv0[0].component[1] = mb->PMV[0][0][1] >> 1;
+ mv0[1].component[1] = mb->PMV[0][1][1] >> 1;
+ mv1[0].component[1] = mb->PMV[1][0][1] >> 1;
+ mv1[1].component[1] = mb->PMV[1][1][1] >> 1;
+ } else if ((mb->motion_type & 3) == XVMC_PREDICTION_DUAL_PRIME) {
+ mv0[0].component[1] = mb->PMV[0][0][1] >> 1;
+ mv0[1].component[1] = mb->PMV[0][1][1] >> 1; // MPEG2 MV[0][1] isn't used
+ mv1[0].component[1] = mb->PMV[1][0][1] >> 1;
+ mv1[1].component[1] = mb->PMV[1][1][1] >> 1;
+ }
+ }
+
+ macroblock_2fbmv.dw2 = mv0[0].v;
+ macroblock_2fbmv.dw3 = mv0[1].v;
+ macroblock_2fbmv.dw4 = mv1[0].v;
+ macroblock_2fbmv.dw5 = mv1[1].v;
+
+ intelBatchbufferData(&macroblock_2fbmv, sizeof(macroblock_2fbmv), 0);
}
#if 0
-static void i915_mc_invalidate_subcontext_buffers(XvMCContext *context, unsigned int mask)
+static void i915_mc_invalidate_subcontext_buffers(XvMCContext * context,
+ unsigned int mask)
{
- struct i915_3dstate_load_indirect *load_indirect = NULL;
- sis_state *sis = NULL;
- dis_state *dis = NULL;
- ssb_state *ssb = NULL;
- msb_state *msb = NULL;
- psp_state *psp = NULL;
- psc_state *psc = NULL;
- i915XvMCContext *pI915XvMC = (i915XvMCContext *)context->privData;
- unsigned int size;
- void *base = NULL, *ptr = NULL;
-
- size = sizeof(*load_indirect);
- if (mask & BLOCK_SIS)
- size += sizeof(*sis);
- if (mask & BLOCK_DIS)
- size += sizeof(*dis);
- if (mask & BLOCK_SSB)
- size += sizeof(*ssb);
- if (mask & BLOCK_MSB)
- size += sizeof(*msb);
- if (mask & BLOCK_PSP)
- size += sizeof(*psp);
- if (mask & BLOCK_PSC)
- size += sizeof(*psc);
-
- if (size == sizeof(*load_indirect)) {
- XVMC_ERR("There must be at least one bit set\n");
- return;
- }
-
- /* 3DSTATE_LOAD_INDIRECT */
- base = calloc(1, size);
- load_indirect = (struct i915_3dstate_load_indirect *)base;
- load_indirect->dw0.type = CMD_3D;
- load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;
-
- if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
- pI915XvMC->deviceID == PCI_CHIP_I915_GM ||
- pI915XvMC->deviceID == PCI_CHIP_I945_G ||
- pI915XvMC->deviceID == PCI_CHIP_I945_GM)
- load_indirect->dw0.mem_select = 0;
- else
- load_indirect->dw0.mem_select = 1;
-
- load_indirect->dw0.block_mask = mask;
- load_indirect->dw0.length = (size >> 2) - 2;
- ptr = ++load_indirect;
-
- /* SIS */
- if (mask & BLOCK_SIS) {
- sis = (sis_state *)ptr;
- sis->dw0.valid = 0;
- sis->dw0.buffer_address = 0;
- sis->dw1.length = 0;
- ptr = ++sis;
- }
-
- /* DIS */
- if (mask & BLOCK_DIS) {
- dis = (dis_state *)ptr;
- dis->dw0.valid = 0;
- dis->dw0.reset = 0;
- dis->dw0.buffer_address = 0;
- ptr = ++dis;
- }
-
- /* SSB */
- if (mask & BLOCK_SSB) {
- ssb = (ssb_state *)ptr;
- ssb->dw0.valid = 0;
- ssb->dw0.buffer_address = 0;
- ssb->dw1.length = 0;
- ptr = ++ssb;
- }
-
- /* MSB */
- if (mask & BLOCK_MSB) {
- msb = (msb_state *)ptr;
- msb->dw0.valid = 0;
- msb->dw0.buffer_address = 0;
- msb->dw1.length = 0;
- ptr = ++msb;
- }
-
- /* PSP */
- if (mask & BLOCK_PSP) {
- psp = (psp_state *)ptr;
- psp->dw0.valid = 0;
- psp->dw0.buffer_address = 0;
- psp->dw1.length = 0;
- ptr = ++psp;
- }
-
- /* PSC */
- if (mask & BLOCK_PSC) {
- psc = (psc_state *)ptr;
- psc->dw0.valid = 0;
- psc->dw0.buffer_address = 0;
- psc->dw1.length = 0;
- ptr = ++psc;
- }
-
- intelBatchbufferData(base, size, 0);
- free(base);
+ struct i915_3dstate_load_indirect *load_indirect = NULL;
+ sis_state *sis = NULL;
+ dis_state *dis = NULL;
+ ssb_state *ssb = NULL;
+ msb_state *msb = NULL;
+ psp_state *psp = NULL;
+ psc_state *psc = NULL;
+ i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
+ unsigned int size;
+ void *base = NULL, *ptr = NULL;
+
+ size = sizeof(*load_indirect);
+ if (mask & BLOCK_SIS)
+ size += sizeof(*sis);
+ if (mask & BLOCK_DIS)
+ size += sizeof(*dis);
+ if (mask & BLOCK_SSB)
+ size += sizeof(*ssb);
+ if (mask & BLOCK_MSB)
+ size += sizeof(*msb);
+ if (mask & BLOCK_PSP)
+ size += sizeof(*psp);
+ if (mask & BLOCK_PSC)
+ size += sizeof(*psc);
+
+ if (size == sizeof(*load_indirect)) {
+ XVMC_ERR("There must be at least one bit set\n");
+ return;
+ }
+
+ /* 3DSTATE_LOAD_INDIRECT */
+ base = calloc(1, size);
+ load_indirect = (struct i915_3dstate_load_indirect *)base;
+ load_indirect->dw0.type = CMD_3D;
+ load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;
+
+ if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
+ pI915XvMC->deviceID == PCI_CHIP_I915_GM ||
+ pI915XvMC->deviceID == PCI_CHIP_I945_G ||
+ pI915XvMC->deviceID == PCI_CHIP_I945_GM)
+ load_indirect->dw0.mem_select = 0;
+ else
+ load_indirect->dw0.mem_select = 1;
+
+ load_indirect->dw0.block_mask = mask;
+ load_indirect->dw0.length = (size >> 2) - 2;
+ ptr = ++load_indirect;
+
+ /* SIS */
+ if (mask & BLOCK_SIS) {
+ sis = (sis_state *) ptr;
+ sis->dw0.valid = 0;
+ sis->dw0.buffer_address = 0;
+ sis->dw1.length = 0;
+ ptr = ++sis;
+ }
+
+ /* DIS */
+ if (mask & BLOCK_DIS) {
+ dis = (dis_state *) ptr;
+ dis->dw0.valid = 0;
+ dis->dw0.reset = 0;
+ dis->dw0.buffer_address = 0;
+ ptr = ++dis;
+ }
+
+ /* SSB */
+ if (mask & BLOCK_SSB) {
+ ssb = (ssb_state *) ptr;
+ ssb->dw0.valid = 0;
+ ssb->dw0.buffer_address = 0;
+ ssb->dw1.length = 0;
+ ptr = ++ssb;
+ }
+
+ /* MSB */
+ if (mask & BLOCK_MSB) {
+ msb = (msb_state *) ptr;
+ msb->dw0.valid = 0;
+ msb->dw0.buffer_address = 0;
+ msb->dw1.length = 0;
+ ptr = ++msb;
+ }
+
+ /* PSP */
+ if (mask & BLOCK_PSP) {
+ psp = (psp_state *) ptr;
+ psp->dw0.valid = 0;
+ psp->dw0.buffer_address = 0;
+ psp->dw1.length = 0;
+ ptr = ++psp;
+ }
+
+ /* PSC */
+ if (mask & BLOCK_PSC) {
+ psc = (psc_state *) ptr;
+ psc->dw0.valid = 0;
+ psc->dw0.buffer_address = 0;
+ psc->dw1.length = 0;
+ ptr = ++psc;
+ }
+
+ intelBatchbufferData(base, size, 0);
+ free(base);
}
#endif
-static int i915_xvmc_map_buffers(i915XvMCContext *pI915XvMC)
+static int i915_xvmc_map_buffers(i915XvMCContext * pI915XvMC)
{
- if (drmMap(xvmc_driver->fd,
- pI915XvMC->sis.handle,
- pI915XvMC->sis.size,
- (drmAddress *)&pI915XvMC->sis.map) != 0) {
- return -1;
- }
-
- if (drmMap(xvmc_driver->fd,
- pI915XvMC->ssb.handle,
- pI915XvMC->ssb.size,
- (drmAddress *)&pI915XvMC->ssb.map) != 0) {
- return -1;
- }
-
- if (drmMap(xvmc_driver->fd,
- pI915XvMC->msb.handle,
- pI915XvMC->msb.size,
- (drmAddress *)&pI915XvMC->msb.map) != 0) {
- return -1;
- }
-
- if (drmMap(xvmc_driver->fd,
- pI915XvMC->psp.handle,
- pI915XvMC->psp.size,
- (drmAddress *)&pI915XvMC->psp.map) != 0) {
- return -1;
- }
-
- if (drmMap(xvmc_driver->fd,
- pI915XvMC->psc.handle,
- pI915XvMC->psc.size,
- (drmAddress *)&pI915XvMC->psc.map) != 0) {
- return -1;
- }
-
- if (drmMap(xvmc_driver->fd,
- pI915XvMC->corrdata.handle,
- pI915XvMC->corrdata.size,
- (drmAddress *)&pI915XvMC->corrdata.map) != 0) {
- return -1;
- }
-
- return 0;
+ if (drmMap(xvmc_driver->fd,
+ pI915XvMC->sis.handle,
+ pI915XvMC->sis.size,
+ (drmAddress *) & pI915XvMC->sis.map) != 0) {
+ return -1;
+ }
+
+ if (drmMap(xvmc_driver->fd,
+ pI915XvMC->ssb.handle,
+ pI915XvMC->ssb.size,
+ (drmAddress *) & pI915XvMC->ssb.map) != 0) {
+ return -1;
+ }
+
+ if (drmMap(xvmc_driver->fd,
+ pI915XvMC->msb.handle,
+ pI915XvMC->msb.size,
+ (drmAddress *) & pI915XvMC->msb.map) != 0) {
+ return -1;
+ }
+
+ if (drmMap(xvmc_driver->fd,
+ pI915XvMC->psp.handle,
+ pI915XvMC->psp.size,
+ (drmAddress *) & pI915XvMC->psp.map) != 0) {
+ return -1;
+ }
+
+ if (drmMap(xvmc_driver->fd,
+ pI915XvMC->psc.handle,
+ pI915XvMC->psc.size,
+ (drmAddress *) & pI915XvMC->psc.map) != 0) {
+ return -1;
+ }
+
+ if (drmMap(xvmc_driver->fd,
+ pI915XvMC->corrdata.handle,
+ pI915XvMC->corrdata.size,
+ (drmAddress *) & pI915XvMC->corrdata.map) != 0) {
+ return -1;
+ }
+
+ return 0;
}
-static void i915_xvmc_unmap_buffers(i915XvMCContext *pI915XvMC)
+static void i915_xvmc_unmap_buffers(i915XvMCContext * pI915XvMC)
{
- if (pI915XvMC->sis.map) {
- drmUnmap(pI915XvMC->sis.map, pI915XvMC->sis.size);
- pI915XvMC->sis.map = NULL;
- }
-
- if (pI915XvMC->ssb.map) {
- drmUnmap(pI915XvMC->ssb.map, pI915XvMC->ssb.size);
- pI915XvMC->ssb.map = NULL;
- }
-
- if (pI915XvMC->msb.map) {
- drmUnmap(pI915XvMC->msb.map, pI915XvMC->msb.size);
- pI915XvMC->msb.map = NULL;
- }
-
- if (pI915XvMC->psp.map) {
- drmUnmap(pI915XvMC->psp.map, pI915XvMC->psp.size);
- pI915XvMC->psp.map = NULL;
- }
-
- if (pI915XvMC->psc.map) {
- drmUnmap(pI915XvMC->psc.map, pI915XvMC->psc.size);
- pI915XvMC->psc.map = NULL;
- }
-
- if (pI915XvMC->corrdata.map) {
- drmUnmap(pI915XvMC->corrdata.map, pI915XvMC->corrdata.size);
- pI915XvMC->corrdata.map = NULL;
- }
+ if (pI915XvMC->sis.map) {
+ drmUnmap(pI915XvMC->sis.map, pI915XvMC->sis.size);
+ pI915XvMC->sis.map = NULL;
+ }
+
+ if (pI915XvMC->ssb.map) {
+ drmUnmap(pI915XvMC->ssb.map, pI915XvMC->ssb.size);
+ pI915XvMC->ssb.map = NULL;
+ }
+
+ if (pI915XvMC->msb.map) {
+ drmUnmap(pI915XvMC->msb.map, pI915XvMC->msb.size);
+ pI915XvMC->msb.map = NULL;
+ }
+
+ if (pI915XvMC->psp.map) {
+ drmUnmap(pI915XvMC->psp.map, pI915XvMC->psp.size);
+ pI915XvMC->psp.map = NULL;
+ }
+
+ if (pI915XvMC->psc.map) {
+ drmUnmap(pI915XvMC->psc.map, pI915XvMC->psc.size);
+ pI915XvMC->psc.map = NULL;
+ }
+
+ if (pI915XvMC->corrdata.map) {
+ drmUnmap(pI915XvMC->corrdata.map, pI915XvMC->corrdata.size);
+ pI915XvMC->corrdata.map = NULL;
+ }
}
#if 0
/*
* Video post processing
*/
-static void i915_yuv2rgb_map_state_buffer(XvMCSurface *target_surface)
+static void i915_yuv2rgb_map_state_buffer(XvMCSurface * target_surface)
{
- struct i915_3dstate_map_state *map_state;
- struct texture_map *tm;
- i915XvMCSurface *privTarget = NULL;
- i915XvMCContext *pI915XvMC = NULL;
- unsigned int w = target_surface->width, h = target_surface->height;
-
- privTarget = (i915XvMCSurface *)target_surface->privData;
- pI915XvMC = (i915XvMCContext *)privTarget->privContext;
- /* 3DSATE_MAP_STATE */
- map_state = (struct i915_3dstate_map_state *)pI915XvMC->msb.map;
- memset(map_state, 0, sizeof(*map_state));
- map_state->dw0.type = CMD_3D;
- map_state->dw0.opcode = OPC_3DSTATE_MAP_STATE;
- map_state->dw0.retain = 0;
- map_state->dw0.length = 9;
- map_state->dw1.map_mask = MAP_MAP0 | MAP_MAP1 | MAP_MAP2;
-
- /* texture map 0: V Plane */
- tm = (struct texture_map *)(++map_state);
- memset(tm, 0, sizeof(*tm));
- tm->tm0.v_ls_offset = 0;
- tm->tm0.v_ls = 0;
- tm->tm0.base_address = VOFFSET(privTarget);
- tm->tm1.tile_walk = TILEWALK_XMAJOR;
- tm->tm1.tiled_surface = 0;
- tm->tm1.utilize_fence_regs = 1;
- tm->tm1.texel_fmt = 0;
- tm->tm1.surface_fmt = 1;
- tm->tm1.width = (w >> 1) - 1;
- tm->tm1.height = (h >> 1) - 1;
- tm->tm2.depth = 0;
- tm->tm2.max_lod = 0;
- tm->tm2.cube_face = 0;
- tm->tm2.pitch = (privTarget->uvStride >> 2) - 1; /* in DWords - 1 */
-
- /* texture map 1: Y Plane */
- ++tm;
- memset(tm, 0, sizeof(*tm));
- tm->tm0.v_ls_offset = 0;
- tm->tm0.v_ls = 0;
- tm->tm0.base_address = YOFFSET(privTarget);
- tm->tm1.tile_walk = TILEWALK_XMAJOR;
- tm->tm1.tiled_surface = 0;
- tm->tm1.utilize_fence_regs = 1;
- tm->tm1.texel_fmt = 0;
- tm->tm1.surface_fmt = 1;
- tm->tm1.width = w - 1;
- tm->tm1.height = h - 1;
- tm->tm2.depth = 0;
- tm->tm2.max_lod = 0;
- tm->tm2.cube_face = 0;
- tm->tm2.pitch = (privTarget->yStride >> 2) - 1; /* in DWords - 1 */
-
- /* texture map 2: U Plane */
- ++tm;
- memset(tm, 0, sizeof(*tm));
- tm->tm0.v_ls_offset = 0;
- tm->tm0.v_ls = 0;
- tm->tm0.base_address = UOFFSET(privTarget);
- tm->tm1.tile_walk = TILEWALK_XMAJOR;
- tm->tm1.tiled_surface = 0;
- tm->tm1.utilize_fence_regs = 1;
- tm->tm1.texel_fmt = 0;
- tm->tm1.surface_fmt = 1;
- tm->tm1.width = (w >> 1) - 1;
- tm->tm1.height = (h >> 1) - 1;
- tm->tm2.depth = 0;
- tm->tm2.max_lod = 0;
- tm->tm2.cube_face = 0;
- tm->tm2.pitch = (privTarget->uvStride >> 2) - 1; /* in DWords - 1 */
+ struct i915_3dstate_map_state *map_state;
+ struct texture_map *tm;
+ i915XvMCSurface *privTarget = NULL;
+ i915XvMCContext *pI915XvMC = NULL;
+ unsigned int w = target_surface->width, h = target_surface->height;
+
+ privTarget = (i915XvMCSurface *) target_surface->privData;
+ pI915XvMC = (i915XvMCContext *) privTarget->privContext;
+ /* 3DSATE_MAP_STATE */
+ map_state = (struct i915_3dstate_map_state *)pI915XvMC->msb.map;
+ memset(map_state, 0, sizeof(*map_state));
+ map_state->dw0.type = CMD_3D;
+ map_state->dw0.opcode = OPC_3DSTATE_MAP_STATE;
+ map_state->dw0.retain = 0;
+ map_state->dw0.length = 9;
+ map_state->dw1.map_mask = MAP_MAP0 | MAP_MAP1 | MAP_MAP2;
+
+ /* texture map 0: V Plane */
+ tm = (struct texture_map *)(++map_state);
+ memset(tm, 0, sizeof(*tm));
+ tm->tm0.v_ls_offset = 0;
+ tm->tm0.v_ls = 0;
+ tm->tm0.base_address = VOFFSET(privTarget);
+ tm->tm1.tile_walk = TILEWALK_XMAJOR;
+ tm->tm1.tiled_surface = 0;
+ tm->tm1.utilize_fence_regs = 1;
+ tm->tm1.texel_fmt = 0;
+ tm->tm1.surface_fmt = 1;
+ tm->tm1.width = (w >> 1) - 1;
+ tm->tm1.height = (h >> 1) - 1;
+ tm->tm2.depth = 0;
+ tm->tm2.max_lod = 0;
+ tm->tm2.cube_face = 0;
+ tm->tm2.pitch = (privTarget->uvStride >> 2) - 1; /* in DWords - 1 */
+
+ /* texture map 1: Y Plane */
+ ++tm;
+ memset(tm, 0, sizeof(*tm));
+ tm->tm0.v_ls_offset = 0;
+ tm->tm0.v_ls = 0;
+ tm->tm0.base_address = YOFFSET(privTarget);
+ tm->tm1.tile_walk = TILEWALK_XMAJOR;
+ tm->tm1.tiled_surface = 0;
+ tm->tm1.utilize_fence_regs = 1;
+ tm->tm1.texel_fmt = 0;
+ tm->tm1.surface_fmt = 1;
+ tm->tm1.width = w - 1;
+ tm->tm1.height = h - 1;
+ tm->tm2.depth = 0;
+ tm->tm2.max_lod = 0;
+ tm->tm2.cube_face = 0;
+ tm->tm2.pitch = (privTarget->yStride >> 2) - 1; /* in DWords - 1 */
+
+ /* texture map 2: U Plane */
+ ++tm;
+ memset(tm, 0, sizeof(*tm));
+ tm->tm0.v_ls_offset = 0;
+ tm->tm0.v_ls = 0;
+ tm->tm0.base_address = UOFFSET(privTarget);
+ tm->tm1.tile_walk = TILEWALK_XMAJOR;
+ tm->tm1.tiled_surface = 0;
+ tm->tm1.utilize_fence_regs = 1;
+ tm->tm1.texel_fmt = 0;
+ tm->tm1.surface_fmt = 1;
+ tm->tm1.width = (w >> 1) - 1;
+ tm->tm1.height = (h >> 1) - 1;
+ tm->tm2.depth = 0;
+ tm->tm2.max_lod = 0;
+ tm->tm2.cube_face = 0;
+ tm->tm2.pitch = (privTarget->uvStride >> 2) - 1; /* in DWords - 1 */
}
#endif
#if 0
-static void i915_yuv2rgb_sampler_state_buffer(XvMCSurface *surface)
+static void i915_yuv2rgb_sampler_state_buffer(XvMCSurface * surface)
{
- struct i915_3dstate_sampler_state *sampler_state;
- struct texture_sampler *ts;
- i915XvMCSurface *privSurface = (i915XvMCSurface *)surface->privData;
- i915XvMCContext *pI915XvMC = (i915XvMCContext *)privSurface->privContext;
-
- /* 3DSATE_SAMPLER_STATE */
- sampler_state = (struct i915_3dstate_sampler_state *)pI915XvMC->ssb.map;
- memset(sampler_state, 0, sizeof(*sampler_state));
- sampler_state->dw0.type = CMD_3D;
- sampler_state->dw0.opcode = OPC_3DSTATE_SAMPLER_STATE;
- sampler_state->dw0.length = 9;
- sampler_state->dw1.sampler_masker = SAMPLER_SAMPLER0 | SAMPLER_SAMPLER1 | SAMPLER_SAMPLER2;
-
- /* Sampler 0 */
- ts = (struct texture_sampler *)(++sampler_state);
- memset(ts, 0, sizeof(*ts));
- ts->ts0.reverse_gamma = 0;
- ts->ts0.planar2packet = 1;
- ts->ts0.color_conversion = 1;
- ts->ts0.chromakey_index = 0;
- ts->ts0.base_level = 0;
- ts->ts0.mip_filter = MIPFILTER_NONE; /* NONE */
- ts->ts0.mag_filter = MAPFILTER_LINEAR; /* LINEAR */
- ts->ts0.min_filter = MAPFILTER_LINEAR; /* LINEAR */
- ts->ts0.lod_bias = 0;
- ts->ts0.shadow_enable = 0;
- ts->ts0.max_anisotropy = ANISORATIO_2;
- ts->ts0.shadow_function = PREFILTEROP_ALWAYS;
- ts->ts1.min_lod = 0; /* Maximum Mip Level */
- ts->ts1.kill_pixel = 0;
- ts->ts1.keyed_texture_filter = 0;
- ts->ts1.chromakey_enable = 0;
- ts->ts1.tcx_control = TEXCOORDMODE_CLAMP;
- ts->ts1.tcy_control = TEXCOORDMODE_CLAMP;
- ts->ts1.tcz_control = TEXCOORDMODE_CLAMP;
- ts->ts1.normalized_coor = 0;
- ts->ts1.map_index = 0;
- ts->ts1.east_deinterlacer = 0;
- ts->ts2.default_color = 0;
-
- /* Sampler 1 */
- ++ts;
- memset(ts, 0, sizeof(*ts));
- ts->ts0.reverse_gamma = 0;
- ts->ts0.planar2packet = 1;
- ts->ts0.color_conversion = 1;
- ts->ts0.chromakey_index = 0;
- ts->ts0.base_level = 0;
- ts->ts0.mip_filter = MIPFILTER_NONE; /* NONE */
- ts->ts0.mag_filter = MAPFILTER_LINEAR; /* LINEAR */
- ts->ts0.min_filter = MAPFILTER_LINEAR; /* LINEAR */
- ts->ts0.lod_bias = 0;
- ts->ts0.shadow_enable = 0;
- ts->ts0.max_anisotropy = ANISORATIO_2;
- ts->ts0.shadow_function = PREFILTEROP_ALWAYS;
- ts->ts1.min_lod = 0; /* Maximum Mip Level */
- ts->ts1.kill_pixel = 0;
- ts->ts1.keyed_texture_filter = 0;
- ts->ts1.chromakey_enable = 0;
- ts->ts1.tcx_control = TEXCOORDMODE_CLAMP;
- ts->ts1.tcy_control = TEXCOORDMODE_CLAMP;
- ts->ts1.tcz_control = TEXCOORDMODE_CLAMP;
- ts->ts1.normalized_coor = 0;
- ts->ts1.map_index = 1;
- ts->ts1.east_deinterlacer = 0;
- ts->ts2.default_color = 0;
-
- /* Sampler 2 */
- ++ts;
- memset(ts, 0, sizeof(*ts));
- ts->ts0.reverse_gamma = 0;
- ts->ts0.planar2packet = 1;
- ts->ts0.color_conversion = 1;
- ts->ts0.chromakey_index = 0;
- ts->ts0.base_level = 0;
- ts->ts0.mip_filter = MIPFILTER_NONE; /* NONE */
- ts->ts0.mag_filter = MAPFILTER_LINEAR; /* LINEAR */
- ts->ts0.min_filter = MAPFILTER_LINEAR; /* LINEAR */
- ts->ts0.lod_bias = 0;
- ts->ts0.shadow_enable = 0;
- ts->ts0.max_anisotropy = ANISORATIO_2;
- ts->ts0.shadow_function = PREFILTEROP_ALWAYS;
- ts->ts1.min_lod = 0; /* Maximum Mip Level */
- ts->ts1.kill_pixel = 0;
- ts->ts1.keyed_texture_filter = 0;
- ts->ts1.chromakey_enable = 0;
- ts->ts1.tcx_control = TEXCOORDMODE_CLAMP;
- ts->ts1.tcy_control = TEXCOORDMODE_CLAMP;
- ts->ts1.tcz_control = TEXCOORDMODE_CLAMP;
- ts->ts1.normalized_coor = 0;
- ts->ts1.map_index = 2;
- ts->ts1.east_deinterlacer = 0;
- ts->ts2.default_color = 0;
+ struct i915_3dstate_sampler_state *sampler_state;
+ struct texture_sampler *ts;
+ i915XvMCSurface *privSurface = (i915XvMCSurface *) surface->privData;
+ i915XvMCContext *pI915XvMC =
+ (i915XvMCContext *) privSurface->privContext;
+
+ /* 3DSATE_SAMPLER_STATE */
+ sampler_state = (struct i915_3dstate_sampler_state *)pI915XvMC->ssb.map;
+ memset(sampler_state, 0, sizeof(*sampler_state));
+ sampler_state->dw0.type = CMD_3D;
+ sampler_state->dw0.opcode = OPC_3DSTATE_SAMPLER_STATE;
+ sampler_state->dw0.length = 9;
+ sampler_state->dw1.sampler_masker =
+ SAMPLER_SAMPLER0 | SAMPLER_SAMPLER1 | SAMPLER_SAMPLER2;
+
+ /* Sampler 0 */
+ ts = (struct texture_sampler *)(++sampler_state);
+ memset(ts, 0, sizeof(*ts));
+ ts->ts0.reverse_gamma = 0;
+ ts->ts0.planar2packet = 1;
+ ts->ts0.color_conversion = 1;
+ ts->ts0.chromakey_index = 0;
+ ts->ts0.base_level = 0;
+ ts->ts0.mip_filter = MIPFILTER_NONE; /* NONE */
+ ts->ts0.mag_filter = MAPFILTER_LINEAR; /* LINEAR */
+ ts->ts0.min_filter = MAPFILTER_LINEAR; /* LINEAR */
+ ts->ts0.lod_bias = 0;
+ ts->ts0.shadow_enable = 0;
+ ts->ts0.max_anisotropy = ANISORATIO_2;
+ ts->ts0.shadow_function = PREFILTEROP_ALWAYS;
+ ts->ts1.min_lod = 0; /* Maximum Mip Level */
+ ts->ts1.kill_pixel = 0;
+ ts->ts1.keyed_texture_filter = 0;
+ ts->ts1.chromakey_enable = 0;
+ ts->ts1.tcx_control = TEXCOORDMODE_CLAMP;
+ ts->ts1.tcy_control = TEXCOORDMODE_CLAMP;
+ ts->ts1.tcz_control = TEXCOORDMODE_CLAMP;
+ ts->ts1.normalized_coor = 0;
+ ts->ts1.map_index = 0;
+ ts->ts1.east_deinterlacer = 0;
+ ts->ts2.default_color = 0;
+
+ /* Sampler 1 */
+ ++ts;
+ memset(ts, 0, sizeof(*ts));
+ ts->ts0.reverse_gamma = 0;
+ ts->ts0.planar2packet = 1;
+ ts->ts0.color_conversion = 1;
+ ts->ts0.chromakey_index = 0;
+ ts->ts0.base_level = 0;
+ ts->ts0.mip_filter = MIPFILTER_NONE; /* NONE */
+ ts->ts0.mag_filter = MAPFILTER_LINEAR; /* LINEAR */
+ ts->ts0.min_filter = MAPFILTER_LINEAR; /* LINEAR */
+ ts->ts0.lod_bias = 0;
+ ts->ts0.shadow_enable = 0;
+ ts->ts0.max_anisotropy = ANISORATIO_2;
+ ts->ts0.shadow_function = PREFILTEROP_ALWAYS;
+ ts->ts1.min_lod = 0; /* Maximum Mip Level */
+ ts->ts1.kill_pixel = 0;
+ ts->ts1.keyed_texture_filter = 0;
+ ts->ts1.chromakey_enable = 0;
+ ts->ts1.tcx_control = TEXCOORDMODE_CLAMP;
+ ts->ts1.tcy_control = TEXCOORDMODE_CLAMP;
+ ts->ts1.tcz_control = TEXCOORDMODE_CLAMP;
+ ts->ts1.normalized_coor = 0;
+ ts->ts1.map_index = 1;
+ ts->ts1.east_deinterlacer = 0;
+ ts->ts2.default_color = 0;
+
+ /* Sampler 2 */
+ ++ts;
+ memset(ts, 0, sizeof(*ts));
+ ts->ts0.reverse_gamma = 0;
+ ts->ts0.planar2packet = 1;
+ ts->ts0.color_conversion = 1;
+ ts->ts0.chromakey_index = 0;
+ ts->ts0.base_level = 0;
+ ts->ts0.mip_filter = MIPFILTER_NONE; /* NONE */
+ ts->ts0.mag_filter = MAPFILTER_LINEAR; /* LINEAR */
+ ts->ts0.min_filter = MAPFILTER_LINEAR; /* LINEAR */
+ ts->ts0.lod_bias = 0;
+ ts->ts0.shadow_enable = 0;
+ ts->ts0.max_anisotropy = ANISORATIO_2;
+ ts->ts0.shadow_function = PREFILTEROP_ALWAYS;
+ ts->ts1.min_lod = 0; /* Maximum Mip Level */
+ ts->ts1.kill_pixel = 0;
+ ts->ts1.keyed_texture_filter = 0;
+ ts->ts1.chromakey_enable = 0;
+ ts->ts1.tcx_control = TEXCOORDMODE_CLAMP;
+ ts->ts1.tcy_control = TEXCOORDMODE_CLAMP;
+ ts->ts1.tcz_control = TEXCOORDMODE_CLAMP;
+ ts->ts1.normalized_coor = 0;
+ ts->ts1.map_index = 2;
+ ts->ts1.east_deinterlacer = 0;
+ ts->ts2.default_color = 0;
}
#endif
#if 0
-static void i915_yuv2rgb_static_indirect_state_buffer(XvMCSurface *surface,
- unsigned int dstaddr,
- int dstpitch)
+static void i915_yuv2rgb_static_indirect_state_buffer(XvMCSurface * surface,
+ unsigned int dstaddr,
+ int dstpitch)
{
- struct i915_3dstate_buffer_info *buffer_info;
- struct i915_3dstate_dest_buffer_variables *dest_buffer_variables;
- i915XvMCSurface *privSurface = (i915XvMCSurface *)surface->privData;
- i915XvMCContext *pI915XvMC = (i915XvMCContext *)privSurface->privContext;
-
- /* 3DSTATE_BUFFER_INFO */
- buffer_info = (struct i915_3dstate_buffer_info *)pI915XvMC->sis.map;
- memset(buffer_info, 0, sizeof(*buffer_info));
- buffer_info->dw0.type = CMD_3D;
- buffer_info->dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
- buffer_info->dw0.length = 1;
- buffer_info->dw1.aux_id = 0;
- buffer_info->dw1.buffer_id = BUFFERID_COLOR_BACK;
- buffer_info->dw1.fence_regs = 1;
- buffer_info->dw1.tiled_surface = 0; /* linear */
- buffer_info->dw1.walk = TILEWALK_XMAJOR;
- buffer_info->dw1.pitch = dstpitch;
- buffer_info->dw2.base_address = dstaddr;
-
- /* 3DSTATE_DEST_BUFFER_VARIABLES */
- dest_buffer_variables = (struct i915_3dstate_dest_buffer_variables *)(++buffer_info);
- memset(dest_buffer_variables, 0, sizeof(*dest_buffer_variables));
- dest_buffer_variables->dw0.type = CMD_3D;
- dest_buffer_variables->dw0.opcode = OPC_3DSTATE_DEST_BUFFER_VARIABLES;
- dest_buffer_variables->dw0.length = 0;
- dest_buffer_variables->dw1.dest_v_bias = 8; /* FIXME 0x1000 .5 ??? */
- dest_buffer_variables->dw1.dest_h_bias = 8;
- dest_buffer_variables->dw1.color_fmt = COLORBUFFER_A8R8G8B8; /* FIXME */
+ struct i915_3dstate_buffer_info *buffer_info;
+ struct i915_3dstate_dest_buffer_variables *dest_buffer_variables;
+ i915XvMCSurface *privSurface = (i915XvMCSurface *) surface->privData;
+ i915XvMCContext *pI915XvMC =
+ (i915XvMCContext *) privSurface->privContext;
+
+ /* 3DSTATE_BUFFER_INFO */
+ buffer_info = (struct i915_3dstate_buffer_info *)pI915XvMC->sis.map;
+ memset(buffer_info, 0, sizeof(*buffer_info));
+ buffer_info->dw0.type = CMD_3D;
+ buffer_info->dw0.opcode = OPC_3DSTATE_BUFFER_INFO;
+ buffer_info->dw0.length = 1;
+ buffer_info->dw1.aux_id = 0;
+ buffer_info->dw1.buffer_id = BUFFERID_COLOR_BACK;
+ buffer_info->dw1.fence_regs = 1;
+ buffer_info->dw1.tiled_surface = 0; /* linear */
+ buffer_info->dw1.walk = TILEWALK_XMAJOR;
+ buffer_info->dw1.pitch = dstpitch;
+ buffer_info->dw2.base_address = dstaddr;
+
+ /* 3DSTATE_DEST_BUFFER_VARIABLES */
+ dest_buffer_variables =
+ (struct i915_3dstate_dest_buffer_variables *)(++buffer_info);
+ memset(dest_buffer_variables, 0, sizeof(*dest_buffer_variables));
+ dest_buffer_variables->dw0.type = CMD_3D;
+ dest_buffer_variables->dw0.opcode = OPC_3DSTATE_DEST_BUFFER_VARIABLES;
+ dest_buffer_variables->dw0.length = 0;
+ dest_buffer_variables->dw1.dest_v_bias = 8; /* FIXME 0x1000 .5 ??? */
+ dest_buffer_variables->dw1.dest_h_bias = 8;
+ dest_buffer_variables->dw1.color_fmt = COLORBUFFER_A8R8G8B8; /* FIXME */
}
#endif
#if 0
-static void i915_yuv2rgb_pixel_shader_program_buffer(XvMCSurface *surface)
+static void i915_yuv2rgb_pixel_shader_program_buffer(XvMCSurface * surface)
{
- struct i915_3dstate_pixel_shader_program *pixel_shader_program;
- i915XvMCSurface *privSurface = (i915XvMCSurface *)surface->privData;
- i915XvMCContext *pI915XvMC = (i915XvMCContext *)privSurface->privContext;
- unsigned int *inst;
- unsigned int dest, src0, src1;
-
- /* Shader 0 */
- pixel_shader_program = (struct i915_3dstate_pixel_shader_program *)pI915XvMC->psp.map;
- memset(pixel_shader_program, 0, sizeof(*pixel_shader_program));
- pixel_shader_program->dw0.type = CMD_3D;
- pixel_shader_program->dw0.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
- pixel_shader_program->dw0.retain = 0;
- pixel_shader_program->dw0.length = 23;
- /* dcl t0.xy */
- inst = (unsigned int*)(++pixel_shader_program);
- i915_inst_decl(inst, REG_TYPE_T, T_TEX0, D0_CHANNEL_XY);
- /* dcl t1.xy */
- inst += 3;
- i915_inst_decl(inst, REG_TYPE_T, T_TEX1, D0_CHANNEL_XY);
- /* dcl_2D s0 */
- inst += 3;
- i915_inst_decl(inst, REG_TYPE_S, 0, D0_SAMPLE_TYPE_2D);
- /* dcl_2D s1 */
- inst += 3;
- i915_inst_decl(inst, REG_TYPE_S, 1, D0_SAMPLE_TYPE_2D);
- /* dcl_2D s2 */
- inst += 3;
- i915_inst_decl(inst, REG_TYPE_S, 2, D0_SAMPLE_TYPE_2D);
- /* texld r0 t1 s0 */
- inst += 3;
- dest = UREG(REG_TYPE_R, 0);
- src0 = UREG(REG_TYPE_T, 1); /* COORD */
- src1 = UREG(REG_TYPE_S, 0); /* SAMPLER */
- i915_inst_texld(inst, T0_TEXLD, dest, src0, src1);
- /* texld r0 t0 s1 */
- inst += 3;
- dest = UREG(REG_TYPE_R, 0);
- src0 = UREG(REG_TYPE_T, 0); /* COORD */
- src1 = UREG(REG_TYPE_S, 1); /* SAMPLER */
- i915_inst_texld(inst, T0_TEXLD, dest, src0, src1);
- /* texld oC t1 s2 */
- inst += 3;
- dest = UREG(REG_TYPE_OC, 0);
- src0 = UREG(REG_TYPE_T, 1); /* COORD */
- src1 = UREG(REG_TYPE_S, 2); /* SAMPLER */
- i915_inst_texld(inst, T0_TEXLD, dest, src0, src1);
+ struct i915_3dstate_pixel_shader_program *pixel_shader_program;
+ i915XvMCSurface *privSurface = (i915XvMCSurface *) surface->privData;
+ i915XvMCContext *pI915XvMC =
+ (i915XvMCContext *) privSurface->privContext;
+ unsigned int *inst;
+ unsigned int dest, src0, src1;
+
+ /* Shader 0 */
+ pixel_shader_program =
+ (struct i915_3dstate_pixel_shader_program *)pI915XvMC->psp.map;
+ memset(pixel_shader_program, 0, sizeof(*pixel_shader_program));
+ pixel_shader_program->dw0.type = CMD_3D;
+ pixel_shader_program->dw0.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
+ pixel_shader_program->dw0.retain = 0;
+ pixel_shader_program->dw0.length = 23;
+ /* dcl t0.xy */
+ inst = (unsigned int *)(++pixel_shader_program);
+ i915_inst_decl(inst, REG_TYPE_T, T_TEX0, D0_CHANNEL_XY);
+ /* dcl t1.xy */
+ inst += 3;
+ i915_inst_decl(inst, REG_TYPE_T, T_TEX1, D0_CHANNEL_XY);
+ /* dcl_2D s0 */
+ inst += 3;
+ i915_inst_decl(inst, REG_TYPE_S, 0, D0_SAMPLE_TYPE_2D);
+ /* dcl_2D s1 */
+ inst += 3;
+ i915_inst_decl(inst, REG_TYPE_S, 1, D0_SAMPLE_TYPE_2D);
+ /* dcl_2D s2 */
+ inst += 3;
+ i915_inst_decl(inst, REG_TYPE_S, 2, D0_SAMPLE_TYPE_2D);
+ /* texld r0 t1 s0 */
+ inst += 3;
+ dest = UREG(REG_TYPE_R, 0);
+ src0 = UREG(REG_TYPE_T, 1); /* COORD */
+ src1 = UREG(REG_TYPE_S, 0); /* SAMPLER */
+ i915_inst_texld(inst, T0_TEXLD, dest, src0, src1);
+ /* texld r0 t0 s1 */
+ inst += 3;
+ dest = UREG(REG_TYPE_R, 0);
+ src0 = UREG(REG_TYPE_T, 0); /* COORD */
+ src1 = UREG(REG_TYPE_S, 1); /* SAMPLER */
+ i915_inst_texld(inst, T0_TEXLD, dest, src0, src1);
+ /* texld oC t1 s2 */
+ inst += 3;
+ dest = UREG(REG_TYPE_OC, 0);
+ src0 = UREG(REG_TYPE_T, 1); /* COORD */
+ src1 = UREG(REG_TYPE_S, 2); /* SAMPLER */
+ i915_inst_texld(inst, T0_TEXLD, dest, src0, src1);
}
#endif
#if 0
-static void i915_yuv2rgb_proc(XvMCSurface *surface)
+static void i915_yuv2rgb_proc(XvMCSurface * surface)
{
- i915XvMCSurface *privSurface = (i915XvMCSurface *)surface->privData;
- i915XvMCContext *pI915XvMC = (i915XvMCContext *)privSurface->privContext;
- struct i915_3dstate_load_state_immediate_1 *load_state_immediate_1 = NULL;
- struct s2_dword *s2 = NULL;
- struct s3_dword *s3 = NULL;
- struct s4_dword *s4 = NULL;
- struct s5_dword *s5 = NULL;
- struct s6_dword *s6 = NULL;
- struct s7_dword *s7 = NULL;
- struct i915_3dstate_scissor_rectangle scissor_rectangle;
- struct i915_3dstate_load_indirect *load_indirect = NULL;
- sis_state *sis = NULL;
- ssb_state *ssb = NULL;
- msb_state *msb = NULL;
- psp_state *psp = NULL;
- struct i915_3dprimitive *_3dprimitive = NULL;
- struct vertex_data *vd = NULL;
- unsigned int size;
- void *base = NULL;
-
- /* 3DSTATE_LOAD_STATE_IMMEDIATE_1 */
- size = sizeof(*load_state_immediate_1) + sizeof(*s2) + sizeof(*s3) +
- sizeof(*s4) + sizeof(*s5) + sizeof(*s6) + sizeof(*s7);
- base = calloc(1, size);
- load_state_immediate_1 = (struct i915_3dstate_load_state_immediate_1 *)base;
- load_state_immediate_1->dw0.type = CMD_3D;
- load_state_immediate_1->dw0.opcode = OPC_3DSTATE_LOAD_STATE_IMMEDIATE_1;
- load_state_immediate_1->dw0.load_s2 = 1;
- load_state_immediate_1->dw0.load_s3 = 1;
- load_state_immediate_1->dw0.load_s4 = 1;
- load_state_immediate_1->dw0.load_s5 = 1;
- load_state_immediate_1->dw0.load_s6 = 1;
- load_state_immediate_1->dw0.load_s7 = 1;
- load_state_immediate_1->dw0.length = 5;
-
- s2 = (struct s2_dword *)(++load_state_immediate_1);
- s2->set0_texcoord_fmt = TEXCOORDFMT_2FP;
- s2->set1_texcoord_fmt = TEXCOORDFMT_2FP;
- s2->set2_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
- s2->set3_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
- s2->set4_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
- s2->set5_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
- s2->set6_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
- s2->set7_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
-
- s3 = (struct s3_dword *)(++s2);
- s4 = (struct s4_dword *)(++s3);
- s4->position_mask = VERTEXHAS_XY;
- s4->cull_mode = CULLMODE_NONE;
- s4->color_shade_mode = SHADEMODE_FLAT;
- s4->specular_shade_mode = SHADEMODE_FLAT;
- s4->fog_shade_mode = SHADEMODE_FLAT;
- s4->alpha_shade_mode = SHADEMODE_FLAT;
- s4->line_width = 0x2; /* FIXME: 1.0??? */
- s4->point_width = 0x1;
-
- s5 = (struct s5_dword *)(++s4);
- s6 = (struct s6_dword *)(++s5);
- s6->src_blend_factor = 1;
- s6->dest_blend_factor = 1;
- s6->color_buffer_write = 1;
-
- s7 = (struct s7_dword *)(++s6);
- intelBatchbufferData(base, size, 0);
- free(base);
-
- /* 3DSTATE_3DSTATE_SCISSOR_RECTANGLE */
- scissor_rectangle.dw0.type = CMD_3D;
- scissor_rectangle.dw0.opcode = OPC_3DSTATE_SCISSOR_RECTANGLE;
- scissor_rectangle.dw0.length = 1;
- scissor_rectangle.dw1.min_x = 0;
- scissor_rectangle.dw1.min_y = 0;
- scissor_rectangle.dw2.max_x = 2047;
- scissor_rectangle.dw2.max_y = 2047;
- intelBatchbufferData(&scissor_rectangle, sizeof(scissor_rectangle), 0);
-
- /* 3DSTATE_LOAD_INDIRECT */
- size = sizeof(*load_indirect) + sizeof(*sis) + sizeof(*ssb) + sizeof(*msb) + sizeof(*psp);
- base = calloc(1, size);
- load_indirect = (struct i915_3dstate_load_indirect *)base;
- load_indirect->dw0.type = CMD_3D;
- load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;
- load_indirect->dw0.mem_select = 1; /* Bearlake only */
- load_indirect->dw0.block_mask = BLOCK_SIS | BLOCK_SSB | BLOCK_MSB | BLOCK_PSP;
- load_indirect->dw0.length = 7;
-
- /* SIS */
- sis = (sis_state *)(++load_indirect);
- sis->dw0.valid = 1;
- sis->dw0.buffer_address = pI915XvMC->sis.offset;
- sis->dw1.length = ((sizeof(struct i915_3dstate_buffer_info) +
- sizeof(struct i915_3dstate_dest_buffer_variables)) >> 2) - 1;
-
- /* SSB */
- ssb = (ssb_state *)(++sis);
- ssb->dw0.valid = 1;
- ssb->dw0.buffer_address = pI915XvMC->ssb.offset;
- ssb->dw1.length = ((sizeof(struct i915_3dstate_sampler_state) +
- sizeof(struct texture_sampler) * 3) >> 2) - 1;
-
- /* MSB */
- msb = (msb_state *)(++ssb);
- msb->dw0.valid = 1;
- msb->dw0.buffer_address = pI915XvMC->msb.offset;
- msb->dw1.length = ((sizeof(struct i915_3dstate_map_state) +
- sizeof(struct texture_map) * 3) >> 2) - 1;
-
- /* PSP */
- psp = (psp_state *)(++msb);
- psp->dw0.valid = 1;
- psp->dw0.buffer_address = pI915XvMC->psp.offset;
- psp->dw1.length = ((sizeof(struct i915_3dstate_pixel_shader_program) +
- sizeof(union shader_inst)) >> 2) - 1;
-
- intelBatchbufferData(base, size, 0);
- free(base);
-
- /* 3DPRIMITIVE */
- size = sizeof(*_3dprimitive) + sizeof(*vd) * 3;
- base = calloc(1, size);
- _3dprimitive = (struct i915_3dprimitive *)base;
- _3dprimitive->dw0.inline_prim.type = CMD_3D;
- _3dprimitive->dw0.inline_prim.opcode = OPC_3DPRIMITIVE;
- _3dprimitive->dw0.inline_prim.vertex_location = VERTEX_INLINE;
- _3dprimitive->dw0.inline_prim.prim = PRIM_RECTLIST;
- _3dprimitive->dw0.inline_prim.length = size - 2;
-
- vd = (struct vertex_data *)(++_3dprimitive);
- vd->x = 0; /* FIXME!!! */
- vd->x = 0; /* FIXME */
- vd->tc0.tcx = 0;
- vd->tc0.tcy = 0;
- vd->tc1.tcx = 0;
- vd->tc1.tcy = 0;
-
- ++vd;
- vd->x = 0; /* FIXME!!! */
- vd->x = 0; /* FIXME */
- vd->tc0.tcx = 0;
- vd->tc0.tcy = 0;
- vd->tc1.tcx = 0;
- vd->tc1.tcy = 0;
-
- ++vd;
- vd->x = 0; /* FIXME!!! */
- vd->x = 0; /* FIXME */
- vd->tc0.tcx = 0;
- vd->tc0.tcy = 0;
- vd->tc1.tcx = 0;
- vd->tc1.tcy = 0;
-
- intelBatchbufferData(base, size, 0);
- free(base);
+ i915XvMCSurface *privSurface = (i915XvMCSurface *) surface->privData;
+ i915XvMCContext *pI915XvMC =
+ (i915XvMCContext *) privSurface->privContext;
+ struct i915_3dstate_load_state_immediate_1 *load_state_immediate_1 =
+ NULL;
+ struct s2_dword *s2 = NULL;
+ struct s3_dword *s3 = NULL;
+ struct s4_dword *s4 = NULL;
+ struct s5_dword *s5 = NULL;
+ struct s6_dword *s6 = NULL;
+ struct s7_dword *s7 = NULL;
+ struct i915_3dstate_scissor_rectangle scissor_rectangle;
+ struct i915_3dstate_load_indirect *load_indirect = NULL;
+ sis_state *sis = NULL;
+ ssb_state *ssb = NULL;
+ msb_state *msb = NULL;
+ psp_state *psp = NULL;
+ struct i915_3dprimitive *_3dprimitive = NULL;
+ struct vertex_data *vd = NULL;
+ unsigned int size;
+ void *base = NULL;
+
+ /* 3DSTATE_LOAD_STATE_IMMEDIATE_1 */
+ size = sizeof(*load_state_immediate_1) + sizeof(*s2) + sizeof(*s3) +
+ sizeof(*s4) + sizeof(*s5) + sizeof(*s6) + sizeof(*s7);
+ base = calloc(1, size);
+ load_state_immediate_1 =
+ (struct i915_3dstate_load_state_immediate_1 *)base;
+ load_state_immediate_1->dw0.type = CMD_3D;
+ load_state_immediate_1->dw0.opcode = OPC_3DSTATE_LOAD_STATE_IMMEDIATE_1;
+ load_state_immediate_1->dw0.load_s2 = 1;
+ load_state_immediate_1->dw0.load_s3 = 1;
+ load_state_immediate_1->dw0.load_s4 = 1;
+ load_state_immediate_1->dw0.load_s5 = 1;
+ load_state_immediate_1->dw0.load_s6 = 1;
+ load_state_immediate_1->dw0.load_s7 = 1;
+ load_state_immediate_1->dw0.length = 5;
+
+ s2 = (struct s2_dword *)(++load_state_immediate_1);
+ s2->set0_texcoord_fmt = TEXCOORDFMT_2FP;
+ s2->set1_texcoord_fmt = TEXCOORDFMT_2FP;
+ s2->set2_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
+ s2->set3_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
+ s2->set4_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
+ s2->set5_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
+ s2->set6_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
+ s2->set7_texcoord_fmt = TEXCOORDFMT_NOT_PRESENT;
+
+ s3 = (struct s3_dword *)(++s2);
+ s4 = (struct s4_dword *)(++s3);
+ s4->position_mask = VERTEXHAS_XY;
+ s4->cull_mode = CULLMODE_NONE;
+ s4->color_shade_mode = SHADEMODE_FLAT;
+ s4->specular_shade_mode = SHADEMODE_FLAT;
+ s4->fog_shade_mode = SHADEMODE_FLAT;
+ s4->alpha_shade_mode = SHADEMODE_FLAT;
+ s4->line_width = 0x2; /* FIXME: 1.0??? */
+ s4->point_width = 0x1;
+
+ s5 = (struct s5_dword *)(++s4);
+ s6 = (struct s6_dword *)(++s5);
+ s6->src_blend_factor = 1;
+ s6->dest_blend_factor = 1;
+ s6->color_buffer_write = 1;
+
+ s7 = (struct s7_dword *)(++s6);
+ intelBatchbufferData(base, size, 0);
+ free(base);
+
+ /* 3DSTATE_3DSTATE_SCISSOR_RECTANGLE */
+ scissor_rectangle.dw0.type = CMD_3D;
+ scissor_rectangle.dw0.opcode = OPC_3DSTATE_SCISSOR_RECTANGLE;
+ scissor_rectangle.dw0.length = 1;
+ scissor_rectangle.dw1.min_x = 0;
+ scissor_rectangle.dw1.min_y = 0;
+ scissor_rectangle.dw2.max_x = 2047;
+ scissor_rectangle.dw2.max_y = 2047;
+ intelBatchbufferData(&scissor_rectangle, sizeof(scissor_rectangle), 0);
+
+ /* 3DSTATE_LOAD_INDIRECT */
+ size =
+ sizeof(*load_indirect) + sizeof(*sis) + sizeof(*ssb) +
+ sizeof(*msb) + sizeof(*psp);
+ base = calloc(1, size);
+ load_indirect = (struct i915_3dstate_load_indirect *)base;
+ load_indirect->dw0.type = CMD_3D;
+ load_indirect->dw0.opcode = OPC_3DSTATE_LOAD_INDIRECT;
+ load_indirect->dw0.mem_select = 1; /* Bearlake only */
+ load_indirect->dw0.block_mask =
+ BLOCK_SIS | BLOCK_SSB | BLOCK_MSB | BLOCK_PSP;
+ load_indirect->dw0.length = 7;
+
+ /* SIS */
+ sis = (sis_state *) (++load_indirect);
+ sis->dw0.valid = 1;
+ sis->dw0.buffer_address = pI915XvMC->sis.offset;
+ sis->dw1.length = ((sizeof(struct i915_3dstate_buffer_info) +
+ sizeof(struct i915_3dstate_dest_buffer_variables))
+ >> 2) - 1;
+
+ /* SSB */
+ ssb = (ssb_state *) (++sis);
+ ssb->dw0.valid = 1;
+ ssb->dw0.buffer_address = pI915XvMC->ssb.offset;
+ ssb->dw1.length = ((sizeof(struct i915_3dstate_sampler_state) +
+ sizeof(struct texture_sampler) * 3) >> 2) - 1;
+
+ /* MSB */
+ msb = (msb_state *) (++ssb);
+ msb->dw0.valid = 1;
+ msb->dw0.buffer_address = pI915XvMC->msb.offset;
+ msb->dw1.length = ((sizeof(struct i915_3dstate_map_state) +
+ sizeof(struct texture_map) * 3) >> 2) - 1;
+
+ /* PSP */
+ psp = (psp_state *) (++msb);
+ psp->dw0.valid = 1;
+ psp->dw0.buffer_address = pI915XvMC->psp.offset;
+ psp->dw1.length = ((sizeof(struct i915_3dstate_pixel_shader_program) +
+ sizeof(union shader_inst)) >> 2) - 1;
+
+ intelBatchbufferData(base, size, 0);
+ free(base);
+
+ /* 3DPRIMITIVE */
+ size = sizeof(*_3dprimitive) + sizeof(*vd) * 3;
+ base = calloc(1, size);
+ _3dprimitive = (struct i915_3dprimitive *)base;
+ _3dprimitive->dw0.inline_prim.type = CMD_3D;
+ _3dprimitive->dw0.inline_prim.opcode = OPC_3DPRIMITIVE;
+ _3dprimitive->dw0.inline_prim.vertex_location = VERTEX_INLINE;
+ _3dprimitive->dw0.inline_prim.prim = PRIM_RECTLIST;
+ _3dprimitive->dw0.inline_prim.length = size - 2;
+
+ vd = (struct vertex_data *)(++_3dprimitive);
+ vd->x = 0; /* FIXME!!! */
+ vd->x = 0; /* FIXME */
+ vd->tc0.tcx = 0;
+ vd->tc0.tcy = 0;
+ vd->tc1.tcx = 0;
+ vd->tc1.tcy = 0;
+
+ ++vd;
+ vd->x = 0; /* FIXME!!! */
+ vd->x = 0; /* FIXME */
+ vd->tc0.tcx = 0;
+ vd->tc0.tcy = 0;
+ vd->tc1.tcx = 0;
+ vd->tc1.tcy = 0;
+
+ ++vd;
+ vd->x = 0; /* FIXME!!! */
+ vd->x = 0; /* FIXME */
+ vd->tc0.tcx = 0;
+ vd->tc0.tcy = 0;
+ vd->tc1.tcx = 0;
+ vd->tc1.tcy = 0;
+
+ intelBatchbufferData(base, size, 0);
+ free(base);
}
#endif
/*
* Function: i915_release_resource
*/
-static void i915_release_resource(Display *display, XvMCContext *context)
+static void i915_release_resource(Display * display, XvMCContext * context)
{
- i915XvMCContext *pI915XvMC;
+ i915XvMCContext *pI915XvMC;
- if (!(pI915XvMC = context->privData))
- return;
+ if (!(pI915XvMC = context->privData))
+ return;
- pI915XvMC->ref--;
- i915_xvmc_unmap_buffers(pI915XvMC);
+ pI915XvMC->ref--;
+ i915_xvmc_unmap_buffers(pI915XvMC);
- free(pI915XvMC);
- context->privData = NULL;
+ free(pI915XvMC);
+ context->privData = NULL;
}
-static Status i915_xvmc_mc_create_context(Display *display, XvMCContext *context,
- int priv_count, CARD32 *priv_data)
+static Status i915_xvmc_mc_create_context(Display * display,
+ XvMCContext * context, int priv_count,
+ CARD32 * priv_data)
{
- i915XvMCContext *pI915XvMC = NULL;
- I915XvMCCreateContextRec *tmpComm = NULL;
-
- XVMC_DBG("%s\n", __FUNCTION__);
-
- if (priv_count != (sizeof(I915XvMCCreateContextRec) >> 2)) {
- XVMC_ERR("_xvmc_create_context() returned incorrect data size!");
- XVMC_INFO("\tExpected %d, got %d",
- (int)(sizeof(I915XvMCCreateContextRec) >> 2),priv_count);
- _xvmc_destroy_context(display, context);
- XFree(priv_data);
- context->privData = NULL;
- return BadValue;
- }
-
- context->privData = (void *)calloc(1, sizeof(i915XvMCContext));
- if (!context->privData) {
- XVMC_ERR("Unable to allocate resources for XvMC context.");
- return BadAlloc;
- }
- pI915XvMC = (i915XvMCContext *)context->privData;
-
- tmpComm = (I915XvMCCreateContextRec *)priv_data;
- pI915XvMC->ctxno = tmpComm->ctxno;
- pI915XvMC->deviceID = tmpComm->deviceID;
- pI915XvMC->sis.handle = tmpComm->sis.handle;
- pI915XvMC->sis.offset = tmpComm->sis.offset;
- pI915XvMC->sis.size = tmpComm->sis.size;
- pI915XvMC->ssb.handle = tmpComm->ssb.handle;
- pI915XvMC->ssb.offset = tmpComm->ssb.offset;
- pI915XvMC->ssb.size = tmpComm->ssb.size;
- pI915XvMC->msb.handle = tmpComm->msb.handle;
- pI915XvMC->msb.offset = tmpComm->msb.offset;
- pI915XvMC->msb.size = tmpComm->msb.size;
- pI915XvMC->psp.handle = tmpComm->psp.handle;
- pI915XvMC->psp.offset = tmpComm->psp.offset;
- pI915XvMC->psp.size = tmpComm->psp.size;
- pI915XvMC->psc.handle = tmpComm->psc.handle;
- pI915XvMC->psc.offset = tmpComm->psc.offset;
- pI915XvMC->psc.size = tmpComm->psc.size;
-
- if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
- pI915XvMC->deviceID == PCI_CHIP_I915_GM) {
- pI915XvMC->sis.bus_addr = tmpComm->sis.bus_addr;
- pI915XvMC->ssb.bus_addr = tmpComm->ssb.bus_addr;
- pI915XvMC->msb.bus_addr = tmpComm->msb.bus_addr;
- pI915XvMC->psp.bus_addr = tmpComm->psp.bus_addr;
- pI915XvMC->psc.bus_addr = tmpComm->psc.bus_addr;
- }
-
- pI915XvMC->corrdata.handle = tmpComm->corrdata.handle;
- pI915XvMC->corrdata.offset = tmpComm->corrdata.offset;
- pI915XvMC->corrdata.size = tmpComm->corrdata.size;
-
- /* Must free the private data we were passed from X */
- XFree(priv_data);
- priv_data = NULL;
-
- if (i915_xvmc_map_buffers(pI915XvMC)) {
- i915_xvmc_unmap_buffers(pI915XvMC);
- free(pI915XvMC);
- context->privData = NULL;
- return BadAlloc;
- }
-
- /* Initialize private context values */
- pI915XvMC->yStride = STRIDE(context->width);
- pI915XvMC->uvStride = STRIDE(context->width >> 1);
- pI915XvMC->haveXv = 0;
- pI915XvMC->dual_prime = 0;
- pI915XvMC->last_flip = 0;
- pI915XvMC->port = context->port;
- pI915XvMC->ref = 1;
-
- /* pre-init state buffers */
- i915_mc_one_time_context_init(context);
- i915_mc_one_time_state_init(context);
-
- i915_mc_static_indirect_state_init(context);
-
- i915_mc_map_state_init(context);
-
- i915_mc_load_indirect_render_init(context);
- return Success;
+ i915XvMCContext *pI915XvMC = NULL;
+ I915XvMCCreateContextRec *tmpComm = NULL;
+
+ XVMC_DBG("%s\n", __FUNCTION__);
+
+ if (priv_count != (sizeof(I915XvMCCreateContextRec) >> 2)) {
+ XVMC_ERR
+ ("_xvmc_create_context() returned incorrect data size!");
+ XVMC_INFO("\tExpected %d, got %d",
+ (int)(sizeof(I915XvMCCreateContextRec) >> 2),
+ priv_count);
+ _xvmc_destroy_context(display, context);
+ XFree(priv_data);
+ context->privData = NULL;
+ return BadValue;
+ }
+
+ context->privData = (void *)calloc(1, sizeof(i915XvMCContext));
+ if (!context->privData) {
+ XVMC_ERR("Unable to allocate resources for XvMC context.");
+ return BadAlloc;
+ }
+ pI915XvMC = (i915XvMCContext *) context->privData;
+
+ tmpComm = (I915XvMCCreateContextRec *) priv_data;
+ pI915XvMC->ctxno = tmpComm->ctxno;
+ pI915XvMC->deviceID = tmpComm->deviceID;
+ pI915XvMC->sis.handle = tmpComm->sis.handle;
+ pI915XvMC->sis.offset = tmpComm->sis.offset;
+ pI915XvMC->sis.size = tmpComm->sis.size;
+ pI915XvMC->ssb.handle = tmpComm->ssb.handle;
+ pI915XvMC->ssb.offset = tmpComm->ssb.offset;
+ pI915XvMC->ssb.size = tmpComm->ssb.size;
+ pI915XvMC->msb.handle = tmpComm->msb.handle;
+ pI915XvMC->msb.offset = tmpComm->msb.offset;
+ pI915XvMC->msb.size = tmpComm->msb.size;
+ pI915XvMC->psp.handle = tmpComm->psp.handle;
+ pI915XvMC->psp.offset = tmpComm->psp.offset;
+ pI915XvMC->psp.size = tmpComm->psp.size;
+ pI915XvMC->psc.handle = tmpComm->psc.handle;
+ pI915XvMC->psc.offset = tmpComm->psc.offset;
+ pI915XvMC->psc.size = tmpComm->psc.size;
+
+ if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
+ pI915XvMC->deviceID == PCI_CHIP_I915_GM) {
+ pI915XvMC->sis.bus_addr = tmpComm->sis.bus_addr;
+ pI915XvMC->ssb.bus_addr = tmpComm->ssb.bus_addr;
+ pI915XvMC->msb.bus_addr = tmpComm->msb.bus_addr;
+ pI915XvMC->psp.bus_addr = tmpComm->psp.bus_addr;
+ pI915XvMC->psc.bus_addr = tmpComm->psc.bus_addr;
+ }
+
+ pI915XvMC->corrdata.handle = tmpComm->corrdata.handle;
+ pI915XvMC->corrdata.offset = tmpComm->corrdata.offset;
+ pI915XvMC->corrdata.size = tmpComm->corrdata.size;
+
+ /* Must free the private data we were passed from X */
+ XFree(priv_data);
+ priv_data = NULL;
+
+ if (i915_xvmc_map_buffers(pI915XvMC)) {
+ i915_xvmc_unmap_buffers(pI915XvMC);
+ free(pI915XvMC);
+ context->privData = NULL;
+ return BadAlloc;
+ }
+
+ /* Initialize private context values */
+ pI915XvMC->yStride = STRIDE(context->width);
+ pI915XvMC->uvStride = STRIDE(context->width >> 1);
+ pI915XvMC->haveXv = 0;
+ pI915XvMC->dual_prime = 0;
+ pI915XvMC->last_flip = 0;
+ pI915XvMC->port = context->port;
+ pI915XvMC->ref = 1;
+
+ /* pre-init state buffers */
+ i915_mc_one_time_context_init(context);
+ i915_mc_one_time_state_init(context);
+
+ i915_mc_static_indirect_state_init(context);
+
+ i915_mc_map_state_init(context);
+
+ i915_mc_load_indirect_render_init(context);
+ return Success;
}
-static int i915_xvmc_mc_destroy_context(Display *display, XvMCContext *context)
+static int i915_xvmc_mc_destroy_context(Display * display,
+ XvMCContext * context)
{
- i915XvMCContext *pI915XvMC;
+ i915XvMCContext *pI915XvMC;
- if (!(pI915XvMC = context->privData))
- return XvMCBadContext;
+ if (!(pI915XvMC = context->privData))
+ return XvMCBadContext;
- /* Pass Control to the X server to destroy the drm_context_t */
- i915_release_resource(display,context);
+ /* Pass Control to the X server to destroy the drm_context_t */
+ i915_release_resource(display, context);
- free(one_time_load_state_imm1);
- free(one_time_load_indirect);
- free(mc_render_load_indirect);
- return Success;
+ free(one_time_load_state_imm1);
+ free(one_time_load_indirect);
+ free(mc_render_load_indirect);
+ return Success;
}
-static Status i915_xvmc_mc_create_surface(Display *display,
- XvMCContext *context, XvMCSurface *surface, int priv_count,
- CARD32 *priv_data)
+static Status i915_xvmc_mc_create_surface(Display * display,
+ XvMCContext * context,
+ XvMCSurface * surface, int priv_count,
+ CARD32 * priv_data)
{
- i915XvMCContext *pI915XvMC;
- i915XvMCSurface *pI915Surface;
- I915XvMCCreateSurfaceRec *tmpComm = NULL;
-
- if (!(pI915XvMC = context->privData))
- return XvMCBadContext;
-
- XVMC_DBG("%s\n", __FUNCTION__);
-
- if (priv_count != (sizeof(I915XvMCCreateSurfaceRec) >> 2)) {
- XVMC_ERR("_xvmc_create_surface() returned incorrect data size!");
- XVMC_INFO("\tExpected %d, got %d",
- (int)(sizeof(I915XvMCCreateSurfaceRec) >> 2), priv_count);
- _xvmc_destroy_surface(display, surface);
- XFree(priv_data);
- return BadAlloc;
- }
-
- PPTHREAD_MUTEX_LOCK();
- surface->privData = (i915XvMCSurface *)malloc(sizeof(i915XvMCSurface));
-
- if (!(pI915Surface = surface->privData)) {
- PPTHREAD_MUTEX_UNLOCK();
- return BadAlloc;
- }
-
- /* Initialize private values */
- pI915Surface->last_render = 0;
- pI915Surface->last_flip = 0;
- pI915Surface->yStride = pI915XvMC->yStride;
- pI915Surface->uvStride = pI915XvMC->uvStride;
- pI915Surface->width = context->width;
- pI915Surface->height = context->height;
- pI915Surface->privContext = pI915XvMC;
- pI915Surface->privSubPic = NULL;
- pI915Surface->srf.map = NULL;
-
- tmpComm = (I915XvMCCreateSurfaceRec *)priv_data;
-
- pI915Surface->srfNo = tmpComm->srfno;
- pI915Surface->srf.handle = tmpComm->srf.handle;
- pI915Surface->srf.offset = tmpComm->srf.offset;
- pI915Surface->srf.size = tmpComm->srf.size;
-
- XFree(priv_data);
-
- if (drmMap(xvmc_driver->fd,
- pI915Surface->srf.handle,
- pI915Surface->srf.size,
- (drmAddress *)&pI915Surface->srf.map) != 0) {
- XVMC_ERR("mapping surface memory failed!\n");
- _xvmc_destroy_surface(display, surface);
- free(pI915Surface);
- surface->privData = NULL;
- PPTHREAD_MUTEX_UNLOCK();
- return BadAlloc;
- }
-
- pI915XvMC->ref++;
- PPTHREAD_MUTEX_UNLOCK();
- return 0;
+ i915XvMCContext *pI915XvMC;
+ i915XvMCSurface *pI915Surface;
+ I915XvMCCreateSurfaceRec *tmpComm = NULL;
+
+ if (!(pI915XvMC = context->privData))
+ return XvMCBadContext;
+
+ XVMC_DBG("%s\n", __FUNCTION__);
+
+ if (priv_count != (sizeof(I915XvMCCreateSurfaceRec) >> 2)) {
+ XVMC_ERR
+ ("_xvmc_create_surface() returned incorrect data size!");
+ XVMC_INFO("\tExpected %d, got %d",
+ (int)(sizeof(I915XvMCCreateSurfaceRec) >> 2),
+ priv_count);
+ _xvmc_destroy_surface(display, surface);
+ XFree(priv_data);
+ return BadAlloc;
+ }
+
+ PPTHREAD_MUTEX_LOCK();
+ surface->privData = (i915XvMCSurface *) malloc(sizeof(i915XvMCSurface));
+
+ if (!(pI915Surface = surface->privData)) {
+ PPTHREAD_MUTEX_UNLOCK();
+ return BadAlloc;
+ }
+
+ /* Initialize private values */
+ pI915Surface->last_render = 0;
+ pI915Surface->last_flip = 0;
+ pI915Surface->yStride = pI915XvMC->yStride;
+ pI915Surface->uvStride = pI915XvMC->uvStride;
+ pI915Surface->width = context->width;
+ pI915Surface->height = context->height;
+ pI915Surface->privContext = pI915XvMC;
+ pI915Surface->privSubPic = NULL;
+ pI915Surface->srf.map = NULL;
+
+ tmpComm = (I915XvMCCreateSurfaceRec *) priv_data;
+
+ pI915Surface->srfNo = tmpComm->srfno;
+ pI915Surface->srf.handle = tmpComm->srf.handle;
+ pI915Surface->srf.offset = tmpComm->srf.offset;
+ pI915Surface->srf.size = tmpComm->srf.size;
+
+ XFree(priv_data);
+
+ if (drmMap(xvmc_driver->fd,
+ pI915Surface->srf.handle,
+ pI915Surface->srf.size,
+ (drmAddress *) & pI915Surface->srf.map) != 0) {
+ XVMC_ERR("mapping surface memory failed!\n");
+ _xvmc_destroy_surface(display, surface);
+ free(pI915Surface);
+ surface->privData = NULL;
+ PPTHREAD_MUTEX_UNLOCK();
+ return BadAlloc;
+ }
+
+ pI915XvMC->ref++;
+ PPTHREAD_MUTEX_UNLOCK();
+ return 0;
}
-
-static int i915_xvmc_mc_destroy_surface(Display *display, XvMCSurface *surface)
+static int i915_xvmc_mc_destroy_surface(Display * display,
+ XvMCSurface * surface)
{
- i915XvMCSurface *pI915Surface;
- i915XvMCContext *pI915XvMC;
+ i915XvMCSurface *pI915Surface;
+ i915XvMCContext *pI915XvMC;
- if (!display || !surface)
- return BadValue;
+ if (!display || !surface)
+ return BadValue;
- if (!(pI915Surface = surface->privData))
- return XvMCBadSurface;
+ if (!(pI915Surface = surface->privData))
+ return XvMCBadSurface;
- if (!(pI915XvMC = pI915Surface->privContext))
- return XvMCBadSurface;
+ if (!(pI915XvMC = pI915Surface->privContext))
+ return XvMCBadSurface;
- if (pI915Surface->last_flip)
- XvMCSyncSurface(display,surface);
+ if (pI915Surface->last_flip)
+ XvMCSyncSurface(display, surface);
- if (pI915Surface->srf.map)
- drmUnmap(pI915Surface->srf.map, pI915Surface->srf.size);
+ if (pI915Surface->srf.map)
+ drmUnmap(pI915Surface->srf.map, pI915Surface->srf.size);
- free(pI915Surface);
- surface->privData = NULL;
- pI915XvMC->ref--;
+ free(pI915Surface);
+ surface->privData = NULL;
+ pI915XvMC->ref--;
- return Success;
+ return Success;
}
-
-static int i915_xvmc_mc_render_surface(Display *display, XvMCContext *context,
- unsigned int picture_structure,
- XvMCSurface *target_surface,
- XvMCSurface *past_surface,
- XvMCSurface *future_surface,
- unsigned int flags,
- unsigned int num_macroblocks,
- unsigned int first_macroblock,
- XvMCMacroBlockArray *macroblock_array,
- XvMCBlockArray *blocks)
+static int i915_xvmc_mc_render_surface(Display * display, XvMCContext * context,
+ unsigned int picture_structure,
+ XvMCSurface * target_surface,
+ XvMCSurface * past_surface,
+ XvMCSurface * future_surface,
+ unsigned int flags,
+ unsigned int num_macroblocks,
+ unsigned int first_macroblock,
+ XvMCMacroBlockArray * macroblock_array,
+ XvMCBlockArray * blocks)
{
- int i;
- int picture_coding_type = MPEG_I_PICTURE;
- /* correction data buffer */
- char *corrdata_ptr;
- int corrdata_size = 0;
-
- /* Block Pointer */
- short *block_ptr;
- /* Current Macroblock Pointer */
- XvMCMacroBlock *mb;
-
- intel_xvmc_context_ptr intel_ctx;
-
- i915XvMCSurface *privTarget = NULL;
- i915XvMCSurface *privFuture = NULL;
- i915XvMCSurface *privPast = NULL;
- i915XvMCContext *pI915XvMC = NULL;
-
- XVMC_DBG("%s\n", __FUNCTION__);
-
- /* Check Parameters for validity */
- if (!display || !context || !target_surface) {
- XVMC_ERR("Invalid Display, Context or Target!");
- return BadValue;
- }
-
- if (!num_macroblocks)
- return Success;
-
- if (!macroblock_array || !blocks) {
- XVMC_ERR("Invalid block data!");
- return BadValue;
- }
-
- if (macroblock_array->num_blocks < (num_macroblocks + first_macroblock)) {
- XVMC_ERR("Too many macroblocks requested for MB array size.");
- return BadValue;
- }
-
- if (!(pI915XvMC = context->privData))
- return XvMCBadContext;
-
- if (!(privTarget = target_surface->privData))
- return XvMCBadSurface;
-
- if (context->surface_type_id >= SURFACE_TYPE_MAX) {
- XVMC_ERR("Unsupprted surface_type_id %d.", context->surface_type_id);
- return BadValue;
- }
-
- intel_ctx = intel_xvmc_find_context(context->context_id);
- if (!intel_ctx) {
- XVMC_ERR("Can't find intel xvmc context\n");
- return BadValue;
- }
-
- /* P Frame Test */
- if (!past_surface) {
- /* Just to avoid some ifs later. */
- privPast = privTarget;
- } else {
- if (!(privPast = past_surface->privData)) {
- XVMC_ERR("Invalid Past Surface!");
- return XvMCBadSurface;
- }
- picture_coding_type = MPEG_P_PICTURE;
- }
-
- /* B Frame Test */
- if (!future_surface) {
- privFuture = privPast; // privTarget;
- } else {
- if (!past_surface) {
- XVMC_ERR("No Past Surface!");
- return BadValue;
- }
-
- if (!(privFuture = future_surface->privData)) {
- XVMC_ERR("Invalid Future Surface!");
- return XvMCBadSurface;
- }
-
- picture_coding_type = MPEG_B_PICTURE;
- }
-
- LOCK_HARDWARE(intel_ctx->hw_context);
- corrdata_ptr = pI915XvMC->corrdata.map;
- corrdata_size = 0;
-
- for (i = first_macroblock; i < (num_macroblocks + first_macroblock); i++) {
- int bspm = 0;
- mb = &macroblock_array->macro_blocks[i];
- block_ptr = &(blocks->blocks[mb->index << 6]);
-
- /* Lockup can happen if the coordinates are too far out of range */
- if (mb->x > (target_surface->width >> 4)) {
- mb->x = 0;
- XVMC_INFO("reset x");
- }
-
- if (mb->y > (target_surface->height >> 4)) {
- mb->y = 0;
- XVMC_INFO("reset y");
- }
-
- /* Catch no pattern case */
- if (!(mb->macroblock_type & XVMC_MB_TYPE_PATTERN) &&
- !(mb->macroblock_type & XVMC_MB_TYPE_INTRA) &&
- mb->coded_block_pattern) {
- mb->coded_block_pattern = 0;
- XVMC_INFO("no coded blocks present!");
- }
-
- bspm = mb_bytes_420[mb->coded_block_pattern];
-
- if (!bspm)
- continue;
-
- corrdata_size += bspm;
-
- if (corrdata_size > pI915XvMC->corrdata.size) {
- XVMC_ERR("correction data buffer overflow.");
- break;
- }
- memcpy(corrdata_ptr, block_ptr, bspm);
- corrdata_ptr += bspm;
- }
-
- i915_flush(1, 0);
- // i915_mc_invalidate_subcontext_buffers(context, BLOCK_SIS | BLOCK_DIS | BLOCK_SSB
- // | BLOCK_MSB | BLOCK_PSP | BLOCK_PSC);
-
- i915_mc_one_time_state_emit();
-
- i915_mc_static_indirect_state_set(context, target_surface, picture_structure,
- flags, picture_coding_type);
- /* setup reference surfaces */
- i915_mc_map_state_set(context, privPast, privFuture);
-
- i915_mc_load_indirect_render_emit();
-
- i915_mc_mpeg_set_origin(context, &macroblock_array->macro_blocks[first_macroblock]);
-
- for (i = first_macroblock; i < (num_macroblocks + first_macroblock); i++) {
- mb = &macroblock_array->macro_blocks[i];
-
- /* Intra Blocks */
- if (mb->macroblock_type & XVMC_MB_TYPE_INTRA) {
- i915_mc_mpeg_macroblock_ipicture(context, mb);
- } else if ((picture_structure & XVMC_FRAME_PICTURE) == XVMC_FRAME_PICTURE) {
- /* Frame Picture */
- switch (mb->motion_type & 3) {
- case XVMC_PREDICTION_FIELD: /* Field Based */
- i915_mc_mpeg_macroblock_2fbmv(context, mb, picture_structure);
- break;
-
- case XVMC_PREDICTION_FRAME: /* Frame Based */
- i915_mc_mpeg_macroblock_1fbmv(context, mb);
- break;
-
- case XVMC_PREDICTION_DUAL_PRIME: /* Dual Prime */
- i915_mc_mpeg_macroblock_2fbmv(context, mb, picture_structure);
- break;
-
- default: /* No Motion Type */
- XVMC_ERR("Invalid Macroblock Parameters found.");
- break;
- }
- } else { /* Field Picture */
- switch (mb->motion_type & 3) {
- case XVMC_PREDICTION_FIELD: /* Field Based */
- i915_mc_mpeg_macroblock_1fbmv(context, mb);
- break;
-
- case XVMC_PREDICTION_16x8: /* 16x8 MC */
- i915_mc_mpeg_macroblock_2fbmv(context, mb, picture_structure);
- break;
-
- case XVMC_PREDICTION_DUAL_PRIME: /* Dual Prime */
- i915_mc_mpeg_macroblock_1fbmv(context, mb);
- break;
-
- default: /* No Motion Type */
- XVMC_ERR("Invalid Macroblock Parameters found.");
- break;
- }
- }
- }
-
- intelFlushBatch(TRUE);
- xvmc_driver->last_render = xvmc_driver->alloc.irq_emitted;
- privTarget->last_render = xvmc_driver->last_render;
-
- UNLOCK_HARDWARE(intel_ctx->hw_context);
- return 0;
+ int i;
+ int picture_coding_type = MPEG_I_PICTURE;
+ /* correction data buffer */
+ char *corrdata_ptr;
+ int corrdata_size = 0;
+
+ /* Block Pointer */
+ short *block_ptr;
+ /* Current Macroblock Pointer */
+ XvMCMacroBlock *mb;
+
+ intel_xvmc_context_ptr intel_ctx;
+
+ i915XvMCSurface *privTarget = NULL;
+ i915XvMCSurface *privFuture = NULL;
+ i915XvMCSurface *privPast = NULL;
+ i915XvMCContext *pI915XvMC = NULL;
+
+ XVMC_DBG("%s\n", __FUNCTION__);
+
+ /* Check Parameters for validity */
+ if (!display || !context || !target_surface) {
+ XVMC_ERR("Invalid Display, Context or Target!");
+ return BadValue;
+ }
+
+ if (!num_macroblocks)
+ return Success;
+
+ if (!macroblock_array || !blocks) {
+ XVMC_ERR("Invalid block data!");
+ return BadValue;
+ }
+
+ if (macroblock_array->num_blocks < (num_macroblocks + first_macroblock)) {
+ XVMC_ERR("Too many macroblocks requested for MB array size.");
+ return BadValue;
+ }
+
+ if (!(pI915XvMC = context->privData))
+ return XvMCBadContext;
+
+ if (!(privTarget = target_surface->privData))
+ return XvMCBadSurface;
+
+ if (context->surface_type_id >= SURFACE_TYPE_MAX) {
+ XVMC_ERR("Unsupprted surface_type_id %d.",
+ context->surface_type_id);
+ return BadValue;
+ }
+
+ intel_ctx = intel_xvmc_find_context(context->context_id);
+ if (!intel_ctx) {
+ XVMC_ERR("Can't find intel xvmc context\n");
+ return BadValue;
+ }
+
+ /* P Frame Test */
+ if (!past_surface) {
+ /* Just to avoid some ifs later. */
+ privPast = privTarget;
+ } else {
+ if (!(privPast = past_surface->privData)) {
+ XVMC_ERR("Invalid Past Surface!");
+ return XvMCBadSurface;
+ }
+ picture_coding_type = MPEG_P_PICTURE;
+ }
+
+ /* B Frame Test */
+ if (!future_surface) {
+ privFuture = privPast; // privTarget;
+ } else {
+ if (!past_surface) {
+ XVMC_ERR("No Past Surface!");
+ return BadValue;
+ }
+
+ if (!(privFuture = future_surface->privData)) {
+ XVMC_ERR("Invalid Future Surface!");
+ return XvMCBadSurface;
+ }
+
+ picture_coding_type = MPEG_B_PICTURE;
+ }
+
+ LOCK_HARDWARE(intel_ctx->hw_context);
+ corrdata_ptr = pI915XvMC->corrdata.map;
+ corrdata_size = 0;
+
+ for (i = first_macroblock; i < (num_macroblocks + first_macroblock);
+ i++) {
+ int bspm = 0;
+ mb = &macroblock_array->macro_blocks[i];
+ block_ptr = &(blocks->blocks[mb->index << 6]);
+
+ /* Lockup can happen if the coordinates are too far out of range */
+ if (mb->x > (target_surface->width >> 4)) {
+ mb->x = 0;
+ XVMC_INFO("reset x");
+ }
+
+ if (mb->y > (target_surface->height >> 4)) {
+ mb->y = 0;
+ XVMC_INFO("reset y");
+ }
+
+ /* Catch no pattern case */
+ if (!(mb->macroblock_type & XVMC_MB_TYPE_PATTERN) &&
+ !(mb->macroblock_type & XVMC_MB_TYPE_INTRA) &&
+ mb->coded_block_pattern) {
+ mb->coded_block_pattern = 0;
+ XVMC_INFO("no coded blocks present!");
+ }
+
+ bspm = mb_bytes_420[mb->coded_block_pattern];
+
+ if (!bspm)
+ continue;
+
+ corrdata_size += bspm;
+
+ if (corrdata_size > pI915XvMC->corrdata.size) {
+ XVMC_ERR("correction data buffer overflow.");
+ break;
+ }
+ memcpy(corrdata_ptr, block_ptr, bspm);
+ corrdata_ptr += bspm;
+ }
+
+ i915_flush(1, 0);
+ // i915_mc_invalidate_subcontext_buffers(context, BLOCK_SIS | BLOCK_DIS | BLOCK_SSB
+ // | BLOCK_MSB | BLOCK_PSP | BLOCK_PSC);
+
+ i915_mc_one_time_state_emit();
+
+ i915_mc_static_indirect_state_set(context, target_surface,
+ picture_structure, flags,
+ picture_coding_type);
+ /* setup reference surfaces */
+ i915_mc_map_state_set(context, privPast, privFuture);
+
+ i915_mc_load_indirect_render_emit();
+
+ i915_mc_mpeg_set_origin(context,
+ &macroblock_array->macro_blocks
+ [first_macroblock]);
+
+ for (i = first_macroblock; i < (num_macroblocks + first_macroblock);
+ i++) {
+ mb = &macroblock_array->macro_blocks[i];
+
+ /* Intra Blocks */
+ if (mb->macroblock_type & XVMC_MB_TYPE_INTRA) {
+ i915_mc_mpeg_macroblock_ipicture(context, mb);
+ } else if ((picture_structure & XVMC_FRAME_PICTURE) ==
+ XVMC_FRAME_PICTURE) {
+ /* Frame Picture */
+ switch (mb->motion_type & 3) {
+ case XVMC_PREDICTION_FIELD: /* Field Based */
+ i915_mc_mpeg_macroblock_2fbmv(context, mb,
+ picture_structure);
+ break;
+
+ case XVMC_PREDICTION_FRAME: /* Frame Based */
+ i915_mc_mpeg_macroblock_1fbmv(context, mb);
+ break;
+
+ case XVMC_PREDICTION_DUAL_PRIME: /* Dual Prime */
+ i915_mc_mpeg_macroblock_2fbmv(context, mb,
+ picture_structure);
+ break;
+
+ default: /* No Motion Type */
+ XVMC_ERR
+ ("Invalid Macroblock Parameters found.");
+ break;
+ }
+ } else { /* Field Picture */
+ switch (mb->motion_type & 3) {
+ case XVMC_PREDICTION_FIELD: /* Field Based */
+ i915_mc_mpeg_macroblock_1fbmv(context, mb);
+ break;
+
+ case XVMC_PREDICTION_16x8: /* 16x8 MC */
+ i915_mc_mpeg_macroblock_2fbmv(context, mb,
+ picture_structure);
+ break;
+
+ case XVMC_PREDICTION_DUAL_PRIME: /* Dual Prime */
+ i915_mc_mpeg_macroblock_1fbmv(context, mb);
+ break;
+
+ default: /* No Motion Type */
+ XVMC_ERR
+ ("Invalid Macroblock Parameters found.");
+ break;
+ }
+ }
+ }
+
+ intelFlushBatch(TRUE);
+ xvmc_driver->last_render = xvmc_driver->alloc.irq_emitted;
+ privTarget->last_render = xvmc_driver->last_render;
+
+ UNLOCK_HARDWARE(intel_ctx->hw_context);
+ return 0;
}
-static int i915_xvmc_mc_put_surface(Display *display,XvMCSurface *surface,
- Drawable draw, short srcx, short srcy,
- unsigned short srcw, unsigned short srch,
- short destx, short desty,
- unsigned short destw, unsigned short desth,
- int flags, struct intel_xvmc_command *data)
+static int i915_xvmc_mc_put_surface(Display * display, XvMCSurface * surface,
+ Drawable draw, short srcx, short srcy,
+ unsigned short srcw, unsigned short srch,
+ short destx, short desty,
+ unsigned short destw, unsigned short desth,
+ int flags, struct intel_xvmc_command *data)
{
- i915XvMCContext *pI915XvMC;
- i915XvMCSurface *pI915Surface;
- i915XvMCSubpicture *pI915SubPic;
+ i915XvMCContext *pI915XvMC;
+ i915XvMCSurface *pI915Surface;
+ i915XvMCSubpicture *pI915SubPic;
- if (!(pI915Surface = surface->privData))
- return XvMCBadSurface;
+ if (!(pI915Surface = surface->privData))
+ return XvMCBadSurface;
- if (!(pI915XvMC = pI915Surface->privContext))
- return XvMCBadSurface;
+ if (!(pI915XvMC = pI915Surface->privContext))
+ return XvMCBadSurface;
- PPTHREAD_MUTEX_LOCK();
+ PPTHREAD_MUTEX_LOCK();
- data->command = INTEL_XVMC_COMMAND_DISPLAY;
- data->ctxNo = pI915XvMC->ctxno;
- data->srfNo = pI915Surface->srfNo;
- pI915SubPic = pI915Surface->privSubPic;
- data->subPicNo = (!pI915SubPic ? 0 : pI915SubPic->srfNo);
- data->real_id = FOURCC_YV12;
- data->flags = flags;
+ data->command = INTEL_XVMC_COMMAND_DISPLAY;
+ data->ctxNo = pI915XvMC->ctxno;
+ data->srfNo = pI915Surface->srfNo;
+ pI915SubPic = pI915Surface->privSubPic;
+ data->subPicNo = (!pI915SubPic ? 0 : pI915SubPic->srfNo);
+ data->real_id = FOURCC_YV12;
+ data->flags = flags;
- PPTHREAD_MUTEX_UNLOCK();
+ PPTHREAD_MUTEX_UNLOCK();
- return 0;
+ return 0;
}
-static int i915_xvmc_mc_get_surface_status(Display *display,
- XvMCSurface *surface, int *stat)
+static int i915_xvmc_mc_get_surface_status(Display * display,
+ XvMCSurface * surface, int *stat)
{
- i915XvMCSurface *pI915Surface;
- i915XvMCContext *pI915XvMC;
-
- if (!display || !surface || !stat)
- return BadValue;
-
- *stat = 0;
-
- if (!(pI915Surface = surface->privData))
- return XvMCBadSurface;
-
- if (!(pI915XvMC = pI915Surface->privContext))
- return XvMCBadSurface;
-
- PPTHREAD_MUTEX_LOCK();
- if (pI915Surface->last_flip) {
- /* This can not happen */
- if (pI915XvMC->last_flip < pI915Surface->last_flip) {
- XVMC_ERR("Context last flip is less than surface last flip.");
- PPTHREAD_MUTEX_UNLOCK();
- return BadValue;
- }
-
- /*
- If the context has 2 or more flips after this surface it
- cannot be displaying. Don't bother to check.
- */
- if (!(pI915XvMC->last_flip > (pI915Surface->last_flip + 1))) {
- /*
- If this surface was the last flipped it is either displaying
- or about to be so don't bother checking.
- */
- if (pI915XvMC->last_flip == pI915Surface->last_flip) {
- *stat |= XVMC_DISPLAYING;
- }
- }
- }
-
- PPTHREAD_MUTEX_UNLOCK();
- return 0;
+ i915XvMCSurface *pI915Surface;
+ i915XvMCContext *pI915XvMC;
+
+ if (!display || !surface || !stat)
+ return BadValue;
+
+ *stat = 0;
+
+ if (!(pI915Surface = surface->privData))
+ return XvMCBadSurface;
+
+ if (!(pI915XvMC = pI915Surface->privContext))
+ return XvMCBadSurface;
+
+ PPTHREAD_MUTEX_LOCK();
+ if (pI915Surface->last_flip) {
+ /* This can not happen */
+ if (pI915XvMC->last_flip < pI915Surface->last_flip) {
+ XVMC_ERR
+ ("Context last flip is less than surface last flip.");
+ PPTHREAD_MUTEX_UNLOCK();
+ return BadValue;
+ }
+
+ /*
+ If the context has 2 or more flips after this surface it
+ cannot be displaying. Don't bother to check.
+ */
+ if (!(pI915XvMC->last_flip > (pI915Surface->last_flip + 1))) {
+ /*
+ If this surface was the last flipped it is either displaying
+ or about to be so don't bother checking.
+ */
+ if (pI915XvMC->last_flip == pI915Surface->last_flip) {
+ *stat |= XVMC_DISPLAYING;
+ }
+ }
+ }
+
+ PPTHREAD_MUTEX_UNLOCK();
+ return 0;
}
/* XXX WIP code */
#if 0
-Status XvMCHideSurface(Display *display, XvMCSurface *surface)
+Status XvMCHideSurface(Display * display, XvMCSurface * surface)
{
- i915XvMCSurface *pI915Surface;
- i915XvMCContext *pI915XvMC;
- int stat = 0, ret;
+ i915XvMCSurface *pI915Surface;
+ i915XvMCContext *pI915XvMC;
+ int stat = 0, ret;
- if (!display || !surface)
- return BadValue;
+ if (!display || !surface)
+ return BadValue;
- if (!(pI915Surface = surface->privData))
- return XvMCBadSurface;
+ if (!(pI915Surface = surface->privData))
+ return XvMCBadSurface;
- /* Get the associated context pointer */
- if (!(pI915XvMC = pI915Surface->privContext))
- return XvMCBadSurface;
+ /* Get the associated context pointer */
+ if (!(pI915XvMC = pI915Surface->privContext))
+ return XvMCBadSurface;
- XvMCSyncSurface(display, surface);
+ XvMCSyncSurface(display, surface);
- /*
- Get the status of the surface, if it is not currently displayed
- we don't need to worry about it.
- */
- if ((ret = XvMCGetSurfaceStatus(display, surface, &stat)) != Success)
- return ret;
+ /*
+ Get the status of the surface, if it is not currently displayed
+ we don't need to worry about it.
+ */
+ if ((ret = XvMCGetSurfaceStatus(display, surface, &stat)) != Success)
+ return ret;
- if (!(stat & XVMC_DISPLAYING))
- return Success;
+ if (!(stat & XVMC_DISPLAYING))
+ return Success;
- /* FIXME: */
- return Success;
+ /* FIXME: */
+ return Success;
}
-Status i915_xvmc_create_subpict(Display *display, XvMCContext *context,
- XvMCSubpicture *subpicture,
- unsigned short width, unsigned short height,
- int xvimage_id)
+Status i915_xvmc_create_subpict(Display * display, XvMCContext * context,
+ XvMCSubpicture * subpicture,
+ unsigned short width, unsigned short height,
+ int xvimage_id)
{
- Status ret;
- i915XvMCContext *pI915XvMC;
- i915XvMCSubpicture *pI915Subpicture;
- I915XvMCCreateSurfaceRec *tmpComm = NULL;
- int priv_count;
- uint *priv_data;
-
- if (!subpicture || !context || !display)
- return BadValue;
-
- pI915XvMC = (i915XvMCContext *)context->privData;
-
- if (!pI915XvMC)
- return XvMCBadContext;
-
- subpicture->privData =
- (i915XvMCSubpicture *)malloc(sizeof(i915XvMCSubpicture));
-
- if (!subpicture->privData)
- return BadAlloc;
-
- PPTHREAD_MUTEX_LOCK();
- subpicture->context_id = context->context_id;
- subpicture->xvimage_id = xvimage_id;
- subpicture->width = width;
- subpicture->height = height;
- pI915Subpicture = (i915XvMCSubpicture *)subpicture->privData;
-
- XLockDisplay(display);
- if ((ret = _xvmc_create_subpicture(display, context, subpicture,
- &priv_count, &priv_data))) {
- XUnlockDisplay(display);
- XVMC_ERR("Unable to create XvMCSubpicture.");
- free(pI915Subpicture);
- subpicture->privData = NULL;
- PPTHREAD_MUTEX_UNLOCK();
- return ret;
- }
- XUnlockDisplay(display);
-
- if (priv_count != (sizeof(I915XvMCCreateSurfaceRec) >> 2)) {
- XVMC_ERR("_xvmc_create_subpicture() returned incorrect data size!");
- XVMC_INFO("\tExpected %d, got %d",
- (int)(sizeof(I915XvMCCreateSurfaceRec) >> 2), priv_count);
- XLockDisplay(display);
- _xvmc_destroy_subpicture(display, subpicture);
- XUnlockDisplay(display);
- XFree(priv_data);
- free(pI915Subpicture);
- subpicture->privData = NULL;
- PPTHREAD_MUTEX_UNLOCK();
- return BadAlloc;
- }
-
- tmpComm = (I915XvMCCreateSurfaceRec *)priv_data;
- pI915Subpicture->srfNo = tmpComm->srfno;
- pI915Subpicture->srf.handle = tmpComm->srf.handle;
- pI915Subpicture->srf.offset = tmpComm->srf.offset;
- pI915Subpicture->srf.size = tmpComm->srf.size;
- XFree(priv_data);
-
- if (drmMap(pI915XvMC->fd,
- pI915Subpicture->srf.handle,
- pI915Subpicture->srf.size,
- (drmAddress *)&pI915Subpicture->srf.map) != 0) {
- XLockDisplay(display);
- _xvmc_destroy_subpicture(display, subpicture);
- XUnlockDisplay(display);
- free(pI915Subpicture);
- subpicture->privData = NULL;
- PPTHREAD_MUTEX_UNLOCK();
- return BadAlloc;
- }
-
- /* subpicture */
- subpicture->num_palette_entries = I915_SUBPIC_PALETTE_SIZE;
- subpicture->entry_bytes = 3;
- strncpy(subpicture->component_order, "YUV", 4);
-
- /* Initialize private values */
- pI915Subpicture->privContext = pI915XvMC;
- pI915Subpicture->last_render= 0;
- pI915Subpicture->last_flip = 0;
- pI915Subpicture->pitch = ((subpicture->width + 3) & ~3);
-
- switch(subpicture->xvimage_id) {
- case FOURCC_IA44:
- case FOURCC_AI44:
- break;
-
- default:
- drmUnmap(pI915Subpicture->srf.map, pI915Subpicture->srf.size);
- XLockDisplay(display);
- _xvmc_destroy_subpicture(display, subpicture);
- XUnlockDisplay(display);
- free(pI915Subpicture);
- subpicture->privData = NULL;
- PPTHREAD_MUTEX_UNLOCK();
- return BadMatch;
- }
-
- pI915XvMC->ref++;
- PPTHREAD_MUTEX_UNLOCK();
- return Success;
+ Status ret;
+ i915XvMCContext *pI915XvMC;
+ i915XvMCSubpicture *pI915Subpicture;
+ I915XvMCCreateSurfaceRec *tmpComm = NULL;
+ int priv_count;
+ uint *priv_data;
+
+ if (!subpicture || !context || !display)
+ return BadValue;
+
+ pI915XvMC = (i915XvMCContext *) context->privData;
+
+ if (!pI915XvMC)
+ return XvMCBadContext;
+
+ subpicture->privData =
+ (i915XvMCSubpicture *) malloc(sizeof(i915XvMCSubpicture));
+
+ if (!subpicture->privData)
+ return BadAlloc;
+
+ PPTHREAD_MUTEX_LOCK();
+ subpicture->context_id = context->context_id;
+ subpicture->xvimage_id = xvimage_id;
+ subpicture->width = width;
+ subpicture->height = height;
+ pI915Subpicture = (i915XvMCSubpicture *) subpicture->privData;
+
+ XLockDisplay(display);
+ if ((ret = _xvmc_create_subpicture(display, context, subpicture,
+ &priv_count, &priv_data))) {
+ XUnlockDisplay(display);
+ XVMC_ERR("Unable to create XvMCSubpicture.");
+ free(pI915Subpicture);
+ subpicture->privData = NULL;
+ PPTHREAD_MUTEX_UNLOCK();
+ return ret;
+ }
+ XUnlockDisplay(display);
+
+ if (priv_count != (sizeof(I915XvMCCreateSurfaceRec) >> 2)) {
+ XVMC_ERR
+ ("_xvmc_create_subpicture() returned incorrect data size!");
+ XVMC_INFO("\tExpected %d, got %d",
+ (int)(sizeof(I915XvMCCreateSurfaceRec) >> 2),
+ priv_count);
+ XLockDisplay(display);
+ _xvmc_destroy_subpicture(display, subpicture);
+ XUnlockDisplay(display);
+ XFree(priv_data);
+ free(pI915Subpicture);
+ subpicture->privData = NULL;
+ PPTHREAD_MUTEX_UNLOCK();
+ return BadAlloc;
+ }
+
+ tmpComm = (I915XvMCCreateSurfaceRec *) priv_data;
+ pI915Subpicture->srfNo = tmpComm->srfno;
+ pI915Subpicture->srf.handle = tmpComm->srf.handle;
+ pI915Subpicture->srf.offset = tmpComm->srf.offset;
+ pI915Subpicture->srf.size = tmpComm->srf.size;
+ XFree(priv_data);
+
+ if (drmMap(pI915XvMC->fd,
+ pI915Subpicture->srf.handle,
+ pI915Subpicture->srf.size,
+ (drmAddress *) & pI915Subpicture->srf.map) != 0) {
+ XLockDisplay(display);
+ _xvmc_destroy_subpicture(display, subpicture);
+ XUnlockDisplay(display);
+ free(pI915Subpicture);
+ subpicture->privData = NULL;
+ PPTHREAD_MUTEX_UNLOCK();
+ return BadAlloc;
+ }
+
+ /* subpicture */
+ subpicture->num_palette_entries = I915_SUBPIC_PALETTE_SIZE;
+ subpicture->entry_bytes = 3;
+ strncpy(subpicture->component_order, "YUV", 4);
+
+ /* Initialize private values */
+ pI915Subpicture->privContext = pI915XvMC;
+ pI915Subpicture->last_render = 0;
+ pI915Subpicture->last_flip = 0;
+ pI915Subpicture->pitch = ((subpicture->width + 3) & ~3);
+
+ switch (subpicture->xvimage_id) {
+ case FOURCC_IA44:
+ case FOURCC_AI44:
+ break;
+
+ default:
+ drmUnmap(pI915Subpicture->srf.map, pI915Subpicture->srf.size);
+ XLockDisplay(display);
+ _xvmc_destroy_subpicture(display, subpicture);
+ XUnlockDisplay(display);
+ free(pI915Subpicture);
+ subpicture->privData = NULL;
+ PPTHREAD_MUTEX_UNLOCK();
+ return BadMatch;
+ }
+
+ pI915XvMC->ref++;
+ PPTHREAD_MUTEX_UNLOCK();
+ return Success;
}
-Status i915_xvmc_clear_subpict(Display *display, XvMCSubpicture *subpicture,
- short x, short y,
- unsigned short width, unsigned short height,
- unsigned int color)
+Status i915_xvmc_clear_subpict(Display * display, XvMCSubpicture * subpicture,
+ short x, short y,
+ unsigned short width, unsigned short height,
+ unsigned int color)
{
- i915XvMCContext *pI915XvMC;
- i915XvMCSubpicture *pI915Subpicture;
+ i915XvMCContext *pI915XvMC;
+ i915XvMCSubpicture *pI915Subpicture;
- if (!display || !subpicture)
- return BadValue;
+ if (!display || !subpicture)
+ return BadValue;
- if (!(pI915Subpicture = subpicture->privData))
- return XvMCBadSubpicture;
+ if (!(pI915Subpicture = subpicture->privData))
+ return XvMCBadSubpicture;
- if (!(pI915XvMC = pI915Subpicture->privContext))
- return XvMCBadSubpicture;
+ if (!(pI915XvMC = pI915Subpicture->privContext))
+ return XvMCBadSubpicture;
- if ((x < 0) || (x + width) > subpicture->width)
- return BadValue;
+ if ((x < 0) || (x + width) > subpicture->width)
+ return BadValue;
- if ((y < 0) || (y + height) > subpicture->height)
- return BadValue;
+ if ((y < 0) || (y + height) > subpicture->height)
+ return BadValue;
- /* FIXME: clear the area */
+ /* FIXME: clear the area */
- return Success;
+ return Success;
}
-Status i915_xvmc_composite_subpict(Display *display, XvMCSubpicture *subpicture,
- XvImage *image,
- short srcx, short srcy,
- unsigned short width, unsigned short height,
- short dstx, short dsty)
+Status i915_xvmc_composite_subpict(Display * display,
+ XvMCSubpicture * subpicture, XvImage * image,
+ short srcx, short srcy, unsigned short width,
+ unsigned short height, short dstx,
+ short dsty)
{
- i915XvMCContext *pI915XvMC;
- i915XvMCSubpicture *pI915Subpicture;
+ i915XvMCContext *pI915XvMC;
+ i915XvMCSubpicture *pI915Subpicture;
- if (!display || !subpicture)
- return BadValue;
+ if (!display || !subpicture)
+ return BadValue;
- if (!(pI915Subpicture = subpicture->privData))
- return XvMCBadSubpicture;
+ if (!(pI915Subpicture = subpicture->privData))
+ return XvMCBadSubpicture;
- if (!(pI915XvMC = pI915Subpicture->privContext))
- return XvMCBadSubpicture;
+ if (!(pI915XvMC = pI915Subpicture->privContext))
+ return XvMCBadSubpicture;
- if ((srcx < 0) || (srcx + width) > subpicture->width)
- return BadValue;
+ if ((srcx < 0) || (srcx + width) > subpicture->width)
+ return BadValue;
- if ((srcy < 0) || (srcy + height) > subpicture->height)
- return BadValue;
+ if ((srcy < 0) || (srcy + height) > subpicture->height)
+ return BadValue;
- if ((dstx < 0) || (dstx + width) > subpicture->width)
- return BadValue;
+ if ((dstx < 0) || (dstx + width) > subpicture->width)
+ return BadValue;
- if ((dsty < 0) || (dsty + width) > subpicture->height)
- return BadValue;
+ if ((dsty < 0) || (dsty + width) > subpicture->height)
+ return BadValue;
- if (image->id != subpicture->xvimage_id)
- return BadMatch;
+ if (image->id != subpicture->xvimage_id)
+ return BadMatch;
- /* FIXME */
- return Success;
+ /* FIXME */
+ return Success;
}
-
-Status i915_xvmc_destroy_subpict(Display *display, XvMCSubpicture *subpicture)
+Status i915_xvmc_destroy_subpict(Display * display, XvMCSubpicture * subpicture)
{
- i915XvMCSubpicture *pI915Subpicture;
- i915XvMCContext *pI915XvMC;
+ i915XvMCSubpicture *pI915Subpicture;
+ i915XvMCContext *pI915XvMC;
- if (!display || !subpicture)
- return BadValue;
+ if (!display || !subpicture)
+ return BadValue;
- if (!(pI915Subpicture = subpicture->privData))
- return XvMCBadSubpicture;
+ if (!(pI915Subpicture = subpicture->privData))
+ return XvMCBadSubpicture;
- if (!(pI915XvMC = pI915Subpicture->privContext))
- return XvMCBadSubpicture;
+ if (!(pI915XvMC = pI915Subpicture->privContext))
+ return XvMCBadSubpicture;
- if (pI915Subpicture->last_render)
- XvMCSyncSubpicture(display, subpicture);
+ if (pI915Subpicture->last_render)
+ XvMCSyncSubpicture(display, subpicture);
- if (pI915Subpicture->srf.map)
- drmUnmap(pI915Subpicture->srf.map, pI915Subpicture->srf.size);
+ if (pI915Subpicture->srf.map)
+ drmUnmap(pI915Subpicture->srf.map, pI915Subpicture->srf.size);
- PPTHREAD_MUTEX_LOCK();
- XLockDisplay(display);
- _xvmc_destroy_subpicture(display,subpicture);
- XUnlockDisplay(display);
+ PPTHREAD_MUTEX_LOCK();
+ XLockDisplay(display);
+ _xvmc_destroy_subpicture(display, subpicture);
+ XUnlockDisplay(display);
- free(pI915Subpicture);
- subpicture->privData = NULL;
- pI915XvMC->ref--;
- PPTHREAD_MUTEX_UNLOCK();
+ free(pI915Subpicture);
+ subpicture->privData = NULL;
+ pI915XvMC->ref--;
+ PPTHREAD_MUTEX_UNLOCK();
- return Success;
+ return Success;
}
-
-Status i915_xvmc_set_subpict_palette(Display *display,
- XvMCSubpicture *subpicture,
- unsigned char *palette)
+Status i915_xvmc_set_subpict_palette(Display * display,
+ XvMCSubpicture * subpicture,
+ unsigned char *palette)
{
- i915XvMCSubpicture *pI915Subpicture;
- int i, j;
+ i915XvMCSubpicture *pI915Subpicture;
+ int i, j;
- if (!display || !subpicture)
- return BadValue;
+ if (!display || !subpicture)
+ return BadValue;
- if (!(pI915Subpicture = subpicture->privData))
- return XvMCBadSubpicture;
+ if (!(pI915Subpicture = subpicture->privData))
+ return XvMCBadSubpicture;
- j = 0;
- for (i = 0; i < 16; i++) {
- pI915Subpicture->palette[0][i] = palette[j++];
- pI915Subpicture->palette[1][i] = palette[j++];
- pI915Subpicture->palette[2][i] = palette[j++];
- }
+ j = 0;
+ for (i = 0; i < 16; i++) {
+ pI915Subpicture->palette[0][i] = palette[j++];
+ pI915Subpicture->palette[1][i] = palette[j++];
+ pI915Subpicture->palette[2][i] = palette[j++];
+ }
- /* FIXME: Update the subpicture with the new palette */
- return Success;
+ /* FIXME: Update the subpicture with the new palette */
+ return Success;
}
-Status i915_xvmc_blend_subpict(Display *display, XvMCSurface *target_surface,
- XvMCSubpicture *subpicture,
- short subx, short suby,
- unsigned short subw, unsigned short subh,
- short surfx, short surfy,
- unsigned short surfw, unsigned short surfh)
+Status i915_xvmc_blend_subpict(Display * display, XvMCSurface * target_surface,
+ XvMCSubpicture * subpicture,
+ short subx, short suby,
+ unsigned short subw, unsigned short subh,
+ short surfx, short surfy,
+ unsigned short surfw, unsigned short surfh)
{
- i915XvMCSubpicture *pI915Subpicture;
- i915XvMCSurface *privTargetSurface;
+ i915XvMCSubpicture *pI915Subpicture;
+ i915XvMCSurface *privTargetSurface;
- if (!display || !target_surface)
- return BadValue;
+ if (!display || !target_surface)
+ return BadValue;
- if (!(privTargetSurface = target_surface->privData))
- return XvMCBadSurface;
+ if (!(privTargetSurface = target_surface->privData))
+ return XvMCBadSurface;
- if (subpicture) {
- if (!(pI915Subpicture = subpicture->privData))
- return XvMCBadSubpicture;
+ if (subpicture) {
+ if (!(pI915Subpicture = subpicture->privData))
+ return XvMCBadSubpicture;
- if ((FOURCC_AI44 != subpicture->xvimage_id) &&
- (FOURCC_IA44 != subpicture->xvimage_id))
- return XvMCBadSubpicture;
+ if ((FOURCC_AI44 != subpicture->xvimage_id) &&
+ (FOURCC_IA44 != subpicture->xvimage_id))
+ return XvMCBadSubpicture;
- privTargetSurface->privSubPic = pI915Subpicture;
- } else {
- privTargetSurface->privSubPic = NULL;
- }
+ privTargetSurface->privSubPic = pI915Subpicture;
+ } else {
+ privTargetSurface->privSubPic = NULL;
+ }
- return Success;
+ return Success;
}
-Status i915_xvmc_blend_subpict2(Display *display,
- XvMCSurface *source_surface,
- XvMCSurface *target_surface,
- XvMCSubpicture *subpicture,
- short subx, short suby,
- unsigned short subw, unsigned short subh,
- short surfx, short surfy,
- unsigned short surfw, unsigned short surfh)
+Status i915_xvmc_blend_subpict2(Display * display,
+ XvMCSurface * source_surface,
+ XvMCSurface * target_surface,
+ XvMCSubpicture * subpicture,
+ short subx, short suby,
+ unsigned short subw, unsigned short subh,
+ short surfx, short surfy,
+ unsigned short surfw, unsigned short surfh)
{
- i915XvMCContext *pI915XvMC;
- i915XvMCSubpicture *pI915Subpicture;
- i915XvMCSurface *privSourceSurface;
- i915XvMCSurface *privTargetSurface;
+ i915XvMCContext *pI915XvMC;
+ i915XvMCSubpicture *pI915Subpicture;
+ i915XvMCSurface *privSourceSurface;
+ i915XvMCSurface *privTargetSurface;
- if (!display || !source_surface || !target_surface)
- return BadValue;
+ if (!display || !source_surface || !target_surface)
+ return BadValue;
- if (!(privSourceSurface = source_surface->privData))
- return XvMCBadSurface;
+ if (!(privSourceSurface = source_surface->privData))
+ return XvMCBadSurface;
- if (!(privTargetSurface = target_surface->privData))
- return XvMCBadSurface;
+ if (!(privTargetSurface = target_surface->privData))
+ return XvMCBadSurface;
- if (!(pI915XvMC = privTargetSurface->privContext))
- return XvMCBadSurface;
+ if (!(pI915XvMC = privTargetSurface->privContext))
+ return XvMCBadSurface;
- if (((surfx + surfw) > privTargetSurface->width) ||
- ((surfy + surfh) > privTargetSurface->height))
- return BadValue;
+ if (((surfx + surfw) > privTargetSurface->width) ||
+ ((surfy + surfh) > privTargetSurface->height))
+ return BadValue;
- if ((privSourceSurface->width != privTargetSurface->width) ||
- (privTargetSurface->height != privTargetSurface->height))
- return BadValue;
+ if ((privSourceSurface->width != privTargetSurface->width) ||
+ (privTargetSurface->height != privTargetSurface->height))
+ return BadValue;
- if (XvMCSyncSurface(display, source_surface))
- return BadValue;
+ if (XvMCSyncSurface(display, source_surface))
+ return BadValue;
- /* FIXME: update Target Surface */
+ /* FIXME: update Target Surface */
- if (subpicture) {
- if (((subx + subw) > subpicture->width) ||
- ((suby + subh) > subpicture->height))
- return BadValue;
+ if (subpicture) {
+ if (((subx + subw) > subpicture->width) ||
+ ((suby + subh) > subpicture->height))
+ return BadValue;
- if (!(pI915Subpicture = subpicture->privData))
- return XvMCBadSubpicture;
+ if (!(pI915Subpicture = subpicture->privData))
+ return XvMCBadSubpicture;
- if ((FOURCC_AI44 != subpicture->xvimage_id) &&
- (FOURCC_IA44 != subpicture->xvimage_id))
- return XvMCBadSubpicture;
+ if ((FOURCC_AI44 != subpicture->xvimage_id) &&
+ (FOURCC_IA44 != subpicture->xvimage_id))
+ return XvMCBadSubpicture;
- privTargetSurface->privSubPic = pI915Subpicture;
- } else {
- privTargetSurface->privSubPic = NULL;
- }
+ privTargetSurface->privSubPic = pI915Subpicture;
+ } else {
+ privTargetSurface->privSubPic = NULL;
+ }
- return Success;
+ return Success;
}
-Status i915_xvmc_sync_subpict(Display *display, XvMCSubpicture *subpicture)
+Status i915_xvmc_sync_subpict(Display * display, XvMCSubpicture * subpicture)
{
- Status ret;
- int stat = 0;
+ Status ret;
+ int stat = 0;
- if (!display || !subpicture)
- return BadValue;
+ if (!display || !subpicture)
+ return BadValue;
- do {
- ret = XvMCGetSubpictureStatus(display, subpicture, &stat);
- } while(!ret && (stat & XVMC_RENDERING));
+ do {
+ ret = XvMCGetSubpictureStatus(display, subpicture, &stat);
+ } while (!ret && (stat & XVMC_RENDERING));
- return ret;
+ return ret;
}
-Status i915_xvmc_flush_subpict(Display *display, XvMCSubpicture *subpicture)
+Status i915_xvmc_flush_subpict(Display * display, XvMCSubpicture * subpicture)
{
- i915XvMCSubpicture *pI915Subpicture;
+ i915XvMCSubpicture *pI915Subpicture;
- if (!display || !subpicture)
- return BadValue;
+ if (!display || !subpicture)
+ return BadValue;
- if (!(pI915Subpicture = subpicture->privData))
- return XvMCBadSubpicture;
+ if (!(pI915Subpicture = subpicture->privData))
+ return XvMCBadSubpicture;
- return Success;
+ return Success;
}
-Status i915_xvmc_get_subpict_status(Display *display, XvMCSubpicture *subpicture,
- int *stat)
+Status i915_xvmc_get_subpict_status(Display * display,
+ XvMCSubpicture * subpicture, int *stat)
{
- i915XvMCSubpicture *pI915Subpicture;
- i915XvMCContext *pI915XvMC;
+ i915XvMCSubpicture *pI915Subpicture;
+ i915XvMCContext *pI915XvMC;
+
+ if (!display || !subpicture || stat)
+ return BadValue;
- if (!display || !subpicture || stat)
- return BadValue;
+ *stat = 0;
- *stat = 0;
+ if (!(pI915Subpicture = subpicture->privData))
+ return XvMCBadSubpicture;
- if (!(pI915Subpicture = subpicture->privData))
- return XvMCBadSubpicture;
+ if (!(pI915XvMC = pI915Subpicture->privContext))
+ return XvMCBadSubpicture;
- if (!(pI915XvMC = pI915Subpicture->privContext))
- return XvMCBadSubpicture;
+ PPTHREAD_MUTEX_LOCK();
- PPTHREAD_MUTEX_LOCK();
-
- PPTHREAD_MUTEX_UNLOCK();
- return Success;
+ PPTHREAD_MUTEX_UNLOCK();
+ return Success;
}
#endif
struct _intel_xvmc_driver i915_xvmc_mc_driver = {
- .type = XVMC_I915_MPEG2_MC,
- .num_ctx = 0,
- .ctx_list = NULL,
- .create_context = i915_xvmc_mc_create_context,
- .destroy_context = i915_xvmc_mc_destroy_context,
- .create_surface = i915_xvmc_mc_create_surface,
- .destroy_surface = i915_xvmc_mc_destroy_surface,
- .render_surface = i915_xvmc_mc_render_surface,
- .put_surface = i915_xvmc_mc_put_surface,
- .get_surface_status = i915_xvmc_mc_get_surface_status,
+ .type = XVMC_I915_MPEG2_MC,
+ .num_ctx = 0,
+ .ctx_list = NULL,
+ .create_context = i915_xvmc_mc_create_context,
+ .destroy_context = i915_xvmc_mc_destroy_context,
+ .create_surface = i915_xvmc_mc_create_surface,
+ .destroy_surface = i915_xvmc_mc_destroy_surface,
+ .render_surface = i915_xvmc_mc_render_surface,
+ .put_surface = i915_xvmc_mc_put_surface,
+ .get_surface_status = i915_xvmc_mc_get_surface_status,
};
diff --git a/src/xvmc/i915_xvmc.h b/src/xvmc/i915_xvmc.h
index de9eb787..f0e8d3e4 100644
--- a/src/xvmc/i915_xvmc.h
+++ b/src/xvmc/i915_xvmc.h
@@ -49,29 +49,29 @@
* pointer in the XvMCContext structure.
*/
typedef struct _i915XvMCContext {
- unsigned int ctxno;
- unsigned int last_flip;
- unsigned int dual_prime; /* Flag to identify when dual prime is in use. */
- unsigned int yStride;
- unsigned int uvStride;
- unsigned short ref;
- unsigned int depth;
- XvPortID port; /* Xv Port ID when displaying */
- int haveXv; /* Have I initialized the Xv
- * connection for this surface? */
- XvImage *xvImage; /* Fake Xv Image used for command
- * buffer transport to the X server */
- GC gc; /* X GC needed for displaying */
- Drawable draw; /* Drawable to undisplay from */
- void *drawHash;
- int deviceID;
+ unsigned int ctxno;
+ unsigned int last_flip;
+ unsigned int dual_prime; /* Flag to identify when dual prime is in use. */
+ unsigned int yStride;
+ unsigned int uvStride;
+ unsigned short ref;
+ unsigned int depth;
+ XvPortID port; /* Xv Port ID when displaying */
+ int haveXv; /* Have I initialized the Xv
+ * connection for this surface? */
+ XvImage *xvImage; /* Fake Xv Image used for command
+ * buffer transport to the X server */
+ GC gc; /* X GC needed for displaying */
+ Drawable draw; /* Drawable to undisplay from */
+ void *drawHash;
+ int deviceID;
- intel_xvmc_drm_map_t sis;
- intel_xvmc_drm_map_t msb;
- intel_xvmc_drm_map_t ssb;
- intel_xvmc_drm_map_t psp;
- intel_xvmc_drm_map_t psc;
- intel_xvmc_drm_map_t corrdata;
+ intel_xvmc_drm_map_t sis;
+ intel_xvmc_drm_map_t msb;
+ intel_xvmc_drm_map_t ssb;
+ intel_xvmc_drm_map_t psp;
+ intel_xvmc_drm_map_t psc;
+ intel_xvmc_drm_map_t corrdata;
} i915XvMCContext;
/*
@@ -81,13 +81,13 @@ typedef struct _i915XvMCContext {
* structure.
*/
typedef struct _i915XvMCSubpicture {
- unsigned int srfNo;
- unsigned int last_render;
- unsigned int last_flip;
- unsigned int pitch;
- unsigned char palette[3][16];
- intel_xvmc_drm_map_t srf;
- i915XvMCContext *privContext;
+ unsigned int srfNo;
+ unsigned int last_render;
+ unsigned int last_flip;
+ unsigned int pitch;
+ unsigned char palette[3][16];
+ intel_xvmc_drm_map_t srf;
+ i915XvMCContext *privContext;
} i915XvMCSubpicture;
/* Number of YUV buffers per surface */
@@ -99,17 +99,17 @@ typedef struct _i915XvMCSubpicture {
* structure.
*/
typedef struct _i915XvMCSurface {
- unsigned int srfNo; /* XvMC private surface numbers */
- unsigned int last_render;
- unsigned int last_flip;
- unsigned int yStride; /* Stride of YUV420 Y component. */
- unsigned int uvStride;
- unsigned int width; /* Dimensions */
- unsigned int height;
- intel_xvmc_drm_map_t srf;
- i915XvMCContext *privContext;
- i915XvMCSubpicture *privSubPic; /* Subpicture to be blended when
- * displaying. NULL if none. */
+ unsigned int srfNo; /* XvMC private surface numbers */
+ unsigned int last_render;
+ unsigned int last_flip;
+ unsigned int yStride; /* Stride of YUV420 Y component. */
+ unsigned int uvStride;
+ unsigned int width; /* Dimensions */
+ unsigned int height;
+ intel_xvmc_drm_map_t srf;
+ i915XvMCContext *privContext;
+ i915XvMCSubpicture *privSubPic; /* Subpicture to be blended when
+ * displaying. NULL if none. */
} i915XvMCSurface;
#endif /* _I915XVMC_H */
diff --git a/src/xvmc/i965_xvmc.c b/src/xvmc/i965_xvmc.c
index 316b7a2b..ff67995f 100644
--- a/src/xvmc/i965_xvmc.c
+++ b/src/xvmc/i965_xvmc.c
@@ -31,98 +31,133 @@
#include "intel_batchbuffer.h"
#include "i965_hwmc.h"
#define BATCH_STRUCT(x) intelBatchbufferData(&x, sizeof(x), 0)
-#define URB_SIZE 256 /* XXX */
+#define URB_SIZE 256 /* XXX */
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
enum interface {
- INTRA_INTERFACE = 0, /* non field intra */
- NULL_INTERFACE, /* fill with white, do nothing, for debug */
- FORWARD_INTERFACE, /* non field forward predict */
- BACKWARD_INTERFACE, /* non field backward predict */
- F_B_INTERFACE, /* non field forward and backward predict */
- FIELD_FORWARD_INTERFACE, /* field forward predict */
- FIELD_BACKWARD_INTERFACE, /* field backward predict */
- FIELD_F_B_INTERFACE, /* field forward and backward predict */
- DUAL_PRIME_INTERFACE
+ INTRA_INTERFACE = 0, /* non field intra */
+ NULL_INTERFACE, /* fill with white, do nothing, for debug */
+ FORWARD_INTERFACE, /* non field forward predict */
+ BACKWARD_INTERFACE, /* non field backward predict */
+ F_B_INTERFACE, /* non field forward and backward predict */
+ FIELD_FORWARD_INTERFACE, /* field forward predict */
+ FIELD_BACKWARD_INTERFACE, /* field backward predict */
+ FIELD_F_B_INTERFACE, /* field forward and backward predict */
+ DUAL_PRIME_INTERFACE
};
static const uint32_t ipicture_kernel_static[][4] = {
- #include "shader/mc/ipicture.g4b"
+#include "shader/mc/ipicture.g4b"
};
+
static const uint32_t null_kernel_static[][4] = {
- #include "shader/mc/null.g4b"
+#include "shader/mc/null.g4b"
};
+
static const uint32_t frame_forward_kernel_static[][4] = {
- #include "shader/mc/frame_forward.g4b"
+#include "shader/mc/frame_forward.g4b"
};
+
static const uint32_t frame_backward_kernel_static[][4] = {
- #include "shader/mc/frame_backward.g4b"
+#include "shader/mc/frame_backward.g4b"
};
+
static const uint32_t frame_f_b_kernel_static[][4] = {
- #include "shader/mc/frame_f_b.g4b"
-};
+#include "shader/mc/frame_f_b.g4b"
+};
+
static const uint32_t field_forward_kernel_static[][4] = {
- #include "shader/mc/field_forward.g4b"
+#include "shader/mc/field_forward.g4b"
};
+
static const uint32_t field_backward_kernel_static[][4] = {
- #include "shader/mc/field_backward.g4b"
+#include "shader/mc/field_backward.g4b"
};
+
static const uint32_t field_f_b_kernel_static[][4] = {
- #include "shader/mc/field_f_b.g4b"
-};
-static const uint32_t dual_prime_kernel_static[][4]= {
- #include "shader/mc/dual_prime.g4b"
-};
+#include "shader/mc/field_f_b.g4b"
+};
+
+static const uint32_t dual_prime_kernel_static[][4] = {
+#include "shader/mc/dual_prime.g4b"
+};
+
static const uint32_t frame_forward_igd_kernel_static[][4] = {
- #include "shader/mc/frame_forward_igd.g4b"
+#include "shader/mc/frame_forward_igd.g4b"
};
+
static const uint32_t frame_backward_igd_kernel_static[][4] = {
- #include "shader/mc/frame_backward_igd.g4b"
+#include "shader/mc/frame_backward_igd.g4b"
};
+
static const uint32_t frame_f_b_igd_kernel_static[][4] = {
- #include "shader/mc/frame_f_b_igd.g4b"
-};
+#include "shader/mc/frame_f_b_igd.g4b"
+};
+
static const uint32_t field_forward_igd_kernel_static[][4] = {
- #include "shader/mc/field_forward_igd.g4b"
+#include "shader/mc/field_forward_igd.g4b"
};
+
static const uint32_t field_backward_igd_kernel_static[][4] = {
- #include "shader/mc/field_backward_igd.g4b"
+#include "shader/mc/field_backward_igd.g4b"
};
+
static const uint32_t field_f_b_igd_kernel_static[][4] = {
- #include "shader/mc/field_f_b_igd.g4b"
-};
-static const uint32_t dual_prime_igd_kernel_static[][4]= {
- #include "shader/mc/dual_prime_igd.g4b"
-};
-
-struct kernel_struct{
- const uint32_t (*bin)[4];
+#include "shader/mc/field_f_b_igd.g4b"
+};
+
+static const uint32_t dual_prime_igd_kernel_static[][4] = {
+#include "shader/mc/dual_prime_igd.g4b"
+};
+
+struct kernel_struct {
+ const uint32_t(*bin)[4];
uint32_t size;
};
struct kernel_struct kernels_igd[] = {
- {ipicture_kernel_static, sizeof(ipicture_kernel_static)},
- {null_kernel_static, sizeof(null_kernel_static)},
- {frame_forward_igd_kernel_static, sizeof(frame_forward_igd_kernel_static)},
- {frame_backward_igd_kernel_static, sizeof(frame_backward_igd_kernel_static)},
- {frame_f_b_igd_kernel_static, sizeof(frame_f_b_igd_kernel_static)},
- {field_forward_igd_kernel_static, sizeof(field_forward_igd_kernel_static)},
- {field_backward_igd_kernel_static, sizeof(field_backward_igd_kernel_static)},
- {field_f_b_igd_kernel_static, sizeof(field_f_b_igd_kernel_static)},
- {dual_prime_igd_kernel_static, sizeof(dual_prime_igd_kernel_static)}
+ {ipicture_kernel_static, sizeof(ipicture_kernel_static)}
+ ,
+ {null_kernel_static, sizeof(null_kernel_static)}
+ ,
+ {frame_forward_igd_kernel_static,
+ sizeof(frame_forward_igd_kernel_static)}
+ ,
+ {frame_backward_igd_kernel_static,
+ sizeof(frame_backward_igd_kernel_static)}
+ ,
+ {frame_f_b_igd_kernel_static, sizeof(frame_f_b_igd_kernel_static)}
+ ,
+ {field_forward_igd_kernel_static,
+ sizeof(field_forward_igd_kernel_static)}
+ ,
+ {field_backward_igd_kernel_static,
+ sizeof(field_backward_igd_kernel_static)}
+ ,
+ {field_f_b_igd_kernel_static, sizeof(field_f_b_igd_kernel_static)}
+ ,
+ {dual_prime_igd_kernel_static, sizeof(dual_prime_igd_kernel_static)}
};
struct kernel_struct kernels_965[] = {
- {ipicture_kernel_static, sizeof(ipicture_kernel_static)},
- {null_kernel_static, sizeof(null_kernel_static)},
- {frame_forward_kernel_static, sizeof(frame_forward_kernel_static)},
- {frame_backward_kernel_static, sizeof(frame_backward_kernel_static)},
- {frame_f_b_kernel_static, sizeof(frame_f_b_kernel_static)},
- {field_forward_kernel_static, sizeof(field_forward_kernel_static)},
- {field_backward_kernel_static, sizeof(field_backward_kernel_static)},
- {field_f_b_kernel_static, sizeof(field_f_b_kernel_static)},
- {dual_prime_kernel_static, sizeof(dual_prime_kernel_static)}
+ {ipicture_kernel_static, sizeof(ipicture_kernel_static)}
+ ,
+ {null_kernel_static, sizeof(null_kernel_static)}
+ ,
+ {frame_forward_kernel_static, sizeof(frame_forward_kernel_static)}
+ ,
+ {frame_backward_kernel_static, sizeof(frame_backward_kernel_static)}
+ ,
+ {frame_f_b_kernel_static, sizeof(frame_f_b_kernel_static)}
+ ,
+ {field_forward_kernel_static, sizeof(field_forward_kernel_static)}
+ ,
+ {field_backward_kernel_static, sizeof(field_backward_kernel_static)}
+ ,
+ {field_f_b_kernel_static, sizeof(field_f_b_kernel_static)}
+ ,
+ {dual_prime_kernel_static, sizeof(dual_prime_kernel_static)}
};
#define ALIGN(i,m) (((i) + (m) - 1) & ~((m) - 1))
@@ -131,390 +166,411 @@ struct kernel_struct kernels_965[] = {
#define DESCRIPTOR_NUM 12
struct media_kernel_obj {
- dri_bo *bo;
+ dri_bo *bo;
};
struct interface_descriptor_obj {
- dri_bo *bo;
- struct media_kernel_obj kernels[DESCRIPTOR_NUM];
+ dri_bo *bo;
+ struct media_kernel_obj kernels[DESCRIPTOR_NUM];
};
struct vfe_state_obj {
- dri_bo *bo;
- struct interface_descriptor_obj interface;
+ dri_bo *bo;
+ struct interface_descriptor_obj interface;
};
struct surface_obj {
- dri_bo *bo;
+ dri_bo *bo;
};
struct surface_state_obj {
- struct surface_obj surface;
- dri_bo *bo;
+ struct surface_obj surface;
+ dri_bo *bo;
};
struct binding_table_obj {
- dri_bo *bo;
- struct surface_state_obj surface_states[MAX_SURFACE_NUM];
+ dri_bo *bo;
+ struct surface_state_obj surface_states[MAX_SURFACE_NUM];
};
struct indirect_data_obj {
- dri_bo *bo;
+ dri_bo *bo;
};
struct media_state {
- unsigned int is_g4x:1;
- unsigned int is_965_q:1;
+ unsigned int is_g4x:1;
+ unsigned int is_965_q:1;
- struct vfe_state_obj vfe_state;
- struct binding_table_obj binding_table;
- struct indirect_data_obj indirect_data;
+ struct vfe_state_obj vfe_state;
+ struct binding_table_obj binding_table;
+ struct indirect_data_obj indirect_data;
};
struct media_state media_state;
static int free_object(struct media_state *s)
{
- int i;
+ int i;
#define FREE_ONE_BO(bo) drm_intel_bo_unreference(bo)
- FREE_ONE_BO(s->vfe_state.bo);
- FREE_ONE_BO(s->vfe_state.interface.bo);
- for (i = 0; i < DESCRIPTOR_NUM; i++)
- FREE_ONE_BO(s->vfe_state.interface.kernels[i].bo);
- FREE_ONE_BO(s->binding_table.bo);
- for (i = 0; i < MAX_SURFACE_NUM; i++)
- FREE_ONE_BO(s->binding_table.surface_states[i].bo);
- FREE_ONE_BO(s->indirect_data.bo);
+ FREE_ONE_BO(s->vfe_state.bo);
+ FREE_ONE_BO(s->vfe_state.interface.bo);
+ for (i = 0; i < DESCRIPTOR_NUM; i++)
+ FREE_ONE_BO(s->vfe_state.interface.kernels[i].bo);
+ FREE_ONE_BO(s->binding_table.bo);
+ for (i = 0; i < MAX_SURFACE_NUM; i++)
+ FREE_ONE_BO(s->binding_table.surface_states[i].bo);
+ FREE_ONE_BO(s->indirect_data.bo);
}
static int alloc_object(struct media_state *s)
{
- int i;
-
- for (i = 0; i < MAX_SURFACE_NUM; i++) {
- s->binding_table.surface_states[i].bo =
- drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface_state",
- sizeof(struct brw_surface_state), 0x1000);
- if (!s->binding_table.surface_states[i].bo)
- goto out;
- }
- return 0;
+ int i;
+
+ for (i = 0; i < MAX_SURFACE_NUM; i++) {
+ s->binding_table.surface_states[i].bo =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface_state",
+ sizeof(struct brw_surface_state),
+ 0x1000);
+ if (!s->binding_table.surface_states[i].bo)
+ goto out;
+ }
+ return 0;
out:
- free_object(s);
- return BadAlloc;
+ free_object(s);
+ return BadAlloc;
}
-
-static Status destroy_context(Display *display, XvMCContext *context)
+static Status destroy_context(Display * display, XvMCContext * context)
{
- struct i965_xvmc_context *private_context;
- private_context = context->privData;
+ struct i965_xvmc_context *private_context;
+ private_context = context->privData;
- free_object(&media_state);
- Xfree(private_context);
- return Success;
+ free_object(&media_state);
+ Xfree(private_context);
+ return Success;
}
#define STRIDE(w) (w)
#define SIZE_YUV420(w, h) (h * (STRIDE(w) + STRIDE(w >> 1)))
-static Status create_surface(Display *display,
- XvMCContext *context, XvMCSurface *surface, int priv_count,
- CARD32 *priv_data)
+static Status create_surface(Display * display,
+ XvMCContext * context, XvMCSurface * surface,
+ int priv_count, CARD32 * priv_data)
{
- struct i965_xvmc_surface *priv_surface =
- (struct i965_xvmc_surface *)priv_data;
- size_t size = SIZE_YUV420(priv_surface->w, priv_surface->h);
- surface->privData = priv_data;
- priv_surface->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface",
- size, 0x1000);
- return Success;
+ struct i965_xvmc_surface *priv_surface =
+ (struct i965_xvmc_surface *)priv_data;
+ size_t size = SIZE_YUV420(priv_surface->w, priv_surface->h);
+ surface->privData = priv_data;
+ priv_surface->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface",
+ size, 0x1000);
+ return Success;
}
-static Status destroy_surface(Display *display, XvMCSurface *surface)
+static Status destroy_surface(Display * display, XvMCSurface * surface)
{
- struct i965_xvmc_surface *priv_surface =
- surface->privData;
- XSync(display, False);
+ struct i965_xvmc_surface *priv_surface = surface->privData;
+ XSync(display, False);
- drm_intel_bo_unreference(priv_surface->bo);
- return Success;
+ drm_intel_bo_unreference(priv_surface->bo);
+ return Success;
}
static void flush()
{
- struct brw_mi_flush flush;
- memset(&flush, 0, sizeof(flush));
- flush.opcode = CMD_MI_FLUSH;
- flush.flags = (1<<1);
- BATCH_STRUCT(flush);
+ struct brw_mi_flush flush;
+ memset(&flush, 0, sizeof(flush));
+ flush.opcode = CMD_MI_FLUSH;
+ flush.flags = (1 << 1);
+ BATCH_STRUCT(flush);
}
static void clear_sf_state()
{
- struct brw_sf_unit_state sf;
- memset(&sf, 0, sizeof(sf));
- /* TODO */
+ struct brw_sf_unit_state sf;
+ memset(&sf, 0, sizeof(sf));
+ /* TODO */
}
-
/* urb fence must be aligned to cacheline */
static void align_urb_fence()
{
- BATCH_LOCALS;
- int i, offset_to_next_cacheline;
- unsigned long batch_offset;
- BEGIN_BATCH(3);
- batch_offset = (void *)batch_ptr - xvmc_driver->alloc.ptr;
- offset_to_next_cacheline = ALIGN(batch_offset, 64) - batch_offset;
- if (offset_to_next_cacheline <= 12 && offset_to_next_cacheline != 0) {
- for (i = 0; i < offset_to_next_cacheline/4; i++)
- OUT_BATCH(0);
- ADVANCE_BATCH();
- }
+ BATCH_LOCALS;
+ int i, offset_to_next_cacheline;
+ unsigned long batch_offset;
+ BEGIN_BATCH(3);
+ batch_offset = (void *)batch_ptr - xvmc_driver->alloc.ptr;
+ offset_to_next_cacheline = ALIGN(batch_offset, 64) - batch_offset;
+ if (offset_to_next_cacheline <= 12 && offset_to_next_cacheline != 0) {
+ for (i = 0; i < offset_to_next_cacheline / 4; i++)
+ OUT_BATCH(0);
+ ADVANCE_BATCH();
+ }
}
/* setup urb layout for media */
static void urb_layout()
{
- BATCH_LOCALS;
- align_urb_fence();
- BEGIN_BATCH(3);
- OUT_BATCH(BRW_URB_FENCE |
- UF0_VFE_REALLOC |
- UF0_CS_REALLOC |
- UF0_SF_REALLOC |
- UF0_CLIP_REALLOC |
- UF0_GS_REALLOC |
- UF0_VS_REALLOC |
- 1);
- OUT_BATCH((0 << UF1_CLIP_FENCE_SHIFT) |
- (0 << UF1_GS_FENCE_SHIFT) |
- (0 << UF1_VS_FENCE_SHIFT));
-
- OUT_BATCH(((URB_SIZE)<< UF2_VFE_FENCE_SHIFT) | /* VFE_SIZE */
- ((URB_SIZE)<< UF2_CS_FENCE_SHIFT)); /* CS_SIZE is 0 */
- ADVANCE_BATCH();
+ BATCH_LOCALS;
+ align_urb_fence();
+ BEGIN_BATCH(3);
+ OUT_BATCH(BRW_URB_FENCE |
+ UF0_VFE_REALLOC |
+ UF0_CS_REALLOC |
+ UF0_SF_REALLOC |
+ UF0_CLIP_REALLOC | UF0_GS_REALLOC | UF0_VS_REALLOC | 1);
+ OUT_BATCH((0 << UF1_CLIP_FENCE_SHIFT) |
+ (0 << UF1_GS_FENCE_SHIFT) | (0 << UF1_VS_FENCE_SHIFT));
+
+ OUT_BATCH(((URB_SIZE) << UF2_VFE_FENCE_SHIFT) | /* VFE_SIZE */
+ ((URB_SIZE) << UF2_CS_FENCE_SHIFT)); /* CS_SIZE is 0 */
+ ADVANCE_BATCH();
}
static void media_state_pointers(struct media_state *media_state)
{
- BATCH_LOCALS;
- BEGIN_BATCH(3);
- OUT_BATCH(BRW_MEDIA_STATE_POINTERS|1);
- OUT_BATCH(0);
- OUT_RELOC(media_state->vfe_state.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
- ADVANCE_BATCH();
+ BATCH_LOCALS;
+ BEGIN_BATCH(3);
+ OUT_BATCH(BRW_MEDIA_STATE_POINTERS | 1);
+ OUT_BATCH(0);
+ OUT_RELOC(media_state->vfe_state.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+ ADVANCE_BATCH();
}
/* setup 2D surface for media_read or media_write
*/
static Status setup_media_surface(struct media_state *media_state,
- int surface_num, dri_bo *bo, unsigned long offset, int w, int h, Bool write)
+ int surface_num, dri_bo * bo,
+ unsigned long offset, int w, int h,
+ Bool write)
{
- struct brw_surface_state s, *ss = &s;
-
- memset(ss, 0, sizeof(struct brw_surface_state));
- ss->ss0.surface_type = BRW_SURFACE_2D;
- ss->ss0.surface_format = BRW_SURFACEFORMAT_R8_SINT;
- ss->ss1.base_addr = offset + bo->offset;
- ss->ss2.width = w - 1;
- ss->ss2.height = h - 1;
- ss->ss3.pitch = w - 1;
-
- if (media_state->binding_table.surface_states[surface_num].bo)
- drm_intel_bo_unreference(media_state->binding_table.surface_states[surface_num].bo);
- media_state->binding_table.surface_states[surface_num].bo =
- drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface_state",
- sizeof(struct brw_surface_state), 0x1000);
- if (!media_state->binding_table.surface_states[surface_num].bo)
- return BadAlloc;
-
- drm_intel_bo_subdata(
- media_state->binding_table.surface_states[surface_num].bo,
- 0, sizeof(*ss), ss);
-
- drm_intel_bo_emit_reloc(media_state->binding_table.surface_states[surface_num].bo,
- offsetof(struct brw_surface_state, ss1),
- bo,
- offset,
- I915_GEM_DOMAIN_RENDER, write?I915_GEM_DOMAIN_RENDER:0);
-
- return Success;
+ struct brw_surface_state s, *ss = &s;
+
+ memset(ss, 0, sizeof(struct brw_surface_state));
+ ss->ss0.surface_type = BRW_SURFACE_2D;
+ ss->ss0.surface_format = BRW_SURFACEFORMAT_R8_SINT;
+ ss->ss1.base_addr = offset + bo->offset;
+ ss->ss2.width = w - 1;
+ ss->ss2.height = h - 1;
+ ss->ss3.pitch = w - 1;
+
+ if (media_state->binding_table.surface_states[surface_num].bo)
+ drm_intel_bo_unreference(media_state->
+ binding_table.surface_states
+ [surface_num].bo);
+ media_state->binding_table.surface_states[surface_num].bo =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface_state",
+ sizeof(struct brw_surface_state), 0x1000);
+ if (!media_state->binding_table.surface_states[surface_num].bo)
+ return BadAlloc;
+
+ drm_intel_bo_subdata(media_state->
+ binding_table.surface_states[surface_num].bo, 0,
+ sizeof(*ss), ss);
+
+ drm_intel_bo_emit_reloc(media_state->
+ binding_table.surface_states[surface_num].bo,
+ offsetof(struct brw_surface_state, ss1), bo,
+ offset, I915_GEM_DOMAIN_RENDER,
+ write ? I915_GEM_DOMAIN_RENDER : 0);
+
+ return Success;
}
-static Status setup_surfaces(struct media_state *media_state,
- dri_bo *dst_bo, dri_bo *past_bo, dri_bo *future_bo,
- int w, int h)
+static Status setup_surfaces(struct media_state *media_state,
+ dri_bo * dst_bo, dri_bo * past_bo,
+ dri_bo * future_bo, int w, int h)
{
- Status ret;
- ret = setup_media_surface(media_state, 0, dst_bo, 0, w, h, TRUE);
- if (ret != Success)
- return ret;
- ret = setup_media_surface(media_state, 1, dst_bo, w*h, w/2, h/2, TRUE);
- if (ret != Success)
- return ret;
- ret = setup_media_surface(media_state, 2, dst_bo, w*h + w*h/4, w/2, h/2, TRUE);
- if (ret != Success)
- return ret;
- if (past_bo) {
- ret = setup_media_surface(media_state, 4, past_bo, 0, w, h, FALSE);
- if (ret != Success)
- return ret;
- ret = setup_media_surface(media_state, 5, past_bo, w*h, w/2, h/2, FALSE);
- if (ret != Success)
- return ret;
- ret = setup_media_surface(media_state, 6, past_bo, w*h + w*h/4, w/2, h/2, FALSE);
- if (ret != Success)
- return ret;
- }
- if (future_bo) {
- ret = setup_media_surface(media_state, 7, future_bo, 0, w, h, FALSE);
- if (ret != Success)
- return ret;
- ret = setup_media_surface(media_state, 8, future_bo, w*h, w/2, h/2, FALSE);
- if (ret != Success)
- return ret;
- ret = setup_media_surface(media_state, 9, future_bo, w*h + w*h/4, w/2, h/2, FALSE);
- if (ret != Success)
- return ret;
- }
- return Success;
+ Status ret;
+ ret = setup_media_surface(media_state, 0, dst_bo, 0, w, h, TRUE);
+ if (ret != Success)
+ return ret;
+ ret =
+ setup_media_surface(media_state, 1, dst_bo, w * h, w / 2, h / 2,
+ TRUE);
+ if (ret != Success)
+ return ret;
+ ret =
+ setup_media_surface(media_state, 2, dst_bo, w * h + w * h / 4,
+ w / 2, h / 2, TRUE);
+ if (ret != Success)
+ return ret;
+ if (past_bo) {
+ ret =
+ setup_media_surface(media_state, 4, past_bo, 0, w, h,
+ FALSE);
+ if (ret != Success)
+ return ret;
+ ret =
+ setup_media_surface(media_state, 5, past_bo, w * h, w / 2,
+ h / 2, FALSE);
+ if (ret != Success)
+ return ret;
+ ret =
+ setup_media_surface(media_state, 6, past_bo,
+ w * h + w * h / 4, w / 2, h / 2, FALSE);
+ if (ret != Success)
+ return ret;
+ }
+ if (future_bo) {
+ ret =
+ setup_media_surface(media_state, 7, future_bo, 0, w, h,
+ FALSE);
+ if (ret != Success)
+ return ret;
+ ret =
+ setup_media_surface(media_state, 8, future_bo, w * h, w / 2,
+ h / 2, FALSE);
+ if (ret != Success)
+ return ret;
+ ret =
+ setup_media_surface(media_state, 9, future_bo,
+ w * h + w * h / 4, w / 2, h / 2, FALSE);
+ if (ret != Success)
+ return ret;
+ }
+ return Success;
}
+
/* BUFFER SURFACE has a strange format
* the size of the surface is in part of w h and d component
*/
-static Status setup_blocks(struct media_state *media_state, unsigned int block_size)
+static Status setup_blocks(struct media_state *media_state,
+ unsigned int block_size)
{
- union element{
+ union element {
struct {
unsigned int w:7;
unsigned int h:13;
unsigned int d:7;
unsigned int pad:7;
- }whd;
- unsigned int size;
- }e;
- struct brw_surface_state ss;
- memset(&ss, 0, sizeof(struct brw_surface_state));
- ss.ss0.surface_type = BRW_SURFACE_BUFFER;
- ss.ss0.surface_format = BRW_SURFACEFORMAT_R8_UINT;
- ss.ss1.base_addr = media_state->indirect_data.bo->offset;
-
- e.size = block_size - 1;
- ss.ss2.width = e.whd.w;
- ss.ss2.height = e.whd.h;
- ss.ss3.depth = e.whd.d;
- ss.ss3.pitch = block_size - 1;
-
- if (media_state->binding_table.surface_states[3].bo)
- drm_intel_bo_unreference(media_state->binding_table.surface_states[3].bo);
-
- media_state->binding_table.surface_states[3].bo =
- drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface_state",
- sizeof(struct brw_surface_state), 0x1000);
- if (!media_state->binding_table.surface_states[3].bo)
- return BadAlloc;
-
- drm_intel_bo_subdata(media_state->binding_table.surface_states[3].bo, 0,
- sizeof(ss), &ss);
-
- drm_intel_bo_emit_reloc(media_state->binding_table.surface_states[3].bo,
- offsetof(struct brw_surface_state, ss1),
- media_state->indirect_data.bo, 0,
- I915_GEM_DOMAIN_SAMPLER, 0);
- return Success;
+ } whd;
+ unsigned int size;
+ } e;
+ struct brw_surface_state ss;
+ memset(&ss, 0, sizeof(struct brw_surface_state));
+ ss.ss0.surface_type = BRW_SURFACE_BUFFER;
+ ss.ss0.surface_format = BRW_SURFACEFORMAT_R8_UINT;
+ ss.ss1.base_addr = media_state->indirect_data.bo->offset;
+
+ e.size = block_size - 1;
+ ss.ss2.width = e.whd.w;
+ ss.ss2.height = e.whd.h;
+ ss.ss3.depth = e.whd.d;
+ ss.ss3.pitch = block_size - 1;
+
+ if (media_state->binding_table.surface_states[3].bo)
+ drm_intel_bo_unreference(media_state->
+ binding_table.surface_states[3].bo);
+
+ media_state->binding_table.surface_states[3].bo =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface_state",
+ sizeof(struct brw_surface_state), 0x1000);
+ if (!media_state->binding_table.surface_states[3].bo)
+ return BadAlloc;
+
+ drm_intel_bo_subdata(media_state->binding_table.surface_states[3].bo, 0,
+ sizeof(ss), &ss);
+
+ drm_intel_bo_emit_reloc(media_state->binding_table.surface_states[3].bo,
+ offsetof(struct brw_surface_state, ss1),
+ media_state->indirect_data.bo, 0,
+ I915_GEM_DOMAIN_SAMPLER, 0);
+ return Success;
}
/* setup state base address */
static void state_base_address()
{
- BATCH_LOCALS;
- BEGIN_BATCH(6);
- OUT_BATCH(BRW_STATE_BASE_ADDRESS | 4);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0xFFFFF000|BASE_ADDRESS_MODIFY);
- ADVANCE_BATCH();
+ BATCH_LOCALS;
+ BEGIN_BATCH(6);
+ OUT_BATCH(BRW_STATE_BASE_ADDRESS | 4);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0xFFFFF000 | BASE_ADDRESS_MODIFY);
+ ADVANCE_BATCH();
}
/* select media pipeline */
static void pipeline_select(struct media_state *media_state)
{
- BATCH_LOCALS;
- BEGIN_BATCH(1);
- if (media_state->is_g4x)
- OUT_BATCH(NEW_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
- else
- OUT_BATCH(BRW_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
- ADVANCE_BATCH();
+ BATCH_LOCALS;
+ BEGIN_BATCH(1);
+ if (media_state->is_g4x)
+ OUT_BATCH(NEW_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
+ else
+ OUT_BATCH(BRW_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
+ ADVANCE_BATCH();
}
/* kick media object to gpu */
-static void send_media_object(XvMCMacroBlock *mb, int offset, enum interface interface)
+static void send_media_object(XvMCMacroBlock * mb, int offset,
+ enum interface interface)
{
- BATCH_LOCALS;
- BEGIN_BATCH(13);
- OUT_BATCH(BRW_MEDIA_OBJECT|11);
- OUT_BATCH(interface);
- if (media_state.is_965_q) {
- OUT_BATCH(0);
- OUT_BATCH(0);
- }else {
- OUT_BATCH(6*128);
- OUT_RELOC(media_state.indirect_data.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, offset);
- }
-
- OUT_BATCH(mb->x<<4); //g1.0
- OUT_BATCH(mb->y<<4);
- OUT_RELOC(media_state.indirect_data.bo, //g1.8
- I915_GEM_DOMAIN_INSTRUCTION, 0, offset);
- OUT_BATCH_SHORT(mb->coded_block_pattern); //g1.12
- OUT_BATCH_SHORT(mb->PMV[0][0][0]); //g1.14
- OUT_BATCH_SHORT(mb->PMV[0][0][1]); //g1.16
- OUT_BATCH_SHORT(mb->PMV[0][1][0]); //g1.18
- OUT_BATCH_SHORT(mb->PMV[0][1][1]); //g1.20
-
- OUT_BATCH_SHORT(mb->PMV[1][0][0]); //g1.22
- OUT_BATCH_SHORT(mb->PMV[1][0][1]); //g1.24
- OUT_BATCH_SHORT(mb->PMV[1][1][0]); //g1.26
- OUT_BATCH_SHORT(mb->PMV[1][1][1]); //g1.28
- OUT_BATCH_CHAR(mb->dct_type); //g1.30
- OUT_BATCH_CHAR(mb->motion_vertical_field_select);//g1.31
-
- if (media_state.is_965_q)
- OUT_BATCH(0x0);
- else
- OUT_BATCH(0xffffffff);
- ADVANCE_BATCH();
+ BATCH_LOCALS;
+ BEGIN_BATCH(13);
+ OUT_BATCH(BRW_MEDIA_OBJECT | 11);
+ OUT_BATCH(interface);
+ if (media_state.is_965_q) {
+ OUT_BATCH(0);
+ OUT_BATCH(0);
+ } else {
+ OUT_BATCH(6 * 128);
+ OUT_RELOC(media_state.indirect_data.bo,
+ I915_GEM_DOMAIN_INSTRUCTION, 0, offset);
+ }
+
+ OUT_BATCH(mb->x << 4); //g1.0
+ OUT_BATCH(mb->y << 4);
+ OUT_RELOC(media_state.indirect_data.bo, //g1.8
+ I915_GEM_DOMAIN_INSTRUCTION, 0, offset);
+ OUT_BATCH_SHORT(mb->coded_block_pattern); //g1.12
+ OUT_BATCH_SHORT(mb->PMV[0][0][0]); //g1.14
+ OUT_BATCH_SHORT(mb->PMV[0][0][1]); //g1.16
+ OUT_BATCH_SHORT(mb->PMV[0][1][0]); //g1.18
+ OUT_BATCH_SHORT(mb->PMV[0][1][1]); //g1.20
+
+ OUT_BATCH_SHORT(mb->PMV[1][0][0]); //g1.22
+ OUT_BATCH_SHORT(mb->PMV[1][0][1]); //g1.24
+ OUT_BATCH_SHORT(mb->PMV[1][1][0]); //g1.26
+ OUT_BATCH_SHORT(mb->PMV[1][1][1]); //g1.28
+ OUT_BATCH_CHAR(mb->dct_type); //g1.30
+ OUT_BATCH_CHAR(mb->motion_vertical_field_select); //g1.31
+
+ if (media_state.is_965_q)
+ OUT_BATCH(0x0);
+ else
+ OUT_BATCH(0xffffffff);
+ ADVANCE_BATCH();
}
static Status binding_tables(struct media_state *media_state)
{
- unsigned int binding_table[MAX_SURFACE_NUM];
- int i;
-
- if (media_state->binding_table.bo)
- drm_intel_bo_unreference(media_state->binding_table.bo);
- media_state->binding_table.bo =
- drm_intel_bo_alloc(xvmc_driver->bufmgr, "binding_table",
- MAX_SURFACE_NUM*4, 0x1000);
- if (!media_state->binding_table.bo)
- return BadAlloc;
-
- for (i = 0; i < MAX_SURFACE_NUM; i++)
- binding_table[i] = media_state->binding_table.surface_states[i].bo->offset;
- drm_intel_bo_subdata(media_state->binding_table.bo, 0, sizeof(binding_table),
- binding_table);
-
- for (i = 0; i < MAX_SURFACE_NUM; i++)
- drm_intel_bo_emit_reloc(media_state->binding_table.bo,
- i * sizeof(unsigned int),
- media_state->binding_table.surface_states[i].bo, 0,
- I915_GEM_DOMAIN_INSTRUCTION, 0);
- return Success;
+ unsigned int binding_table[MAX_SURFACE_NUM];
+ int i;
+
+ if (media_state->binding_table.bo)
+ drm_intel_bo_unreference(media_state->binding_table.bo);
+ media_state->binding_table.bo =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "binding_table",
+ MAX_SURFACE_NUM * 4, 0x1000);
+ if (!media_state->binding_table.bo)
+ return BadAlloc;
+
+ for (i = 0; i < MAX_SURFACE_NUM; i++)
+ binding_table[i] =
+ media_state->binding_table.surface_states[i].bo->offset;
+ drm_intel_bo_subdata(media_state->binding_table.bo, 0,
+ sizeof(binding_table), binding_table);
+
+ for (i = 0; i < MAX_SURFACE_NUM; i++)
+ drm_intel_bo_emit_reloc(media_state->binding_table.bo,
+ i * sizeof(unsigned int),
+ media_state->
+ binding_table.surface_states[i].bo, 0,
+ I915_GEM_DOMAIN_INSTRUCTION, 0);
+ return Success;
}
static int media_kernels(struct media_state *media_state)
@@ -532,8 +588,8 @@ static int media_kernels(struct media_state *media_state)
for (i = 0; i < kernel_array_size; i++) {
media_state->vfe_state.interface.kernels[i].bo =
- drm_intel_bo_alloc(xvmc_driver->bufmgr, "kernel",
- kernels[i].size, 0x1000);
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "kernel",
+ kernels[i].size, 0x1000);
if (!media_state->vfe_state.interface.kernels[i].bo)
goto out;
}
@@ -548,51 +604,51 @@ out:
return BadAlloc;
}
-static void setup_interface(struct media_state *media_state,
- enum interface i)
+static void setup_interface(struct media_state *media_state, enum interface i)
{
- struct brw_interface_descriptor desc;
- memset(&desc, 0, sizeof(desc));
-
- desc.desc0.grf_reg_blocks = 15;
- desc.desc0.kernel_start_pointer =
- media_state->vfe_state.interface.kernels[i].bo->offset >> 6;
-
- desc.desc1.floating_point_mode = BRW_FLOATING_POINT_NON_IEEE_754;
-
- /* use same binding table for all interface
- * may change this if it affect performance
- */
- desc.desc3.binding_table_entry_count = MAX_SURFACE_NUM;
- desc.desc3.binding_table_pointer = media_state->binding_table.bo->offset >> 5;
-
- drm_intel_bo_subdata(media_state->vfe_state.interface.bo, i*sizeof(desc),
- sizeof(desc), &desc);
-
- drm_intel_bo_emit_reloc(
- media_state->vfe_state.interface.bo,
- i * sizeof(desc) +
- offsetof(struct brw_interface_descriptor, desc0),
- media_state->vfe_state.interface.kernels[i].bo,
- desc.desc0.grf_reg_blocks,
- I915_GEM_DOMAIN_INSTRUCTION, 0);
-
- drm_intel_bo_emit_reloc(
- media_state->vfe_state.interface.bo,
- i * sizeof(desc) +
- offsetof(struct brw_interface_descriptor, desc3),
- media_state->binding_table.bo,
- desc.desc3.binding_table_entry_count,
- I915_GEM_DOMAIN_INSTRUCTION, 0);
+ struct brw_interface_descriptor desc;
+ memset(&desc, 0, sizeof(desc));
+
+ desc.desc0.grf_reg_blocks = 15;
+ desc.desc0.kernel_start_pointer =
+ media_state->vfe_state.interface.kernels[i].bo->offset >> 6;
+
+ desc.desc1.floating_point_mode = BRW_FLOATING_POINT_NON_IEEE_754;
+
+ /* use same binding table for all interface
+ * may change this if it affect performance
+ */
+ desc.desc3.binding_table_entry_count = MAX_SURFACE_NUM;
+ desc.desc3.binding_table_pointer =
+ media_state->binding_table.bo->offset >> 5;
+
+ drm_intel_bo_subdata(media_state->vfe_state.interface.bo,
+ i * sizeof(desc), sizeof(desc), &desc);
+
+ drm_intel_bo_emit_reloc(media_state->vfe_state.interface.bo,
+ i * sizeof(desc) +
+ offsetof(struct brw_interface_descriptor,
+ desc0),
+ media_state->vfe_state.interface.kernels[i].bo,
+ desc.desc0.grf_reg_blocks,
+ I915_GEM_DOMAIN_INSTRUCTION, 0);
+
+ drm_intel_bo_emit_reloc(media_state->vfe_state.interface.bo,
+ i * sizeof(desc) +
+ offsetof(struct brw_interface_descriptor,
+ desc3), media_state->binding_table.bo,
+ desc.desc3.binding_table_entry_count,
+ I915_GEM_DOMAIN_INSTRUCTION, 0);
}
static Status interface_descriptor(struct media_state *media_state)
{
if (media_state->vfe_state.interface.bo)
drm_intel_bo_unreference(media_state->vfe_state.interface.bo);
- media_state->vfe_state.interface.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
- "interfaces", DESCRIPTOR_NUM*sizeof(struct brw_interface_descriptor),
- 0x1000);
+ media_state->vfe_state.interface.bo =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "interfaces",
+ DESCRIPTOR_NUM *
+ sizeof(struct brw_interface_descriptor), 0x1000);
if (!media_state->vfe_state.interface.bo)
return BadAlloc;
@@ -620,184 +676,215 @@ static Status vfe_state(struct media_state *media_state)
/* should carefully caculate those values for performance */
state.vfe1.urb_entry_alloc_size = 2;
state.vfe1.max_threads = 31;
- state.vfe2.interface_descriptor_base =
- media_state->vfe_state.interface.bo->offset >> 4;
+ state.vfe2.interface_descriptor_base =
+ media_state->vfe_state.interface.bo->offset >> 4;
if (media_state->vfe_state.bo)
drm_intel_bo_unreference(media_state->vfe_state.bo);
media_state->vfe_state.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
- "vfe state", sizeof(struct brw_vfe_state), 0x1000);
+ "vfe state",
+ sizeof(struct
+ brw_vfe_state),
+ 0x1000);
if (!media_state->vfe_state.bo)
return BadAlloc;
- drm_intel_bo_subdata(media_state->vfe_state.bo, 0, sizeof(state), &state);
+ drm_intel_bo_subdata(media_state->vfe_state.bo, 0, sizeof(state),
+ &state);
drm_intel_bo_emit_reloc(media_state->vfe_state.bo,
- offsetof(struct brw_vfe_state, vfe2),
- media_state->vfe_state.interface.bo, 0,
- I915_GEM_DOMAIN_INSTRUCTION, 0);
+ offsetof(struct brw_vfe_state, vfe2),
+ media_state->vfe_state.interface.bo, 0,
+ I915_GEM_DOMAIN_INSTRUCTION, 0);
return Success;
}
-static Status render_surface(Display *display,
- XvMCContext *context,
- unsigned int picture_structure,
- XvMCSurface *target_surface,
- XvMCSurface *past_surface,
- XvMCSurface *future_surface,
- unsigned int flags,
- unsigned int num_macroblocks,
- unsigned int first_macroblock,
- XvMCMacroBlockArray *macroblock_array,
- XvMCBlockArray *blocks)
+static Status render_surface(Display * display,
+ XvMCContext * context,
+ unsigned int picture_structure,
+ XvMCSurface * target_surface,
+ XvMCSurface * past_surface,
+ XvMCSurface * future_surface,
+ unsigned int flags,
+ unsigned int num_macroblocks,
+ unsigned int first_macroblock,
+ XvMCMacroBlockArray * macroblock_array,
+ XvMCBlockArray * blocks)
{
- intel_xvmc_context_ptr intel_ctx;
- int i, j;
- struct i965_xvmc_context *i965_ctx;
- XvMCMacroBlock *mb;
- struct i965_xvmc_surface *priv_target_surface =
- target_surface->privData;
- struct i965_xvmc_surface *priv_past_surface =
- past_surface?past_surface->privData:0;
- struct i965_xvmc_surface *priv_future_surface =
- future_surface?future_surface->privData:0;
- unsigned short *block_ptr;
- intel_ctx = intel_xvmc_find_context(context->context_id);
- i965_ctx = context->privData;
- if (!intel_ctx) {
- XVMC_ERR("Can't find intel xvmc context\n");
- return BadValue;
- }
-
- if (media_state.indirect_data.bo) {
- if (xvmc_driver->kernel_exec_fencing)
- drm_intel_gem_bo_unmap_gtt(media_state.indirect_data.bo);
- else
- drm_intel_bo_unmap(media_state.indirect_data.bo);
-
- drm_intel_bo_unreference(media_state.indirect_data.bo);
- }
- media_state.indirect_data.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
- "indirect data", 128*6*num_macroblocks, 64);
- if (!media_state.indirect_data.bo)
- return BadAlloc;
- setup_surfaces(&media_state,
- priv_target_surface->bo,
- past_surface? priv_past_surface->bo:NULL,
- future_surface?priv_future_surface->bo:NULL,
- context->width, context->height);
- setup_blocks(&media_state, 128*6*num_macroblocks);
- binding_tables(&media_state);
- interface_descriptor(&media_state);
- vfe_state(&media_state);
-
- if (xvmc_driver->kernel_exec_fencing)
- drm_intel_gem_bo_map_gtt(media_state.indirect_data.bo);
- else
- drm_intel_bo_map(media_state.indirect_data.bo, 1);
-
- block_ptr = media_state.indirect_data.bo->virtual;
- for (i = first_macroblock;
- i < num_macroblocks + first_macroblock; i++) {
- unsigned short *mb_block_ptr;
- mb = &macroblock_array->macro_blocks[i];
- mb_block_ptr = &blocks->blocks[(mb->index<<6)];
- if (mb->coded_block_pattern & 0x20) {
- for (j = 0; j < 8; j++)
- memcpy(block_ptr + 16*j, mb_block_ptr + 8*j, 16);
- mb_block_ptr += 64;
+ intel_xvmc_context_ptr intel_ctx;
+ int i, j;
+ struct i965_xvmc_context *i965_ctx;
+ XvMCMacroBlock *mb;
+ struct i965_xvmc_surface *priv_target_surface =
+ target_surface->privData;
+ struct i965_xvmc_surface *priv_past_surface =
+ past_surface ? past_surface->privData : 0;
+ struct i965_xvmc_surface *priv_future_surface =
+ future_surface ? future_surface->privData : 0;
+ unsigned short *block_ptr;
+ intel_ctx = intel_xvmc_find_context(context->context_id);
+ i965_ctx = context->privData;
+ if (!intel_ctx) {
+ XVMC_ERR("Can't find intel xvmc context\n");
+ return BadValue;
}
- if (mb->coded_block_pattern & 0x10) {
- for (j = 0; j < 8; j++)
- memcpy(block_ptr + 16*j + 8, mb_block_ptr + 8*j, 16);
- mb_block_ptr += 64;
- }
- block_ptr += 2*64;
- if (mb->coded_block_pattern & 0x08) {
- for (j = 0; j < 8; j++)
- memcpy(block_ptr + 16*j, mb_block_ptr + 8*j, 16);
- mb_block_ptr += 64;
- }
+ if (media_state.indirect_data.bo) {
+ if (xvmc_driver->kernel_exec_fencing)
+ drm_intel_gem_bo_unmap_gtt(media_state.
+ indirect_data.bo);
+ else
+ drm_intel_bo_unmap(media_state.indirect_data.bo);
- if (mb->coded_block_pattern & 0x04) {
- for (j = 0; j < 8; j++)
- memcpy(block_ptr + 16*j + 8, mb_block_ptr + 8*j, 16);
- mb_block_ptr += 64;
+ drm_intel_bo_unreference(media_state.indirect_data.bo);
}
+ media_state.indirect_data.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
+ "indirect data",
+ 128 * 6 *
+ num_macroblocks, 64);
+ if (!media_state.indirect_data.bo)
+ return BadAlloc;
+ setup_surfaces(&media_state,
+ priv_target_surface->bo,
+ past_surface ? priv_past_surface->bo : NULL,
+ future_surface ? priv_future_surface->bo : NULL,
+ context->width, context->height);
+ setup_blocks(&media_state, 128 * 6 * num_macroblocks);
+ binding_tables(&media_state);
+ interface_descriptor(&media_state);
+ vfe_state(&media_state);
+
+ if (xvmc_driver->kernel_exec_fencing)
+ drm_intel_gem_bo_map_gtt(media_state.indirect_data.bo);
+ else
+ drm_intel_bo_map(media_state.indirect_data.bo, 1);
+
+ block_ptr = media_state.indirect_data.bo->virtual;
+ for (i = first_macroblock; i < num_macroblocks + first_macroblock; i++) {
+ unsigned short *mb_block_ptr;
+ mb = &macroblock_array->macro_blocks[i];
+ mb_block_ptr = &blocks->blocks[(mb->index << 6)];
+ if (mb->coded_block_pattern & 0x20) {
+ for (j = 0; j < 8; j++)
+ memcpy(block_ptr + 16 * j, mb_block_ptr + 8 * j,
+ 16);
+ mb_block_ptr += 64;
+ }
- block_ptr += 2*64;
- if (mb->coded_block_pattern & 0x2) {
- memcpy(block_ptr, mb_block_ptr, 128);
- mb_block_ptr += 64;
- }
+ if (mb->coded_block_pattern & 0x10) {
+ for (j = 0; j < 8; j++)
+ memcpy(block_ptr + 16 * j + 8,
+ mb_block_ptr + 8 * j, 16);
+ mb_block_ptr += 64;
+ }
+ block_ptr += 2 * 64;
+ if (mb->coded_block_pattern & 0x08) {
+ for (j = 0; j < 8; j++)
+ memcpy(block_ptr + 16 * j, mb_block_ptr + 8 * j,
+ 16);
+ mb_block_ptr += 64;
+ }
+
+ if (mb->coded_block_pattern & 0x04) {
+ for (j = 0; j < 8; j++)
+ memcpy(block_ptr + 16 * j + 8,
+ mb_block_ptr + 8 * j, 16);
+ mb_block_ptr += 64;
+ }
+
+ block_ptr += 2 * 64;
+ if (mb->coded_block_pattern & 0x2) {
+ memcpy(block_ptr, mb_block_ptr, 128);
+ mb_block_ptr += 64;
+ }
- block_ptr += 64;
- if (mb->coded_block_pattern & 0x1)
- memcpy(block_ptr, mb_block_ptr, 128);
- block_ptr += 64;
- }
- {
- int block_offset = 0;
- LOCK_HARDWARE(intel_ctx->hw_context);
- state_base_address();
- flush();
- clear_sf_state();
- pipeline_select(&media_state);
- urb_layout();
- media_state_pointers(&media_state);
- for (i = first_macroblock;
- i < num_macroblocks + first_macroblock;
- i++, block_offset += 128*6) {
- mb = &macroblock_array->macro_blocks[i];
-
- if (mb->macroblock_type & XVMC_MB_TYPE_INTRA) {
- send_media_object(mb, block_offset, INTRA_INTERFACE);
- } else {
- if (((mb->motion_type & 3) == XVMC_PREDICTION_FRAME)) {
- if ((mb->macroblock_type&XVMC_MB_TYPE_MOTION_FORWARD))
- {
- if (((mb->macroblock_type&XVMC_MB_TYPE_MOTION_BACKWARD)))
- send_media_object(mb, block_offset, F_B_INTERFACE);
- else
- send_media_object(mb, block_offset, FORWARD_INTERFACE);
- } else if ((mb->macroblock_type&XVMC_MB_TYPE_MOTION_BACKWARD))
- {
- send_media_object(mb, block_offset, BACKWARD_INTERFACE);
- }
- } else if ((mb->motion_type & 3) == XVMC_PREDICTION_FIELD) {
- if ((mb->macroblock_type&XVMC_MB_TYPE_MOTION_FORWARD))
- {
- if (((mb->macroblock_type&XVMC_MB_TYPE_MOTION_BACKWARD)))
- send_media_object(mb, block_offset, FIELD_F_B_INTERFACE);
- else
-
- send_media_object(mb, block_offset, FIELD_FORWARD_INTERFACE);
- } else if ((mb->macroblock_type&XVMC_MB_TYPE_MOTION_BACKWARD))
- {
- send_media_object(mb, block_offset, FIELD_BACKWARD_INTERFACE);
- }
- }else {
- send_media_object(mb, block_offset, DUAL_PRIME_INTERFACE);
+ block_ptr += 64;
+ if (mb->coded_block_pattern & 0x1)
+ memcpy(block_ptr, mb_block_ptr, 128);
+ block_ptr += 64;
+ }
+ {
+ int block_offset = 0;
+ LOCK_HARDWARE(intel_ctx->hw_context);
+ state_base_address();
+ flush();
+ clear_sf_state();
+ pipeline_select(&media_state);
+ urb_layout();
+ media_state_pointers(&media_state);
+ for (i = first_macroblock;
+ i < num_macroblocks + first_macroblock;
+ i++, block_offset += 128 * 6) {
+ mb = &macroblock_array->macro_blocks[i];
+
+ if (mb->macroblock_type & XVMC_MB_TYPE_INTRA) {
+ send_media_object(mb, block_offset,
+ INTRA_INTERFACE);
+ } else {
+ if (((mb->motion_type & 3) ==
+ XVMC_PREDICTION_FRAME)) {
+ if ((mb->macroblock_type &
+ XVMC_MB_TYPE_MOTION_FORWARD)) {
+ if (((mb->macroblock_type &
+ XVMC_MB_TYPE_MOTION_BACKWARD)))
+ send_media_object(mb,
+ block_offset,
+ F_B_INTERFACE);
+ else
+ send_media_object(mb,
+ block_offset,
+ FORWARD_INTERFACE);
+ } else
+ if ((mb->macroblock_type &
+ XVMC_MB_TYPE_MOTION_BACKWARD))
+ {
+ send_media_object(mb,
+ block_offset,
+ BACKWARD_INTERFACE);
+ }
+ } else if ((mb->motion_type & 3) ==
+ XVMC_PREDICTION_FIELD) {
+ if ((mb->macroblock_type &
+ XVMC_MB_TYPE_MOTION_FORWARD)) {
+ if (((mb->macroblock_type &
+ XVMC_MB_TYPE_MOTION_BACKWARD)))
+ send_media_object(mb,
+ block_offset,
+ FIELD_F_B_INTERFACE);
+ else
+
+ send_media_object(mb,
+ block_offset,
+ FIELD_FORWARD_INTERFACE);
+ } else
+ if ((mb->macroblock_type &
+ XVMC_MB_TYPE_MOTION_BACKWARD))
+ {
+ send_media_object(mb,
+ block_offset,
+ FIELD_BACKWARD_INTERFACE);
+ }
+ } else {
+ send_media_object(mb, block_offset,
+ DUAL_PRIME_INTERFACE);
+ }
+ }
}
- }
+ intelFlushBatch(TRUE);
+ UNLOCK_HARDWARE(intel_ctx->hw_context);
}
- intelFlushBatch(TRUE);
- UNLOCK_HARDWARE(intel_ctx->hw_context);
- }
- return Success;
+ return Success;
}
-static Status put_surface(Display *display,XvMCSurface *surface,
- Drawable draw, short srcx, short srcy,
- unsigned short srcw, unsigned short srch,
- short destx, short desty,
- unsigned short destw, unsigned short desth,
- int flags, struct intel_xvmc_command *data)
+static Status put_surface(Display * display, XvMCSurface * surface,
+ Drawable draw, short srcx, short srcy,
+ unsigned short srcw, unsigned short srch,
+ short destx, short desty,
+ unsigned short destw, unsigned short desth,
+ int flags, struct intel_xvmc_command *data)
{
- struct i965_xvmc_surface *private_surface =
- surface->privData;
+ struct i965_xvmc_surface *private_surface = surface->privData;
uint32_t handle = 0;
drm_intel_bo_flink(private_surface->bo, &handle);
@@ -806,38 +893,37 @@ static Status put_surface(Display *display,XvMCSurface *surface,
return Success;
}
-static Status get_surface_status(Display *display,
- XvMCSurface *surface, int *stats)
+static Status get_surface_status(Display * display,
+ XvMCSurface * surface, int *stats)
{
- *stats = 0;
- return 0;
+ *stats = 0;
+ return 0;
}
-static Status create_context(Display *display, XvMCContext *context,
- int priv_count, CARD32 *priv_data)
+static Status create_context(Display * display, XvMCContext * context,
+ int priv_count, CARD32 * priv_data)
{
- struct i965_xvmc_context *i965_ctx;
- i965_ctx = (struct i965_xvmc_context *)priv_data;
- context->privData = i965_ctx;
-
- media_state.is_g4x = i965_ctx->is_g4x;
- media_state.is_965_q = i965_ctx->is_965_q;
-
- if (alloc_object(&media_state))
- return BadAlloc;
- if (media_kernels(&media_state))
- return BadAlloc;
- return Success;
+ struct i965_xvmc_context *i965_ctx;
+ i965_ctx = (struct i965_xvmc_context *)priv_data;
+ context->privData = i965_ctx;
+
+ media_state.is_g4x = i965_ctx->is_g4x;
+ media_state.is_965_q = i965_ctx->is_965_q;
+
+ if (alloc_object(&media_state))
+ return BadAlloc;
+ if (media_kernels(&media_state))
+ return BadAlloc;
+ return Success;
}
struct _intel_xvmc_driver i965_xvmc_mc_driver = {
- .type = XVMC_I965_MPEG2_MC,
- .create_context = create_context,
- .destroy_context = destroy_context,
- .create_surface = create_surface,
- .destroy_surface = destroy_surface,
- .render_surface = render_surface,
- .put_surface = put_surface,
- .get_surface_status = get_surface_status,
+ .type = XVMC_I965_MPEG2_MC,
+ .create_context = create_context,
+ .destroy_context = destroy_context,
+ .create_surface = create_surface,
+ .destroy_surface = destroy_surface,
+ .render_surface = render_surface,
+ .put_surface = put_surface,
+ .get_surface_status = get_surface_status,
};
-
diff --git a/src/xvmc/i965_xvmc.h b/src/xvmc/i965_xvmc.h
index bbee76c0..ed201c89 100644
--- a/src/xvmc/i965_xvmc.h
+++ b/src/xvmc/i965_xvmc.h
@@ -1,2 +1 @@
#include "intel_xvmc.h"
-
diff --git a/src/xvmc/intel_batchbuffer.c b/src/xvmc/intel_batchbuffer.c
index 8c96d7f1..ebaac7a4 100644
--- a/src/xvmc/intel_batchbuffer.c
+++ b/src/xvmc/intel_batchbuffer.c
@@ -48,142 +48,144 @@
#include "brw_defines.h"
#include "brw_structs.h"
#define MI_BATCH_BUFFER_END (0xA << 23)
-#define BATCH_SIZE 8*1024 /* one bo is allocated each time, so the size can be small */
+#define BATCH_SIZE 8*1024 /* one bo is allocated each time, so the size can be small */
static int intelEmitIrqLocked(void)
{
- drmI830IrqEmit ie;
- int ret, seq;
+ drmI830IrqEmit ie;
+ int ret, seq;
- ie.irq_seq = &seq;
- ret = drmCommandWriteRead(xvmc_driver->fd, DRM_I830_IRQ_EMIT,
- &ie, sizeof(ie));
+ ie.irq_seq = &seq;
+ ret = drmCommandWriteRead(xvmc_driver->fd, DRM_I830_IRQ_EMIT,
+ &ie, sizeof(ie));
- if ( ret ) {
- fprintf(stderr, "%s: drmI830IrqEmit: %d\n", __FUNCTION__, ret);
- exit(1);
- }
+ if (ret) {
+ fprintf(stderr, "%s: drmI830IrqEmit: %d\n", __FUNCTION__, ret);
+ exit(1);
+ }
- return seq;
+ return seq;
}
static void intelWaitIrq(int seq)
{
- int ret;
- drmI830IrqWait iw;
+ int ret;
+ drmI830IrqWait iw;
- iw.irq_seq = seq;
+ iw.irq_seq = seq;
- do {
- ret = drmCommandWrite(xvmc_driver->fd, DRM_I830_IRQ_WAIT, &iw, sizeof(iw) );
- } while (ret == -EAGAIN || ret == -EINTR);
+ do {
+ ret =
+ drmCommandWrite(xvmc_driver->fd, DRM_I830_IRQ_WAIT, &iw,
+ sizeof(iw));
+ } while (ret == -EAGAIN || ret == -EINTR);
- if (ret) {
- fprintf(stderr, "%s: drmI830IrqWait: %d\n", __FUNCTION__, ret);
- exit(1);
- }
+ if (ret) {
+ fprintf(stderr, "%s: drmI830IrqWait: %d\n", __FUNCTION__, ret);
+ exit(1);
+ }
}
static void i965_end_batch(void)
{
- unsigned int size = xvmc_driver->batch.ptr -
- xvmc_driver->batch.init_ptr;
- if ((size & 4) == 0) {
- *(unsigned int*)xvmc_driver->batch.ptr = 0;
+ unsigned int size = xvmc_driver->batch.ptr -
+ xvmc_driver->batch.init_ptr;
+ if ((size & 4) == 0) {
+ *(unsigned int *)xvmc_driver->batch.ptr = 0;
+ xvmc_driver->batch.ptr += 4;
+ }
+ *(unsigned int *)xvmc_driver->batch.ptr = MI_BATCH_BUFFER_END;
xvmc_driver->batch.ptr += 4;
- }
- *(unsigned int*)xvmc_driver->batch.ptr = MI_BATCH_BUFFER_END;
- xvmc_driver->batch.ptr += 4;
}
Bool intelInitBatchBuffer(void)
{
- int i;
-
- if((xvmc_driver->batch.buf =
- drm_intel_bo_alloc(xvmc_driver->bufmgr,
- "batch buffer", BATCH_SIZE, 0x1000)) == NULL) {
- fprintf(stderr, "unable to alloc batch buffer\n");
- return False;
- }
-
- if (xvmc_driver->kernel_exec_fencing)
- drm_intel_gem_bo_map_gtt(xvmc_driver->batch.buf);
- else
- drm_intel_bo_map(xvmc_driver->batch.buf, 1);
-
- xvmc_driver->batch.init_ptr = xvmc_driver->batch.buf->virtual;
- xvmc_driver->batch.size = BATCH_SIZE;
- xvmc_driver->batch.space = BATCH_SIZE;
- xvmc_driver->batch.ptr = xvmc_driver->batch.init_ptr;
- return True;
+ int i;
+
+ if ((xvmc_driver->batch.buf =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr,
+ "batch buffer", BATCH_SIZE, 0x1000)) == NULL) {
+ fprintf(stderr, "unable to alloc batch buffer\n");
+ return False;
+ }
+
+ if (xvmc_driver->kernel_exec_fencing)
+ drm_intel_gem_bo_map_gtt(xvmc_driver->batch.buf);
+ else
+ drm_intel_bo_map(xvmc_driver->batch.buf, 1);
+
+ xvmc_driver->batch.init_ptr = xvmc_driver->batch.buf->virtual;
+ xvmc_driver->batch.size = BATCH_SIZE;
+ xvmc_driver->batch.space = BATCH_SIZE;
+ xvmc_driver->batch.ptr = xvmc_driver->batch.init_ptr;
+ return True;
}
void intelFiniBatchBuffer(void)
{
- if (xvmc_driver->kernel_exec_fencing)
- drm_intel_gem_bo_unmap_gtt(xvmc_driver->batch.buf);
- else
- drm_intel_bo_unmap(xvmc_driver->batch.buf);
+ if (xvmc_driver->kernel_exec_fencing)
+ drm_intel_gem_bo_unmap_gtt(xvmc_driver->batch.buf);
+ else
+ drm_intel_bo_unmap(xvmc_driver->batch.buf);
- drm_intel_bo_unreference(xvmc_driver->batch.buf);
+ drm_intel_bo_unreference(xvmc_driver->batch.buf);
}
-
-void intelFlushBatch(Bool refill )
+void intelFlushBatch(Bool refill)
{
- i965_end_batch();
-
- if (xvmc_driver->kernel_exec_fencing)
- drm_intel_gem_bo_unmap_gtt(xvmc_driver->batch.buf);
- else
- drm_intel_bo_unmap(xvmc_driver->batch.buf);
-
- drm_intel_bo_exec(xvmc_driver->batch.buf,
- xvmc_driver->batch.ptr - xvmc_driver->batch.init_ptr,
- 0, 0, 0);
-
- if (xvmc_driver == &i915_xvmc_mc_driver)
- dri_bo_wait_rendering(xvmc_driver->batch.buf);
-
- drm_intel_bo_unreference(xvmc_driver->batch.buf);
- if((xvmc_driver->batch.buf =
- drm_intel_bo_alloc(xvmc_driver->bufmgr,
- "batch buffer", BATCH_SIZE, 0x1000)) == NULL) {
- fprintf(stderr, "unable to alloc batch buffer\n");
- }
-
- if (xvmc_driver->kernel_exec_fencing)
- drm_intel_gem_bo_map_gtt(xvmc_driver->batch.buf);
- else
- drm_intel_bo_map(xvmc_driver->batch.buf, 1);
-
- xvmc_driver->batch.init_ptr = xvmc_driver->batch.buf->virtual;
- xvmc_driver->batch.size = BATCH_SIZE;
- xvmc_driver->batch.space = BATCH_SIZE;
- xvmc_driver->batch.ptr = xvmc_driver->batch.init_ptr;
+ i965_end_batch();
+
+ if (xvmc_driver->kernel_exec_fencing)
+ drm_intel_gem_bo_unmap_gtt(xvmc_driver->batch.buf);
+ else
+ drm_intel_bo_unmap(xvmc_driver->batch.buf);
+
+ drm_intel_bo_exec(xvmc_driver->batch.buf,
+ xvmc_driver->batch.ptr - xvmc_driver->batch.init_ptr,
+ 0, 0, 0);
+
+ if (xvmc_driver == &i915_xvmc_mc_driver)
+ dri_bo_wait_rendering(xvmc_driver->batch.buf);
+
+ drm_intel_bo_unreference(xvmc_driver->batch.buf);
+ if ((xvmc_driver->batch.buf =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr,
+ "batch buffer", BATCH_SIZE, 0x1000)) == NULL) {
+ fprintf(stderr, "unable to alloc batch buffer\n");
+ }
+
+ if (xvmc_driver->kernel_exec_fencing)
+ drm_intel_gem_bo_map_gtt(xvmc_driver->batch.buf);
+ else
+ drm_intel_bo_map(xvmc_driver->batch.buf, 1);
+
+ xvmc_driver->batch.init_ptr = xvmc_driver->batch.buf->virtual;
+ xvmc_driver->batch.size = BATCH_SIZE;
+ xvmc_driver->batch.space = BATCH_SIZE;
+ xvmc_driver->batch.ptr = xvmc_driver->batch.init_ptr;
}
void intelBatchbufferRequireSpace(int size)
{
- assert(xvmc_driver->batch.ptr - xvmc_driver->batch.init_ptr + size <
- xvmc_driver->batch.size - 8);
- if (xvmc_driver->batch.ptr - xvmc_driver->batch.init_ptr + size
- >= xvmc_driver->batch.size - 8)
- intelFlushBatch(1);
+ assert(xvmc_driver->batch.ptr - xvmc_driver->batch.init_ptr + size <
+ xvmc_driver->batch.size - 8);
+ if (xvmc_driver->batch.ptr - xvmc_driver->batch.init_ptr + size
+ >= xvmc_driver->batch.size - 8)
+ intelFlushBatch(1);
}
void intelBatchbufferData(const void *data, unsigned bytes, unsigned flags)
{
- intelBatchbufferRequireSpace(bytes);
- memcpy(xvmc_driver->batch.ptr, data, bytes);
- xvmc_driver->batch.ptr += bytes;
- xvmc_driver->batch.space -= bytes;
+ intelBatchbufferRequireSpace(bytes);
+ memcpy(xvmc_driver->batch.ptr, data, bytes);
+ xvmc_driver->batch.ptr += bytes;
+ xvmc_driver->batch.space -= bytes;
}
-void intel_batch_emit_reloc(dri_bo *bo, uint32_t read_domain,
- uint32_t write_domain, uint32_t delta, unsigned char *ptr)
+void intel_batch_emit_reloc(dri_bo * bo, uint32_t read_domain,
+ uint32_t write_domain, uint32_t delta,
+ unsigned char *ptr)
{
- drm_intel_bo_emit_reloc(xvmc_driver->batch.buf,
- ptr - xvmc_driver->batch.init_ptr, bo, delta,
- read_domain, write_domain);
+ drm_intel_bo_emit_reloc(xvmc_driver->batch.buf,
+ ptr - xvmc_driver->batch.init_ptr, bo, delta,
+ read_domain, write_domain);
}
diff --git a/src/xvmc/intel_batchbuffer.h b/src/xvmc/intel_batchbuffer.h
index ea9058ce..6fa1c05b 100644
--- a/src/xvmc/intel_batchbuffer.h
+++ b/src/xvmc/intel_batchbuffer.h
@@ -52,6 +52,7 @@ extern void intelBatchbufferData(const void *, unsigned, unsigned);
extern Bool intelInitBatchBuffer(void);
extern void intelFiniBatchBuffer(void);
extern void intelCmdIoctl(char *, unsigned);
-extern void intel_batch_emit_reloc(dri_bo *bo, uint32_t read_domain,
- uint32_t write_domain, uint32_t delta, unsigned char *);
+extern void intel_batch_emit_reloc(dri_bo * bo, uint32_t read_domain,
+ uint32_t write_domain, uint32_t delta,
+ unsigned char *);
#endif /* _INTEL_BATCHBUFFER_H */
diff --git a/src/xvmc/intel_xvmc.c b/src/xvmc/intel_xvmc.c
index 06763aef..947f97d4 100644
--- a/src/xvmc/intel_xvmc.c
+++ b/src/xvmc/intel_xvmc.c
@@ -33,207 +33,208 @@ struct _intel_xvmc_driver *xvmc_driver = NULL;
/* Lookup tables to speed common calculations for coded_block_pattern */
/* each block is ((8*8) * sizeof(short)) */
unsigned int mb_bytes_420[] = {
- 0, /* 0 */
- 128, /* 1 */
- 128, /* 10 */
- 256, /* 11 */
- 128, /* 100 */
- 256, /* 101 */
- 256, /* 110 */
- 384, /* 111 */
- 128, /* 1000 */
- 256, /* 1001 */
- 256, /* 1010 */
- 384, /* 1011 */
- 256, /* 1100 */
- 384, /* 1101 */
- 384, /* 1110 */
- 512, /* 1111 */
- 128, /* 10000 */
- 256, /* 10001 */
- 256, /* 10010 */
- 384, /* 10011 */
- 256, /* 10100 */
- 384, /* 10101 */
- 384, /* 10110 */
- 512, /* 10111 */
- 256, /* 11000 */
- 384, /* 11001 */
- 384, /* 11010 */
- 512, /* 11011 */
- 384, /* 11100 */
- 512, /* 11101 */
- 512, /* 11110 */
- 640, /* 11111 */
- 128, /* 100000 */
- 256, /* 100001 */
- 256, /* 100010 */
- 384, /* 100011 */
- 256, /* 100100 */
- 384, /* 100101 */
- 384, /* 100110 */
- 512, /* 100111 */
- 256, /* 101000 */
- 384, /* 101001 */
- 384, /* 101010 */
- 512, /* 101011 */
- 384, /* 101100 */
- 512, /* 101101 */
- 512, /* 101110 */
- 640, /* 101111 */
- 256, /* 110000 */
- 384, /* 110001 */
- 384, /* 110010 */
- 512, /* 110011 */
- 384, /* 110100 */
- 512, /* 110101 */
- 512, /* 110110 */
- 640, /* 110111 */
- 384, /* 111000 */
- 512, /* 111001 */
- 512, /* 111010 */
- 640, /* 111011 */
- 512, /* 111100 */
- 640, /* 111101 */
- 640, /* 111110 */
- 768 /* 111111 */
+ 0, /* 0 */
+ 128, /* 1 */
+ 128, /* 10 */
+ 256, /* 11 */
+ 128, /* 100 */
+ 256, /* 101 */
+ 256, /* 110 */
+ 384, /* 111 */
+ 128, /* 1000 */
+ 256, /* 1001 */
+ 256, /* 1010 */
+ 384, /* 1011 */
+ 256, /* 1100 */
+ 384, /* 1101 */
+ 384, /* 1110 */
+ 512, /* 1111 */
+ 128, /* 10000 */
+ 256, /* 10001 */
+ 256, /* 10010 */
+ 384, /* 10011 */
+ 256, /* 10100 */
+ 384, /* 10101 */
+ 384, /* 10110 */
+ 512, /* 10111 */
+ 256, /* 11000 */
+ 384, /* 11001 */
+ 384, /* 11010 */
+ 512, /* 11011 */
+ 384, /* 11100 */
+ 512, /* 11101 */
+ 512, /* 11110 */
+ 640, /* 11111 */
+ 128, /* 100000 */
+ 256, /* 100001 */
+ 256, /* 100010 */
+ 384, /* 100011 */
+ 256, /* 100100 */
+ 384, /* 100101 */
+ 384, /* 100110 */
+ 512, /* 100111 */
+ 256, /* 101000 */
+ 384, /* 101001 */
+ 384, /* 101010 */
+ 512, /* 101011 */
+ 384, /* 101100 */
+ 512, /* 101101 */
+ 512, /* 101110 */
+ 640, /* 101111 */
+ 256, /* 110000 */
+ 384, /* 110001 */
+ 384, /* 110010 */
+ 512, /* 110011 */
+ 384, /* 110100 */
+ 512, /* 110101 */
+ 512, /* 110110 */
+ 640, /* 110111 */
+ 384, /* 111000 */
+ 512, /* 111001 */
+ 512, /* 111010 */
+ 640, /* 111011 */
+ 512, /* 111100 */
+ 640, /* 111101 */
+ 640, /* 111110 */
+ 768 /* 111111 */
};
int DEBUG;
static void intel_xvmc_debug_init(void)
{
- if (getenv("INTEL_XVMC_DEBUG"))
- DEBUG = 1;
+ if (getenv("INTEL_XVMC_DEBUG"))
+ DEBUG = 1;
}
void LOCK_HARDWARE(drm_context_t ctx)
{
- char __ret = 0;
+ char __ret = 0;
- PPTHREAD_MUTEX_LOCK();
- assert(!xvmc_driver->locked);
+ PPTHREAD_MUTEX_LOCK();
+ assert(!xvmc_driver->locked);
- xvmc_driver->locked = 1;
+ xvmc_driver->locked = 1;
}
void UNLOCK_HARDWARE(drm_context_t ctx)
{
- xvmc_driver->locked = 0;
-
- PPTHREAD_MUTEX_UNLOCK();
+ xvmc_driver->locked = 0;
+
+ PPTHREAD_MUTEX_UNLOCK();
}
-static intel_xvmc_context_ptr intel_xvmc_new_context(Display *dpy)
+static intel_xvmc_context_ptr intel_xvmc_new_context(Display * dpy)
{
- intel_xvmc_context_ptr ret;
+ intel_xvmc_context_ptr ret;
- ret = (intel_xvmc_context_ptr)calloc(1, sizeof(intel_xvmc_context_t));
- if (!ret)
- return NULL;
+ ret = (intel_xvmc_context_ptr) calloc(1, sizeof(intel_xvmc_context_t));
+ if (!ret)
+ return NULL;
- if (!xvmc_driver->ctx_list)
- ret->next = NULL;
- else
- ret->next = xvmc_driver->ctx_list;
- xvmc_driver->ctx_list = ret;
- xvmc_driver->num_ctx++;
+ if (!xvmc_driver->ctx_list)
+ ret->next = NULL;
+ else
+ ret->next = xvmc_driver->ctx_list;
+ xvmc_driver->ctx_list = ret;
+ xvmc_driver->num_ctx++;
- return ret;
+ return ret;
}
static void intel_xvmc_free_context(XID id)
{
- intel_xvmc_context_ptr p = xvmc_driver->ctx_list;
- intel_xvmc_context_ptr pre = p;
-
- while(p) {
- if (p->context && p->context->context_id == id) {
- if (p == xvmc_driver->ctx_list)
- xvmc_driver->ctx_list = p->next;
- else
- pre->next = p->next;
- break;
+ intel_xvmc_context_ptr p = xvmc_driver->ctx_list;
+ intel_xvmc_context_ptr pre = p;
+
+ while (p) {
+ if (p->context && p->context->context_id == id) {
+ if (p == xvmc_driver->ctx_list)
+ xvmc_driver->ctx_list = p->next;
+ else
+ pre->next = p->next;
+ break;
+ }
+ pre = p;
+ p = p->next;
+ }
+
+ if (p) {
+ free(p);
+ xvmc_driver->num_ctx--;
}
- pre = p;
- p = p->next;
- }
-
- if (p) {
- free(p);
- xvmc_driver->num_ctx--;
- }
}
intel_xvmc_context_ptr intel_xvmc_find_context(XID id)
{
- intel_xvmc_context_ptr p = xvmc_driver->ctx_list;
-
- while(p) {
- if (p->context && p->context->context_id == id)
- return p;
- p = p->next;
- }
- return NULL;
+ intel_xvmc_context_ptr p = xvmc_driver->ctx_list;
+
+ while (p) {
+ if (p->context && p->context->context_id == id)
+ return p;
+ p = p->next;
+ }
+ return NULL;
}
-static intel_xvmc_surface_ptr intel_xvmc_new_surface(Display *dpy)
+static intel_xvmc_surface_ptr intel_xvmc_new_surface(Display * dpy)
{
- intel_xvmc_surface_ptr ret;
+ intel_xvmc_surface_ptr ret;
- ret = (intel_xvmc_surface_ptr)calloc(1, sizeof(intel_xvmc_surface_t));
- if (!ret)
- return NULL;
+ ret = (intel_xvmc_surface_ptr) calloc(1, sizeof(intel_xvmc_surface_t));
+ if (!ret)
+ return NULL;
- if (!xvmc_driver->surf_list)
- ret->next = NULL;
- else
- ret->next = xvmc_driver->surf_list;
- xvmc_driver->surf_list = ret;
- xvmc_driver->num_surf++;
+ if (!xvmc_driver->surf_list)
+ ret->next = NULL;
+ else
+ ret->next = xvmc_driver->surf_list;
+ xvmc_driver->surf_list = ret;
+ xvmc_driver->num_surf++;
- ret->image = NULL;
- ret->gc_init = FALSE;
+ ret->image = NULL;
+ ret->gc_init = FALSE;
- return ret;
+ return ret;
}
static void intel_xvmc_free_surface(XID id)
{
- intel_xvmc_surface_ptr p = xvmc_driver->surf_list;
- intel_xvmc_surface_ptr pre = p;
-
- while(p) {
- if (p->surface && p->surface->surface_id == id) {
- if (p == xvmc_driver->surf_list)
- xvmc_driver->surf_list = p->next;
- else
- pre->next = p->next;
- break;
+ intel_xvmc_surface_ptr p = xvmc_driver->surf_list;
+ intel_xvmc_surface_ptr pre = p;
+
+ while (p) {
+ if (p->surface && p->surface->surface_id == id) {
+ if (p == xvmc_driver->surf_list)
+ xvmc_driver->surf_list = p->next;
+ else
+ pre->next = p->next;
+ break;
+ }
+ pre = p;
+ p = p->next;
+ }
+
+ if (p) {
+ free(p);
+ xvmc_driver->num_surf--;
}
- pre = p;
- p = p->next;
- }
-
- if (p) {
- free(p);
- xvmc_driver->num_surf--;
- }
}
intel_xvmc_surface_ptr intel_xvmc_find_surface(XID id)
{
- intel_xvmc_surface_ptr p = xvmc_driver->surf_list;
-
- while(p) {
- if (p->surface && p->surface->surface_id == id)
- return p;
- p = p->next;
- }
- return NULL;
+ intel_xvmc_surface_ptr p = xvmc_driver->surf_list;
+
+ while (p) {
+ if (p->surface && p->surface->surface_id == id)
+ return p;
+ p = p->next;
+ }
+ return NULL;
}
+
/*
* Function: XvMCCreateContext
* Description: Create a XvMC context for the given surface parameters.
@@ -250,188 +251,194 @@ intel_xvmc_surface_ptr intel_xvmc_find_surface(XID id)
* returned by XvMCListSurfaceTypes.
* Returns: Status
*/
-_X_EXPORT Status XvMCCreateContext(Display *display, XvPortID port,
- int surface_type_id, int width, int height,
- int flags, XvMCContext *context)
+_X_EXPORT Status XvMCCreateContext(Display * display, XvPortID port,
+ int surface_type_id, int width, int height,
+ int flags, XvMCContext * context)
{
- Status ret;
- CARD32 *priv_data = NULL;
- struct _intel_xvmc_common *comm;
- drm_magic_t magic;
- int major, minor;
- int error_base;
- int event_base;
- int priv_count;
- int isCapable;
- int screen = DefaultScreen(display);
- intel_xvmc_context_ptr intel_ctx;
- int fd;
- char *driverName = NULL, *deviceName = NULL;
-
- /* Verify Obvious things first */
- if (!display || !context)
- return BadValue;
-
- if (!(flags & XVMC_DIRECT)) {
- XVMC_ERR("Indirect Rendering not supported! Using Direct.");
- return BadValue;
- }
-
- intel_xvmc_debug_init();
-
- /*
- Width, Height, and flags are checked against surface_type_id
- and port for validity inside the X server, no need to check
- here.
- */
- context->surface_type_id = surface_type_id;
- context->width = (unsigned short)((width + 15) & ~15);
- context->height = (unsigned short)((height + 15) & ~15);
- context->flags = flags;
- context->port = port;
-
- if (!XvMCQueryExtension(display, &event_base, &error_base)) {
- XVMC_ERR("XvMCExtension is not available!");
- return BadValue;
- }
- ret = XvMCQueryVersion(display, &major, &minor);
- if (ret) {
- XVMC_ERR("XvMCQueryVersion Failed, unable to determine protocol version.");
- return ret;
- }
-
- /* XXX: major and minor could be checked in future for XvMC
- * protocol capability (i.e H.264/AVC decode available)
- */
-
- /*
- Pass control to the X server to create a drm_context_t for us and
- validate the with/height and flags.
- */
- if ((ret = _xvmc_create_context(display, context, &priv_count, &priv_data))) {
- XVMC_ERR("Unable to create XvMC Context.");
- return ret;
- }
- XVMC_DBG("new context %d created\n", (int)context->context_id);
-
- comm = (struct _intel_xvmc_common *)priv_data;
-
- if (xvmc_driver == NULL || xvmc_driver->type != comm->type) {
- switch (comm->type) {
- case XVMC_I915_MPEG2_MC:
- xvmc_driver = &i915_xvmc_mc_driver;
- break;
- case XVMC_I965_MPEG2_MC:
- xvmc_driver = &i965_xvmc_mc_driver;
- break;
- case XVMC_I965_MPEG2_VLD:
- xvmc_driver = &xvmc_vld_driver;
- break;
- case XVMC_I945_MPEG2_VLD:
- default:
- XVMC_ERR("unimplemented xvmc type %d", comm->type);
- XFree(priv_data);
- priv_data = NULL;
+ Status ret;
+ CARD32 *priv_data = NULL;
+ struct _intel_xvmc_common *comm;
+ drm_magic_t magic;
+ int major, minor;
+ int error_base;
+ int event_base;
+ int priv_count;
+ int isCapable;
+ int screen = DefaultScreen(display);
+ intel_xvmc_context_ptr intel_ctx;
+ int fd;
+ char *driverName = NULL, *deviceName = NULL;
+
+ /* Verify Obvious things first */
+ if (!display || !context)
+ return BadValue;
+
+ if (!(flags & XVMC_DIRECT)) {
+ XVMC_ERR("Indirect Rendering not supported! Using Direct.");
return BadValue;
}
- }
- if (xvmc_driver == NULL || xvmc_driver->type != comm->type) {
- XVMC_ERR("fail to load xvmc driver for type %d\n", comm->type);
- return BadValue;
- }
-
- XVMC_INFO("decoder type is %s", intel_xvmc_decoder_string(comm->type));
-
- xvmc_driver->kernel_exec_fencing = comm->kernel_exec_fencing;
-
- /* assign local ctx info */
- intel_ctx = intel_xvmc_new_context(display);
- if (!intel_ctx) {
- XVMC_ERR("Intel XvMC context create fail\n");
- return BadAlloc;
- }
- intel_ctx->context = context;
-
- /* check DRI2 */
- ret = Success;
- xvmc_driver->fd = -1;
-
- do {
- if (!DRI2QueryExtension(display, &event_base, &error_base)) {
- ret = BadValue;
- break;
- }
-
- if (!DRI2QueryVersion(display, &major, &minor)) {
- ret = BadValue;
- break;
- }
-
- if (!DRI2Connect(display, RootWindow(display, screen),
- &driverName, &deviceName)) {
- ret = BadValue;
- break;
- }
-
- xvmc_driver->fd = open(deviceName, O_RDWR);
-
- if (xvmc_driver->fd < 0) {
- XVMC_ERR("Failed to open drm device: %s\n", strerror(errno));
- ret = BadValue;
- break;
- }
-
- if (drmGetMagic(xvmc_driver->fd, &magic)) {
- XVMC_ERR("Failed to get magic\n");
- ret = BadValue;
- break;
- }
-
- if (!DRI2Authenticate(display, RootWindow(display, screen), magic)) {
- XVMC_ERR("Failed to authenticate magic %d\n", magic);
- ret = BadValue;
- break;
- }
- } while (0);
-
- XFree(driverName);
- XFree(deviceName);
-
- if (ret != Success) {
- XFree(priv_data);
- context->privData = NULL;
-
- if (xvmc_driver->fd >= 0)
- close(xvmc_driver->fd);
-
- xvmc_driver = NULL;
- return ret;
- }
-
- if ((xvmc_driver->bufmgr =
- intel_bufmgr_gem_init(xvmc_driver->fd, 1024*64)) == NULL) {
- XVMC_ERR("Can't init bufmgr\n");
- return BadAlloc;
- }
- drm_intel_bufmgr_gem_enable_reuse(xvmc_driver->bufmgr);
-
- /* call driver hook.
- * driver hook should free priv_data after return if success.*/
- ret = (xvmc_driver->create_context)(display, context, priv_count, priv_data);
- if (ret) {
- XVMC_ERR("driver create context failed\n");
- XFree(priv_data);
- context->privData = NULL;
- xvmc_driver = NULL;
- return ret;
- }
+ intel_xvmc_debug_init();
+
+ /*
+ Width, Height, and flags are checked against surface_type_id
+ and port for validity inside the X server, no need to check
+ here.
+ */
+ context->surface_type_id = surface_type_id;
+ context->width = (unsigned short)((width + 15) & ~15);
+ context->height = (unsigned short)((height + 15) & ~15);
+ context->flags = flags;
+ context->port = port;
+
+ if (!XvMCQueryExtension(display, &event_base, &error_base)) {
+ XVMC_ERR("XvMCExtension is not available!");
+ return BadValue;
+ }
+ ret = XvMCQueryVersion(display, &major, &minor);
+ if (ret) {
+ XVMC_ERR
+ ("XvMCQueryVersion Failed, unable to determine protocol version.");
+ return ret;
+ }
- pthread_mutex_init(&xvmc_driver->ctxmutex, NULL);
- intelInitBatchBuffer();
- intel_xvmc_dump_open();
+ /* XXX: major and minor could be checked in future for XvMC
+ * protocol capability (i.e H.264/AVC decode available)
+ */
+
+ /*
+ Pass control to the X server to create a drm_context_t for us and
+ validate the with/height and flags.
+ */
+ if ((ret =
+ _xvmc_create_context(display, context, &priv_count, &priv_data))) {
+ XVMC_ERR("Unable to create XvMC Context.");
+ return ret;
+ }
+ XVMC_DBG("new context %d created\n", (int)context->context_id);
+
+ comm = (struct _intel_xvmc_common *)priv_data;
+
+ if (xvmc_driver == NULL || xvmc_driver->type != comm->type) {
+ switch (comm->type) {
+ case XVMC_I915_MPEG2_MC:
+ xvmc_driver = &i915_xvmc_mc_driver;
+ break;
+ case XVMC_I965_MPEG2_MC:
+ xvmc_driver = &i965_xvmc_mc_driver;
+ break;
+ case XVMC_I965_MPEG2_VLD:
+ xvmc_driver = &xvmc_vld_driver;
+ break;
+ case XVMC_I945_MPEG2_VLD:
+ default:
+ XVMC_ERR("unimplemented xvmc type %d", comm->type);
+ XFree(priv_data);
+ priv_data = NULL;
+ return BadValue;
+ }
+ }
+
+ if (xvmc_driver == NULL || xvmc_driver->type != comm->type) {
+ XVMC_ERR("fail to load xvmc driver for type %d\n", comm->type);
+ return BadValue;
+ }
+
+ XVMC_INFO("decoder type is %s", intel_xvmc_decoder_string(comm->type));
+
+ xvmc_driver->kernel_exec_fencing = comm->kernel_exec_fencing;
+
+ /* assign local ctx info */
+ intel_ctx = intel_xvmc_new_context(display);
+ if (!intel_ctx) {
+ XVMC_ERR("Intel XvMC context create fail\n");
+ return BadAlloc;
+ }
+ intel_ctx->context = context;
+
+ /* check DRI2 */
+ ret = Success;
+ xvmc_driver->fd = -1;
+
+ do {
+ if (!DRI2QueryExtension(display, &event_base, &error_base)) {
+ ret = BadValue;
+ break;
+ }
+
+ if (!DRI2QueryVersion(display, &major, &minor)) {
+ ret = BadValue;
+ break;
+ }
+
+ if (!DRI2Connect(display, RootWindow(display, screen),
+ &driverName, &deviceName)) {
+ ret = BadValue;
+ break;
+ }
+
+ xvmc_driver->fd = open(deviceName, O_RDWR);
+
+ if (xvmc_driver->fd < 0) {
+ XVMC_ERR("Failed to open drm device: %s\n",
+ strerror(errno));
+ ret = BadValue;
+ break;
+ }
+
+ if (drmGetMagic(xvmc_driver->fd, &magic)) {
+ XVMC_ERR("Failed to get magic\n");
+ ret = BadValue;
+ break;
+ }
+
+ if (!DRI2Authenticate
+ (display, RootWindow(display, screen), magic)) {
+ XVMC_ERR("Failed to authenticate magic %d\n", magic);
+ ret = BadValue;
+ break;
+ }
+ } while (0);
+
+ XFree(driverName);
+ XFree(deviceName);
+
+ if (ret != Success) {
+ XFree(priv_data);
+ context->privData = NULL;
+
+ if (xvmc_driver->fd >= 0)
+ close(xvmc_driver->fd);
- return Success;
+ xvmc_driver = NULL;
+ return ret;
+ }
+
+ if ((xvmc_driver->bufmgr =
+ intel_bufmgr_gem_init(xvmc_driver->fd, 1024 * 64)) == NULL) {
+ XVMC_ERR("Can't init bufmgr\n");
+ return BadAlloc;
+ }
+ drm_intel_bufmgr_gem_enable_reuse(xvmc_driver->bufmgr);
+
+ /* call driver hook.
+ * driver hook should free priv_data after return if success.*/
+ ret =
+ (xvmc_driver->create_context) (display, context, priv_count,
+ priv_data);
+ if (ret) {
+ XVMC_ERR("driver create context failed\n");
+ XFree(priv_data);
+ context->privData = NULL;
+ xvmc_driver = NULL;
+ return ret;
+ }
+
+ pthread_mutex_init(&xvmc_driver->ctxmutex, NULL);
+ intelInitBatchBuffer();
+ intel_xvmc_dump_open();
+
+ return Success;
}
/*
@@ -443,201 +450,207 @@ _X_EXPORT Status XvMCCreateContext(Display *display, XvPortID port,
* context - The context to be destroyed.
*
*/
-_X_EXPORT Status XvMCDestroyContext(Display *display, XvMCContext *context)
+_X_EXPORT Status XvMCDestroyContext(Display * display, XvMCContext * context)
{
- Status ret;
- int screen;
-
- if (!display || !context)
- return XvMCBadContext;
- screen = DefaultScreen(display);
- ret = (xvmc_driver->destroy_context)(display, context);
- if (ret) {
- XVMC_ERR("destroy context fail\n");
- return ret;
- }
+ Status ret;
+ int screen;
+
+ if (!display || !context)
+ return XvMCBadContext;
+ screen = DefaultScreen(display);
+ ret = (xvmc_driver->destroy_context) (display, context);
+ if (ret) {
+ XVMC_ERR("destroy context fail\n");
+ return ret;
+ }
- intelFiniBatchBuffer();
+ intelFiniBatchBuffer();
- dri_bufmgr_destroy(xvmc_driver->bufmgr);
+ dri_bufmgr_destroy(xvmc_driver->bufmgr);
- intel_xvmc_free_context(context->context_id);
+ intel_xvmc_free_context(context->context_id);
- ret = _xvmc_destroy_context(display, context);
- if (ret != Success) {
- XVMC_ERR("_xvmc_destroy_context fail\n");
- return ret;
- }
+ ret = _xvmc_destroy_context(display, context);
+ if (ret != Success) {
+ XVMC_ERR("_xvmc_destroy_context fail\n");
+ return ret;
+ }
- if (xvmc_driver->num_ctx == 0) {
- pthread_mutex_destroy(&xvmc_driver->ctxmutex);
+ if (xvmc_driver->num_ctx == 0) {
+ pthread_mutex_destroy(&xvmc_driver->ctxmutex);
- if (xvmc_driver->fd >= 0)
- close(xvmc_driver->fd);
-
- xvmc_driver->fd = -1;
- intel_xvmc_dump_close();
- }
- return Success;
+ if (xvmc_driver->fd >= 0)
+ close(xvmc_driver->fd);
+
+ xvmc_driver->fd = -1;
+ intel_xvmc_dump_close();
+ }
+ return Success;
}
/*
* Function: XvMCCreateSurface
*/
-_X_EXPORT Status XvMCCreateSurface(Display *display, XvMCContext *context, XvMCSurface *surface)
+_X_EXPORT Status XvMCCreateSurface(Display * display, XvMCContext * context,
+ XvMCSurface * surface)
{
- Status ret;
- int priv_count;
- CARD32 *priv_data;
- intel_xvmc_surface_ptr intel_surf = NULL;
-
- if (!display || !context)
- return XvMCBadContext;
-
- if (!surface)
- return XvMCBadSurface;
-
- intel_surf = intel_xvmc_new_surface(display);
- if (!intel_surf)
- return BadAlloc;
- intel_surf->surface = surface;
-
- if ((ret = _xvmc_create_surface(display, context, surface,
- &priv_count, &priv_data))) {
- XVMC_ERR("Unable to create XvMCSurface.");
- return ret;
- }
-
- intel_surf->image = XvCreateImage(display, context->port,
- FOURCC_XVMC, (char *)&intel_surf->data, surface->width,
- surface->height);
- if (!intel_surf->image) {
- XVMC_ERR("Can't create XvImage for surface\n");
- _xvmc_destroy_surface(display, surface);
- intel_xvmc_free_surface(surface->surface_id);
- return BadAlloc;
- }
- intel_surf->image->data = (char *)&intel_surf->data;
-
- ret = (xvmc_driver->create_surface)(display, context, surface, priv_count,
- priv_data);
- if (ret) {
- XVMC_ERR("create surface failed\n");
- return ret;
- }
+ Status ret;
+ int priv_count;
+ CARD32 *priv_data;
+ intel_xvmc_surface_ptr intel_surf = NULL;
+
+ if (!display || !context)
+ return XvMCBadContext;
+
+ if (!surface)
+ return XvMCBadSurface;
+
+ intel_surf = intel_xvmc_new_surface(display);
+ if (!intel_surf)
+ return BadAlloc;
+ intel_surf->surface = surface;
+
+ if ((ret = _xvmc_create_surface(display, context, surface,
+ &priv_count, &priv_data))) {
+ XVMC_ERR("Unable to create XvMCSurface.");
+ return ret;
+ }
- return Success;
-}
+ intel_surf->image = XvCreateImage(display, context->port,
+ FOURCC_XVMC,
+ (char *)&intel_surf->data,
+ surface->width, surface->height);
+ if (!intel_surf->image) {
+ XVMC_ERR("Can't create XvImage for surface\n");
+ _xvmc_destroy_surface(display, surface);
+ intel_xvmc_free_surface(surface->surface_id);
+ return BadAlloc;
+ }
+ intel_surf->image->data = (char *)&intel_surf->data;
+
+ ret =
+ (xvmc_driver->create_surface) (display, context, surface,
+ priv_count, priv_data);
+ if (ret) {
+ XVMC_ERR("create surface failed\n");
+ return ret;
+ }
+ return Success;
+}
/*
* Function: XvMCDestroySurface
*/
-_X_EXPORT Status XvMCDestroySurface(Display *display, XvMCSurface *surface)
+_X_EXPORT Status XvMCDestroySurface(Display * display, XvMCSurface * surface)
{
- intel_xvmc_surface_ptr intel_surf;
+ intel_xvmc_surface_ptr intel_surf;
- if (!display || !surface)
- return XvMCBadSurface;
+ if (!display || !surface)
+ return XvMCBadSurface;
- intel_surf = intel_xvmc_find_surface(surface->surface_id);
- if (!intel_surf)
- return XvMCBadSurface;
+ intel_surf = intel_xvmc_find_surface(surface->surface_id);
+ if (!intel_surf)
+ return XvMCBadSurface;
- XFree(intel_surf->image);
- if (intel_surf->gc_init)
- XFreeGC(display, intel_surf->gc);
- intel_xvmc_free_surface(surface->surface_id);
+ XFree(intel_surf->image);
+ if (intel_surf->gc_init)
+ XFreeGC(display, intel_surf->gc);
+ intel_xvmc_free_surface(surface->surface_id);
- (xvmc_driver->destroy_surface)(display, surface);
+ (xvmc_driver->destroy_surface) (display, surface);
- _xvmc_destroy_surface(display, surface);
+ _xvmc_destroy_surface(display, surface);
- return Success;
+ return Success;
}
/*
* Function: XvMCCreateBlocks
*/
-_X_EXPORT Status XvMCCreateBlocks(Display *display, XvMCContext *context,
- unsigned int num_blocks,
- XvMCBlockArray *block)
+_X_EXPORT Status XvMCCreateBlocks(Display * display, XvMCContext * context,
+ unsigned int num_blocks,
+ XvMCBlockArray * block)
{
- Status ret;
- if (!display || !context || !num_blocks || !block)
- return BadValue;
+ Status ret;
+ if (!display || !context || !num_blocks || !block)
+ return BadValue;
- memset(block, 0, sizeof(XvMCBlockArray));
+ memset(block, 0, sizeof(XvMCBlockArray));
- if (!(block->blocks = (short *)malloc((num_blocks << 6) * sizeof(short))))
- return BadAlloc;
+ if (!
+ (block->blocks =
+ (short *)malloc((num_blocks << 6) * sizeof(short))))
+ return BadAlloc;
- block->num_blocks = num_blocks;
- block->context_id = context->context_id;
- block->privData = NULL;
+ block->num_blocks = num_blocks;
+ block->context_id = context->context_id;
+ block->privData = NULL;
- return Success;
+ return Success;
}
/*
* Function: XvMCDestroyBlocks
*/
-_X_EXPORT Status XvMCDestroyBlocks(Display *display, XvMCBlockArray *block)
+_X_EXPORT Status XvMCDestroyBlocks(Display * display, XvMCBlockArray * block)
{
- Status ret;
- if (!display || !block)
- return BadValue;
+ Status ret;
+ if (!display || !block)
+ return BadValue;
- if (block->blocks)
- free(block->blocks);
+ if (block->blocks)
+ free(block->blocks);
- block->context_id = 0;
- block->num_blocks = 0;
- block->blocks = NULL;
- block->privData = NULL;
+ block->context_id = 0;
+ block->num_blocks = 0;
+ block->blocks = NULL;
+ block->privData = NULL;
- return Success;
+ return Success;
}
/*
* Function: XvMCCreateMacroBlocks
*/
-_X_EXPORT Status XvMCCreateMacroBlocks(Display *display, XvMCContext *context,
- unsigned int num_blocks,
- XvMCMacroBlockArray *blocks)
+_X_EXPORT Status XvMCCreateMacroBlocks(Display * display, XvMCContext * context,
+ unsigned int num_blocks,
+ XvMCMacroBlockArray * blocks)
{
- if (!display || !context || !blocks || !num_blocks)
- return BadValue;
+ if (!display || !context || !blocks || !num_blocks)
+ return BadValue;
- memset(blocks, 0, sizeof(XvMCMacroBlockArray));
- blocks->macro_blocks = (XvMCMacroBlock *)malloc(num_blocks * sizeof(XvMCMacroBlock));
+ memset(blocks, 0, sizeof(XvMCMacroBlockArray));
+ blocks->macro_blocks =
+ (XvMCMacroBlock *) malloc(num_blocks * sizeof(XvMCMacroBlock));
- if (!blocks->macro_blocks)
- return BadAlloc;
+ if (!blocks->macro_blocks)
+ return BadAlloc;
- blocks->num_blocks = num_blocks;
- blocks->context_id = context->context_id;
- blocks->privData = NULL;
+ blocks->num_blocks = num_blocks;
+ blocks->context_id = context->context_id;
+ blocks->privData = NULL;
- return Success;
+ return Success;
}
/*
* Function: XvMCDestroyMacroBlocks
*/
-_X_EXPORT Status XvMCDestroyMacroBlocks(Display *display, XvMCMacroBlockArray *block)
+_X_EXPORT Status XvMCDestroyMacroBlocks(Display * display,
+ XvMCMacroBlockArray * block)
{
- if (!display || !block)
- return BadValue;
- if (block->macro_blocks)
- free(block->macro_blocks);
+ if (!display || !block)
+ return BadValue;
+ if (block->macro_blocks)
+ free(block->macro_blocks);
- block->context_id = 0;
- block->num_blocks = 0;
- block->macro_blocks = NULL;
- block->privData = NULL;
+ block->context_id = 0;
+ block->num_blocks = 0;
+ block->macro_blocks = NULL;
+ block->privData = NULL;
- return Success;
+ return Success;
}
/*
@@ -647,40 +660,43 @@ _X_EXPORT Status XvMCDestroyMacroBlocks(Display *display, XvMCMacroBlockArray *b
* macroblock structures it dispatched the hardware commands to execute
* them.
*/
-_X_EXPORT Status XvMCRenderSurface(Display *display, XvMCContext *context,
- unsigned int picture_structure,
- XvMCSurface *target_surface,
- XvMCSurface *past_surface,
- XvMCSurface *future_surface,
- unsigned int flags,
- unsigned int num_macroblocks,
- unsigned int first_macroblock,
- XvMCMacroBlockArray *macroblock_array,
- XvMCBlockArray *blocks)
+_X_EXPORT Status XvMCRenderSurface(Display * display, XvMCContext * context,
+ unsigned int picture_structure,
+ XvMCSurface * target_surface,
+ XvMCSurface * past_surface,
+ XvMCSurface * future_surface,
+ unsigned int flags,
+ unsigned int num_macroblocks,
+ unsigned int first_macroblock,
+ XvMCMacroBlockArray * macroblock_array,
+ XvMCBlockArray * blocks)
{
- Status ret;
-
- if (!display || !context) {
- XVMC_ERR("Invalid Display, Context or Target!");
- return XvMCBadContext;
- }
- if (!target_surface)
- return XvMCBadSurface;
-
- intel_xvmc_dump_render(context, picture_structure, target_surface,
- past_surface, future_surface, flags, num_macroblocks,
- first_macroblock, macroblock_array, blocks);
-
- ret = (xvmc_driver->render_surface)(display, context, picture_structure,
- target_surface, past_surface, future_surface, flags,
- num_macroblocks, first_macroblock, macroblock_array,
- blocks);
-
- if (ret) {
- XVMC_ERR("render surface fail\n");
- return ret;
- }
- return Success;
+ Status ret;
+
+ if (!display || !context) {
+ XVMC_ERR("Invalid Display, Context or Target!");
+ return XvMCBadContext;
+ }
+ if (!target_surface)
+ return XvMCBadSurface;
+
+ intel_xvmc_dump_render(context, picture_structure, target_surface,
+ past_surface, future_surface, flags,
+ num_macroblocks, first_macroblock,
+ macroblock_array, blocks);
+
+ ret =
+ (xvmc_driver->render_surface) (display, context, picture_structure,
+ target_surface, past_surface,
+ future_surface, flags,
+ num_macroblocks, first_macroblock,
+ macroblock_array, blocks);
+
+ if (ret) {
+ XVMC_ERR("render surface fail\n");
+ return ret;
+ }
+ return Success;
}
/*
@@ -708,46 +724,47 @@ _X_EXPORT Status XvMCRenderSurface(Display *display, XvMCContext *context,
* XVMC_BOTTOM_FIELD - Display only the Bottom Field of the surface.
* XVMC_FRAME_PICTURE - Display both fields or frame.
*/
-_X_EXPORT Status XvMCPutSurface(Display *display,XvMCSurface *surface,
- Drawable draw, short srcx, short srcy,
- unsigned short srcw, unsigned short srch,
- short destx, short desty,
- unsigned short destw, unsigned short desth,
- int flags)
+_X_EXPORT Status XvMCPutSurface(Display * display, XvMCSurface * surface,
+ Drawable draw, short srcx, short srcy,
+ unsigned short srcw, unsigned short srch,
+ short destx, short desty,
+ unsigned short destw, unsigned short desth,
+ int flags)
{
- Status ret = Success;
- XvMCContext *context;
- intel_xvmc_context_ptr intel_ctx;
- intel_xvmc_surface_ptr intel_surf;
-
- if (!display || !surface)
- return XvMCBadSurface;
-
- intel_ctx = intel_xvmc_find_context(surface->context_id);
- intel_surf = intel_xvmc_find_surface(surface->surface_id);
- if (!intel_ctx || !intel_surf)
- return XvMCBadSurface;
- context = intel_ctx->context;
-
- if (intel_surf->gc_init == FALSE) {
- intel_surf->gc = XCreateGC(display, draw, 0, NULL);
- intel_surf->gc_init = TRUE;
- } else if (draw != intel_surf->last_draw) {
- XFreeGC(display, intel_surf->gc);
- intel_surf->gc = XCreateGC(display, draw, 0, NULL);
- }
- intel_surf->last_draw = draw;
- /* fill intel_surf->data */
- ret = (xvmc_driver->put_surface)(display, surface, draw, srcx, srcy,
- srcw, srch, destx, desty, destw, desth, flags, &intel_surf->data);
- if (ret) {
- XVMC_ERR("put surface fail\n");
+ Status ret = Success;
+ XvMCContext *context;
+ intel_xvmc_context_ptr intel_ctx;
+ intel_xvmc_surface_ptr intel_surf;
+
+ if (!display || !surface)
+ return XvMCBadSurface;
+
+ intel_ctx = intel_xvmc_find_context(surface->context_id);
+ intel_surf = intel_xvmc_find_surface(surface->surface_id);
+ if (!intel_ctx || !intel_surf)
+ return XvMCBadSurface;
+ context = intel_ctx->context;
+
+ if (intel_surf->gc_init == FALSE) {
+ intel_surf->gc = XCreateGC(display, draw, 0, NULL);
+ intel_surf->gc_init = TRUE;
+ } else if (draw != intel_surf->last_draw) {
+ XFreeGC(display, intel_surf->gc);
+ intel_surf->gc = XCreateGC(display, draw, 0, NULL);
+ }
+ intel_surf->last_draw = draw;
+ /* fill intel_surf->data */
+ ret = (xvmc_driver->put_surface) (display, surface, draw, srcx, srcy,
+ srcw, srch, destx, desty, destw,
+ desth, flags, &intel_surf->data);
+ if (ret) {
+ XVMC_ERR("put surface fail\n");
+ return ret;
+ }
+ ret = XvPutImage(display, context->port, draw, intel_surf->gc,
+ intel_surf->image, srcx, srcy, srcw, srch, destx,
+ desty, destw, desth);
return ret;
- }
- ret = XvPutImage(display, context->port, draw, intel_surf->gc,
- intel_surf->image, srcx, srcy, srcw, srch, destx, desty,
- destw, desth);
- return ret;
}
/*
@@ -756,19 +773,19 @@ _X_EXPORT Status XvMCPutSurface(Display *display,XvMCSurface *surface,
* display - Connection to the X server
* surface - The surface to synchronize
*/
-_X_EXPORT Status XvMCSyncSurface(Display *display, XvMCSurface *surface)
+_X_EXPORT Status XvMCSyncSurface(Display * display, XvMCSurface * surface)
{
- Status ret;
- int stat = 0;
+ Status ret;
+ int stat = 0;
- if (!display || !surface)
- return XvMCBadSurface;
+ if (!display || !surface)
+ return XvMCBadSurface;
- do {
- ret = XvMCGetSurfaceStatus(display, surface, &stat);
- } while (!ret && (stat & XVMC_RENDERING));
+ do {
+ ret = XvMCGetSurfaceStatus(display, surface, &stat);
+ } while (!ret && (stat & XVMC_RENDERING));
- return ret;
+ return ret;
}
/*
@@ -781,11 +798,11 @@ _X_EXPORT Status XvMCSyncSurface(Display *display, XvMCSurface *surface)
* surface - Surface to flush
* Returns: Status
*/
-_X_EXPORT Status XvMCFlushSurface(Display * display, XvMCSurface *surface)
+_X_EXPORT Status XvMCFlushSurface(Display * display, XvMCSurface * surface)
{
- if (!display || !surface)
- return XvMCBadSurface;
- return Success;
+ if (!display || !surface)
+ return XvMCBadSurface;
+ return Success;
}
/*
@@ -800,20 +817,21 @@ _X_EXPORT Status XvMCFlushSurface(Display * display, XvMCSurface *surface)
* XVMC_DISPLAYING - The surface is currently being displayed or a
* display is pending.
*/
-_X_EXPORT Status XvMCGetSurfaceStatus(Display *display, XvMCSurface *surface, int *stat)
+_X_EXPORT Status XvMCGetSurfaceStatus(Display * display, XvMCSurface * surface,
+ int *stat)
{
- Status ret;
+ Status ret;
- if (!display || !surface || !stat)
- return XvMCBadSurface;
+ if (!display || !surface || !stat)
+ return XvMCBadSurface;
- ret = (xvmc_driver->get_surface_status)(display, surface, stat);
- if (ret) {
- XVMC_ERR("get surface status fail\n");
- return ret;
- }
+ ret = (xvmc_driver->get_surface_status) (display, surface, stat);
+ if (ret) {
+ XVMC_ERR("get surface status fail\n");
+ return ret;
+ }
- return Success;
+ return Success;
}
/*
@@ -825,29 +843,29 @@ _X_EXPORT Status XvMCGetSurfaceStatus(Display *display, XvMCSurface *surface, in
*
* Returns: Status
*/
-_X_EXPORT Status XvMCHideSurface(Display *display, XvMCSurface *surface)
+_X_EXPORT Status XvMCHideSurface(Display * display, XvMCSurface * surface)
{
- int stat = 0;
- Status ret;
+ int stat = 0;
+ Status ret;
- if (!display || !surface)
- return XvMCBadSurface;
+ if (!display || !surface)
+ return XvMCBadSurface;
- XvMCSyncSurface(display, surface);
+ XvMCSyncSurface(display, surface);
- /*
- Get the status of the surface, if it is not currently displayed
- we don't need to worry about it.
- */
- if ((ret = XvMCGetSurfaceStatus(display, surface, &stat)) != Success)
- return ret;
+ /*
+ Get the status of the surface, if it is not currently displayed
+ we don't need to worry about it.
+ */
+ if ((ret = XvMCGetSurfaceStatus(display, surface, &stat)) != Success)
+ return ret;
- if (!(stat & XVMC_DISPLAYING))
- return Success;
+ if (!(stat & XVMC_DISPLAYING))
+ return Success;
- /* FIXME: */
- XVMC_ERR("XvMCHideSurface not implemented!\n");
- return BadValue;
+ /* FIXME: */
+ XVMC_ERR("XvMCHideSurface not implemented!\n");
+ return BadValue;
}
/*
@@ -864,13 +882,13 @@ _X_EXPORT Status XvMCHideSurface(Display *display, XvMCSurface *surface)
*
* Returns: Status
*/
-_X_EXPORT Status XvMCCreateSubpicture(Display *display, XvMCContext *context,
- XvMCSubpicture *subpicture,
- unsigned short width, unsigned short height,
- int xvimage_id)
+_X_EXPORT Status XvMCCreateSubpicture(Display * display, XvMCContext * context,
+ XvMCSubpicture * subpicture,
+ unsigned short width,
+ unsigned short height, int xvimage_id)
{
- XVMC_ERR("XvMCCreateSubpicture not implemented!\n");
- return BadValue;
+ XVMC_ERR("XvMCCreateSubpicture not implemented!\n");
+ return BadValue;
}
/*
@@ -885,13 +903,13 @@ _X_EXPORT Status XvMCCreateSubpicture(Display *display, XvMCContext *context,
*
* Returns: Status
*/
-_X_EXPORT Status XvMCClearSubpicture(Display *display, XvMCSubpicture *subpicture,
- short x, short y,
- unsigned short width, unsigned short height,
- unsigned int color)
+_X_EXPORT Status XvMCClearSubpicture(Display * display,
+ XvMCSubpicture * subpicture, short x,
+ short y, unsigned short width,
+ unsigned short height, unsigned int color)
{
- XVMC_ERR("XvMCClearSubpicture not implemented!");
- return BadValue;
+ XVMC_ERR("XvMCClearSubpicture not implemented!");
+ return BadValue;
}
/*
@@ -909,17 +927,17 @@ _X_EXPORT Status XvMCClearSubpicture(Display *display, XvMCSubpicture *subpictur
*
* Returns: Status
*/
-_X_EXPORT Status XvMCCompositeSubpicture(Display *display, XvMCSubpicture *subpicture,
- XvImage *image,
- short srcx, short srcy,
- unsigned short width, unsigned short height,
- short dstx, short dsty)
+_X_EXPORT Status XvMCCompositeSubpicture(Display * display,
+ XvMCSubpicture * subpicture,
+ XvImage * image, short srcx,
+ short srcy, unsigned short width,
+ unsigned short height, short dstx,
+ short dsty)
{
- XVMC_ERR("XvMCCompositeSubpicture not implemented!");
- return BadValue;
+ XVMC_ERR("XvMCCompositeSubpicture not implemented!");
+ return BadValue;
}
-
/*
* Function: XvMCDestroySubpicture
* Description: Destroys the specified subpicture.
@@ -929,13 +947,13 @@ _X_EXPORT Status XvMCCompositeSubpicture(Display *display, XvMCSubpicture *subpi
*
* Returns: Status
*/
-_X_EXPORT Status XvMCDestroySubpicture(Display *display, XvMCSubpicture *subpicture)
+_X_EXPORT Status XvMCDestroySubpicture(Display * display,
+ XvMCSubpicture * subpicture)
{
- XVMC_ERR("XvMCDestroySubpicture not implemented!");
- return BadValue;
+ XVMC_ERR("XvMCDestroySubpicture not implemented!");
+ return BadValue;
}
-
/*
* Function: XvMCSetSubpicturePalette
* Description: Set the subpictures palette
@@ -946,11 +964,12 @@ _X_EXPORT Status XvMCDestroySubpicture(Display *display, XvMCSubpicture *subpict
* is num_palette_entries * entry_bytes in size.
* Returns: Status
*/
-_X_EXPORT Status XvMCSetSubpicturePalette(Display *display, XvMCSubpicture *subpicture,
- unsigned char *palette)
+_X_EXPORT Status XvMCSetSubpicturePalette(Display * display,
+ XvMCSubpicture * subpicture,
+ unsigned char *palette)
{
- XVMC_ERR("XvMCSetSubpicturePalette not implemented!");
- return BadValue;
+ XVMC_ERR("XvMCSetSubpicturePalette not implemented!");
+ return BadValue;
}
/*
@@ -976,15 +995,16 @@ _X_EXPORT Status XvMCSetSubpicturePalette(Display *display, XvMCSubpicture *subp
*
* Returns: Status
*/
-_X_EXPORT Status XvMCBlendSubpicture(Display *display, XvMCSurface *target_surface,
- XvMCSubpicture *subpicture,
- short subx, short suby,
- unsigned short subw, unsigned short subh,
- short surfx, short surfy,
- unsigned short surfw, unsigned short surfh)
+_X_EXPORT Status XvMCBlendSubpicture(Display * display,
+ XvMCSurface * target_surface,
+ XvMCSubpicture * subpicture, short subx,
+ short suby, unsigned short subw,
+ unsigned short subh, short surfx,
+ short surfy, unsigned short surfw,
+ unsigned short surfh)
{
- XVMC_ERR("XvMCBlendSubpicture not implemented!");
- return BadValue;
+ XVMC_ERR("XvMCBlendSubpicture not implemented!");
+ return BadValue;
}
/*
@@ -1013,17 +1033,18 @@ _X_EXPORT Status XvMCBlendSubpicture(Display *display, XvMCSurface *target_surfa
*
* Returns: Status
*/
-_X_EXPORT Status XvMCBlendSubpicture2(Display *display,
- XvMCSurface *source_surface,
- XvMCSurface *target_surface,
- XvMCSubpicture *subpicture,
- short subx, short suby,
- unsigned short subw, unsigned short subh,
- short surfx, short surfy,
- unsigned short surfw, unsigned short surfh)
+_X_EXPORT Status XvMCBlendSubpicture2(Display * display,
+ XvMCSurface * source_surface,
+ XvMCSurface * target_surface,
+ XvMCSubpicture * subpicture,
+ short subx, short suby,
+ unsigned short subw, unsigned short subh,
+ short surfx, short surfy,
+ unsigned short surfw,
+ unsigned short surfh)
{
- XVMC_ERR("XvMCBlendSubpicture2 not implemented!");
- return BadValue;
+ XVMC_ERR("XvMCBlendSubpicture2 not implemented!");
+ return BadValue;
}
/*
@@ -1036,10 +1057,11 @@ _X_EXPORT Status XvMCBlendSubpicture2(Display *display,
*
* Returns: Status
*/
-_X_EXPORT Status XvMCSyncSubpicture(Display *display, XvMCSubpicture *subpicture)
+_X_EXPORT Status XvMCSyncSubpicture(Display * display,
+ XvMCSubpicture * subpicture)
{
- XVMC_ERR("XvMCSyncSubpicture not implemented!");
- return BadValue;
+ XVMC_ERR("XvMCSyncSubpicture not implemented!");
+ return BadValue;
}
/*
@@ -1053,10 +1075,11 @@ _X_EXPORT Status XvMCSyncSubpicture(Display *display, XvMCSubpicture *subpicture
*
* Returns: Status
*/
-_X_EXPORT Status XvMCFlushSubpicture(Display *display, XvMCSubpicture *subpicture)
+_X_EXPORT Status XvMCFlushSubpicture(Display * display,
+ XvMCSubpicture * subpicture)
{
- XVMC_ERR("XvMCFlushSubpicture not implemented!");
- return BadValue;
+ XVMC_ERR("XvMCFlushSubpicture not implemented!");
+ return BadValue;
}
/*
@@ -1073,11 +1096,11 @@ _X_EXPORT Status XvMCFlushSubpicture(Display *display, XvMCSubpicture *subpictur
*
* Returns: Status
*/
-_X_EXPORT Status XvMCGetSubpictureStatus(Display *display, XvMCSubpicture *subpicture,
- int *stat)
+_X_EXPORT Status XvMCGetSubpictureStatus(Display * display,
+ XvMCSubpicture * subpicture, int *stat)
{
- XVMC_ERR("XvMCGetSubpictureStatus not implemented!");
- return BadValue;
+ XVMC_ERR("XvMCGetSubpictureStatus not implemented!");
+ return BadValue;
}
/*
@@ -1094,12 +1117,12 @@ _X_EXPORT Status XvMCGetSubpictureStatus(Display *display, XvMCSubpicture *subpi
* Returns:
* An array of XvAttributes.
*/
-_X_EXPORT XvAttribute *XvMCQueryAttributes(Display *display, XvMCContext *context,
- int *number)
+_X_EXPORT XvAttribute *XvMCQueryAttributes(Display * display,
+ XvMCContext * context, int *number)
{
- /* now XvMC has no extra attribs than Xv */
- *number = 0;
- return NULL;
+ /* now XvMC has no extra attribs than Xv */
+ *number = 0;
+ return NULL;
}
/*
@@ -1115,10 +1138,10 @@ _X_EXPORT XvAttribute *XvMCQueryAttributes(Display *display, XvMCContext *contex
* Returns:
* Status
*/
-_X_EXPORT Status XvMCSetAttribute(Display *display, XvMCContext *context,
- Atom attribute, int value)
+_X_EXPORT Status XvMCSetAttribute(Display * display, XvMCContext * context,
+ Atom attribute, int value)
{
- return Success;
+ return Success;
}
/*
@@ -1135,52 +1158,53 @@ _X_EXPORT Status XvMCSetAttribute(Display *display, XvMCContext *context,
* Returns:
* Status
*/
-_X_EXPORT Status XvMCGetAttribute(Display *display, XvMCContext *context,
- Atom attribute, int *value)
+_X_EXPORT Status XvMCGetAttribute(Display * display, XvMCContext * context,
+ Atom attribute, int *value)
{
- return Success;
+ return Success;
}
-_X_EXPORT Status XvMCBeginSurface(Display *display, XvMCContext *context,
- XvMCSurface *target,
- XvMCSurface *past,
- XvMCSurface *future,
- const XvMCMpegControl *control)
+_X_EXPORT Status XvMCBeginSurface(Display * display, XvMCContext * context,
+ XvMCSurface * target,
+ XvMCSurface * past,
+ XvMCSurface * future,
+ const XvMCMpegControl * control)
{
- if (xvmc_driver->begin_surface(display, context,
- target, past, future, control)) {
- XVMC_ERR("BeginSurface fail\n");
- return BadValue;
- }
- return Success;
+ if (xvmc_driver->begin_surface(display, context,
+ target, past, future, control)) {
+ XVMC_ERR("BeginSurface fail\n");
+ return BadValue;
+ }
+ return Success;
}
-_X_EXPORT Status XvMCLoadQMatrix(Display *display, XvMCContext *context,
- const XvMCQMatrix *qmx)
+_X_EXPORT Status XvMCLoadQMatrix(Display * display, XvMCContext * context,
+ const XvMCQMatrix * qmx)
{
- if (xvmc_driver->load_qmatrix(display, context, qmx)) {
- XVMC_ERR("LoadQMatrix fail\n");
- return BadValue;
- }
- return Success;
+ if (xvmc_driver->load_qmatrix(display, context, qmx)) {
+ XVMC_ERR("LoadQMatrix fail\n");
+ return BadValue;
+ }
+ return Success;
}
-_X_EXPORT Status XvMCPutSlice(Display *display, XvMCContext *context,
- char *slice, int nbytes)
+_X_EXPORT Status XvMCPutSlice(Display * display, XvMCContext * context,
+ char *slice, int nbytes)
{
- if (xvmc_driver->put_slice(display, context, slice, nbytes)) {
- XVMC_ERR("PutSlice fail\n");
- return BadValue;
- }
- return Success;
+ if (xvmc_driver->put_slice(display, context, slice, nbytes)) {
+ XVMC_ERR("PutSlice fail\n");
+ return BadValue;
+ }
+ return Success;
}
-_X_EXPORT Status XvMCPutSlice2(Display *display, XvMCContext *context,
- char *slice, int nbytes, int slice_code)
+_X_EXPORT Status XvMCPutSlice2(Display * display, XvMCContext * context,
+ char *slice, int nbytes, int slice_code)
{
- if (xvmc_driver->put_slice2(display, context, slice, nbytes, slice_code)) {
- XVMC_ERR("PutSlice2 fail\n");
- return BadValue;
- }
- return Success;
+ if (xvmc_driver->put_slice2
+ (display, context, slice, nbytes, slice_code)) {
+ XVMC_ERR("PutSlice2 fail\n");
+ return BadValue;
+ }
+ return Success;
}
diff --git a/src/xvmc/intel_xvmc.h b/src/xvmc/intel_xvmc.h
index 169e7f8d..67c7b380 100644
--- a/src/xvmc/intel_xvmc.h
+++ b/src/xvmc/intel_xvmc.h
@@ -83,131 +83,132 @@ extern int DEBUG;
Definitions for temporary wire protocol hooks to be replaced
when a HW independent libXvMC is created.
*/
-extern Status _xvmc_create_context(Display *dpy, XvMCContext *context,
- int *priv_count, CARD32 **priv_data);
+extern Status _xvmc_create_context(Display * dpy, XvMCContext * context,
+ int *priv_count, CARD32 ** priv_data);
-extern Status _xvmc_destroy_context(Display *dpy, XvMCContext *context);
+extern Status _xvmc_destroy_context(Display * dpy, XvMCContext * context);
-extern Status _xvmc_create_surface(Display *dpy, XvMCContext *context,
- XvMCSurface *surface, int *priv_count,
- CARD32 **priv_data);
+extern Status _xvmc_create_surface(Display * dpy, XvMCContext * context,
+ XvMCSurface * surface, int *priv_count,
+ CARD32 ** priv_data);
-extern Status _xvmc_destroy_surface(Display *dpy, XvMCSurface *surface);
+extern Status _xvmc_destroy_surface(Display * dpy, XvMCSurface * surface);
-extern Status _xvmc_create_subpicture(Display *dpy, XvMCContext *context,
- XvMCSubpicture *subpicture,
- int *priv_count, uint **priv_data);
+extern Status _xvmc_create_subpicture(Display * dpy, XvMCContext * context,
+ XvMCSubpicture * subpicture,
+ int *priv_count, uint ** priv_data);
-extern Status _xvmc_destroy_subpicture(Display *dpy,
- XvMCSubpicture *subpicture);
+extern Status _xvmc_destroy_subpicture(Display * dpy,
+ XvMCSubpicture * subpicture);
typedef struct _intel_xvmc_context {
- XvMCContext *context;
- drm_context_t hw_context; /* context id to kernel drm */
- struct _intel_xvmc_context *next;
+ XvMCContext *context;
+ drm_context_t hw_context; /* context id to kernel drm */
+ struct _intel_xvmc_context *next;
} intel_xvmc_context_t, *intel_xvmc_context_ptr;
typedef struct _intel_xvmc_surface {
- XvMCSurface *surface;
- XvImage *image;
- GC gc;
- Bool gc_init;
- Drawable last_draw;
- struct intel_xvmc_command data;
- struct _intel_xvmc_surface *next;
+ XvMCSurface *surface;
+ XvImage *image;
+ GC gc;
+ Bool gc_init;
+ Drawable last_draw;
+ struct intel_xvmc_command data;
+ struct _intel_xvmc_surface *next;
} intel_xvmc_surface_t, *intel_xvmc_surface_ptr;
typedef struct _intel_xvmc_drm_map {
- drm_handle_t handle;
- unsigned long offset;
- unsigned long size;
- unsigned long bus_addr;
- drmAddress map;
+ drm_handle_t handle;
+ unsigned long offset;
+ unsigned long size;
+ unsigned long bus_addr;
+ drmAddress map;
} intel_xvmc_drm_map_t, *intel_xvmc_drm_map_ptr;
typedef struct _intel_xvmc_driver {
- int type; /* hw xvmc type - i830_hwmc.h */
- int screen; /* current screen num*/
-
- int fd; /* drm file handler */
-
- dri_bufmgr *bufmgr;
- unsigned int kernel_exec_fencing:1;
-
- struct {
- unsigned int init_offset;
- unsigned int size;
- unsigned int space;
- unsigned char *ptr;
- unsigned char *init_ptr;
- dri_bo *buf;
- } batch;
-
- struct
- {
- void *ptr;
- unsigned int size;
- unsigned int offset;
- unsigned int active_buf;
- unsigned int irq_emitted;
- } alloc;
- intel_xvmc_drm_map_t batchbuffer;
- unsigned int last_render;
-
- sigset_t sa_mask;
- pthread_mutex_t ctxmutex;
- int locked;
-
- int num_ctx;
- intel_xvmc_context_ptr ctx_list;
- int num_surf;
- intel_xvmc_surface_ptr surf_list;
-
- void *private;
-
- /* driver specific xvmc callbacks */
- Status (*create_context)(Display* display, XvMCContext *context,
- int priv_count, CARD32 *priv_data);
-
- Status (*destroy_context)(Display* display, XvMCContext *context);
-
- Status (*create_surface)(Display* display, XvMCContext *context,
- XvMCSurface *surface, int priv_count, CARD32 *priv_data);
-
- Status (*destroy_surface)(Display* display, XvMCSurface *surface);
-
- Status (*render_surface)(Display *display, XvMCContext *context,
- unsigned int picture_structure,
- XvMCSurface *target_surface,
- XvMCSurface *past_surface,
- XvMCSurface *future_surface,
- unsigned int flags,
- unsigned int num_macroblocks,
- unsigned int first_macroblock,
- XvMCMacroBlockArray *macroblock_array,
- XvMCBlockArray *blocks);
-
- Status (*put_surface)(Display *display, XvMCSurface *surface,
- Drawable draw, short srcx, short srcy,
- unsigned short srcw, unsigned short srch,
- short destx, short desty,
- unsigned short destw, unsigned short desth,
- int flags, struct intel_xvmc_command *data);
-
- Status (*get_surface_status)(Display *display, XvMCSurface *surface, int *stat);
-
- Status (*begin_surface)(Display *display, XvMCContext *context,
- XvMCSurface *target_surface,
- XvMCSurface *past_surface,
- XvMCSurface *future_surface,
- const XvMCMpegControl *control);
- Status (*load_qmatrix)(Display *display, XvMCContext *context,
- const XvMCQMatrix *qmx);
- Status (*put_slice)(Display *display, XvMCContext *context,
- unsigned char *slice, int bytes);
- Status (*put_slice2)(Display *display, XvMCContext *context,
- unsigned char *slice, int bytes, int slice_code);
-
+ int type; /* hw xvmc type - i830_hwmc.h */
+ int screen; /* current screen num */
+
+ int fd; /* drm file handler */
+
+ dri_bufmgr *bufmgr;
+ unsigned int kernel_exec_fencing:1;
+
+ struct {
+ unsigned int init_offset;
+ unsigned int size;
+ unsigned int space;
+ unsigned char *ptr;
+ unsigned char *init_ptr;
+ dri_bo *buf;
+ } batch;
+
+ struct {
+ void *ptr;
+ unsigned int size;
+ unsigned int offset;
+ unsigned int active_buf;
+ unsigned int irq_emitted;
+ } alloc;
+ intel_xvmc_drm_map_t batchbuffer;
+ unsigned int last_render;
+
+ sigset_t sa_mask;
+ pthread_mutex_t ctxmutex;
+ int locked;
+
+ int num_ctx;
+ intel_xvmc_context_ptr ctx_list;
+ int num_surf;
+ intel_xvmc_surface_ptr surf_list;
+
+ void *private;
+
+ /* driver specific xvmc callbacks */
+ Status(*create_context) (Display * display, XvMCContext * context,
+ int priv_count, CARD32 * priv_data);
+
+ Status(*destroy_context) (Display * display, XvMCContext * context);
+
+ Status(*create_surface) (Display * display, XvMCContext * context,
+ XvMCSurface * surface, int priv_count,
+ CARD32 * priv_data);
+
+ Status(*destroy_surface) (Display * display, XvMCSurface * surface);
+
+ Status(*render_surface) (Display * display, XvMCContext * context,
+ unsigned int picture_structure,
+ XvMCSurface * target_surface,
+ XvMCSurface * past_surface,
+ XvMCSurface * future_surface,
+ unsigned int flags,
+ unsigned int num_macroblocks,
+ unsigned int first_macroblock,
+ XvMCMacroBlockArray * macroblock_array,
+ XvMCBlockArray * blocks);
+
+ Status(*put_surface) (Display * display, XvMCSurface * surface,
+ Drawable draw, short srcx, short srcy,
+ unsigned short srcw, unsigned short srch,
+ short destx, short desty,
+ unsigned short destw, unsigned short desth,
+ int flags, struct intel_xvmc_command * data);
+
+ Status(*get_surface_status) (Display * display, XvMCSurface * surface,
+ int *stat);
+
+ Status(*begin_surface) (Display * display, XvMCContext * context,
+ XvMCSurface * target_surface,
+ XvMCSurface * past_surface,
+ XvMCSurface * future_surface,
+ const XvMCMpegControl * control);
+ Status(*load_qmatrix) (Display * display, XvMCContext * context,
+ const XvMCQMatrix * qmx);
+ Status(*put_slice) (Display * display, XvMCContext * context,
+ unsigned char *slice, int bytes);
+ Status(*put_slice2) (Display * display, XvMCContext * context,
+ unsigned char *slice, int bytes, int slice_code);
+
} intel_xvmc_driver_t, *intel_xvmc_driver_ptr;
extern struct _intel_xvmc_driver i915_xvmc_mc_driver;
@@ -243,20 +244,20 @@ extern struct _intel_xvmc_driver *xvmc_driver;
extern void LOCK_HARDWARE(drm_context_t);
extern void UNLOCK_HARDWARE(drm_context_t);
-static inline const char* intel_xvmc_decoder_string(int flag)
+static inline const char *intel_xvmc_decoder_string(int flag)
{
- switch (flag) {
+ switch (flag) {
case XVMC_I915_MPEG2_MC:
- return "i915/945 MPEG2 MC decoder";
+ return "i915/945 MPEG2 MC decoder";
case XVMC_I965_MPEG2_MC:
- return "i965 MPEG2 MC decoder";
+ return "i965 MPEG2 MC decoder";
case XVMC_I945_MPEG2_VLD:
- return "i945 MPEG2 VLD decoder";
+ return "i945 MPEG2 VLD decoder";
case XVMC_I965_MPEG2_VLD:
- return "i965 MPEG2 VLD decoder";
+ return "i965 MPEG2 VLD decoder";
default:
- return "Unknown decoder";
- }
+ return "Unknown decoder";
+ }
}
extern intel_xvmc_context_ptr intel_xvmc_find_context(XID id);
@@ -267,12 +268,16 @@ extern unsigned int mb_bytes_420[64];
/* dump function */
extern void intel_xvmc_dump_open(void);
extern void intel_xvmc_dump_close(void);
-extern void intel_xvmc_dump_render(XvMCContext *context, unsigned int picture_structure,
- XvMCSurface *target_surface, XvMCSurface *past_surface,
- XvMCSurface *future_surface, unsigned int flags,
- unsigned int num_macroblocks, unsigned int first_macroblock,
- XvMCMacroBlockArray *macroblock_array, XvMCBlockArray *blocks);
-
+extern void intel_xvmc_dump_render(XvMCContext * context,
+ unsigned int picture_structure,
+ XvMCSurface * target_surface,
+ XvMCSurface * past_surface,
+ XvMCSurface * future_surface,
+ unsigned int flags,
+ unsigned int num_macroblocks,
+ unsigned int first_macroblock,
+ XvMCMacroBlockArray * macroblock_array,
+ XvMCBlockArray * blocks);
#define VFE_GENERIC_MODE 0x0
#define VFE_VLD_MODE 0x1
diff --git a/src/xvmc/intel_xvmc_dump.c b/src/xvmc/intel_xvmc_dump.c
index 419bd0d8..015d4828 100644
--- a/src/xvmc/intel_xvmc_dump.c
+++ b/src/xvmc/intel_xvmc_dump.c
@@ -33,117 +33,126 @@ static FILE *fp = NULL;
void intel_xvmc_dump_open(void)
{
- char *d = NULL;
+ char *d = NULL;
- if (xvmc_dump)
- return;
+ if (xvmc_dump)
+ return;
- if (d = getenv("INTEL_XVMC_DUMP"))
- xvmc_dump = 1;
+ if (d = getenv("INTEL_XVMC_DUMP"))
+ xvmc_dump = 1;
- if (xvmc_dump) {
- fp = fopen(DUMPFILE, "a");
- if (!fp)
- xvmc_dump = 0;
- }
+ if (xvmc_dump) {
+ fp = fopen(DUMPFILE, "a");
+ if (!fp)
+ xvmc_dump = 0;
+ }
}
void intel_xvmc_dump_close(void)
{
- if (xvmc_dump) {
- fclose(fp);
- xvmc_dump = 0;
- }
+ if (xvmc_dump) {
+ fclose(fp);
+ xvmc_dump = 0;
+ }
}
-void intel_xvmc_dump_render(XvMCContext *context, unsigned int picture_structure,
- XvMCSurface *target, XvMCSurface *past, XvMCSurface *future, unsigned int flags,
- unsigned int num_macroblocks, unsigned int first_macroblock,
- XvMCMacroBlockArray *macroblock_array, XvMCBlockArray *blocks)
+void intel_xvmc_dump_render(XvMCContext * context,
+ unsigned int picture_structure,
+ XvMCSurface * target, XvMCSurface * past,
+ XvMCSurface * future, unsigned int flags,
+ unsigned int num_macroblocks,
+ unsigned int first_macroblock,
+ XvMCMacroBlockArray * macroblock_array,
+ XvMCBlockArray * blocks)
{
- int i;
- XvMCMacroBlock *mb;
-
- if (!xvmc_dump)
- return;
-
- fprintf(fp, "========== new surface rendering ==========\n");
- fprintf(fp, "Context (id:%d) (surface_type_id:%d) (width:%d) (height:%d)\n",
- context->context_id, context->surface_type_id, context->width, context->height);
-
- if (picture_structure == XVMC_FRAME_PICTURE)
- fprintf(fp, "picture structure: frame picture\n");
- else if (picture_structure == XVMC_TOP_FIELD)
- fprintf(fp, "picture structure: top field picture (%s)\n",
- (flags == XVMC_SECOND_FIELD)?"second":"first");
- else if (picture_structure == XVMC_BOTTOM_FIELD)
- fprintf(fp, "picture structure: bottom field picture (%s)\n",
- (flags == XVMC_SECOND_FIELD)?"second":"first");
-
- if (!past && !future)
- fprintf(fp, "picture type: I\n");
- else if (past && !future)
- fprintf(fp, "picture type: P\n");
- else if (past && future)
- fprintf(fp, "picture type: B\n");
- else
- fprintf(fp, "picture type: Bad!\n");
-
- fprintf(fp, "target picture: id (%d) width (%d) height (%d)\n", target->surface_id,
- target->width, target->height);
- if (past)
- fprintf(fp, "past picture: id (%d) width (%d) height (%d)\n", past->surface_id,
- past->width, past->height);
- if (future)
- fprintf(fp, "future picture: id (%d) width (%d) height (%d)\n", future->surface_id,
- future->width, future->height);
-
- fprintf(fp, "num macroblocks: %d, first macroblocks %d\n", num_macroblocks, first_macroblock);
-
- for (i = first_macroblock; i < (first_macroblock + num_macroblocks); i++) {
- mb = &macroblock_array->macro_blocks[i];
-
- fprintf(fp, "- MB(%d): ", i);
- fprintf(fp, "x (%d) y (%d) ", mb->x, mb->y);
- fprintf(fp, "macroblock type (");
- if (mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD)
- fprintf(fp, "motion_forward ");
- if (mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD)
- fprintf(fp, "motion_backward ");
- if (mb->macroblock_type & XVMC_MB_TYPE_PATTERN)
- fprintf(fp, "pattern ");
- if (mb->macroblock_type & XVMC_MB_TYPE_INTRA)
- fprintf(fp, "intra ");
- fprintf(fp, ") ");
- fprintf(fp, "mc type ");
- if (picture_structure == XVMC_FRAME_PICTURE) {
- if (mb->motion_type & XVMC_PREDICTION_FIELD)
- fprintf(fp, "(field) ");
- else if (mb->motion_type & XVMC_PREDICTION_FRAME)
- fprintf(fp, "(frame) ");
- else if (mb->motion_type & XVMC_PREDICTION_DUAL_PRIME)
- fprintf(fp, "(dual-prime) ");
- else
- fprintf(fp, "(unknown %d) ", mb->motion_type);
- } else { /* field */
- if (mb->motion_type & XVMC_PREDICTION_FIELD)
- fprintf(fp, "(field) ");
- else if (mb->motion_type & XVMC_PREDICTION_DUAL_PRIME)
- fprintf(fp, "(dual-prime) ");
- else if (mb->motion_type & XVMC_PREDICTION_16x8)
- fprintf(fp, "(16x8) ");
- else
- fprintf(fp, "(unknown %d) ", mb->motion_type);
+ int i;
+ XvMCMacroBlock *mb;
+
+ if (!xvmc_dump)
+ return;
+
+ fprintf(fp, "========== new surface rendering ==========\n");
+ fprintf(fp,
+ "Context (id:%d) (surface_type_id:%d) (width:%d) (height:%d)\n",
+ context->context_id, context->surface_type_id, context->width,
+ context->height);
+
+ if (picture_structure == XVMC_FRAME_PICTURE)
+ fprintf(fp, "picture structure: frame picture\n");
+ else if (picture_structure == XVMC_TOP_FIELD)
+ fprintf(fp, "picture structure: top field picture (%s)\n",
+ (flags == XVMC_SECOND_FIELD) ? "second" : "first");
+ else if (picture_structure == XVMC_BOTTOM_FIELD)
+ fprintf(fp, "picture structure: bottom field picture (%s)\n",
+ (flags == XVMC_SECOND_FIELD) ? "second" : "first");
+
+ if (!past && !future)
+ fprintf(fp, "picture type: I\n");
+ else if (past && !future)
+ fprintf(fp, "picture type: P\n");
+ else if (past && future)
+ fprintf(fp, "picture type: B\n");
+ else
+ fprintf(fp, "picture type: Bad!\n");
+
+ fprintf(fp, "target picture: id (%d) width (%d) height (%d)\n",
+ target->surface_id, target->width, target->height);
+ if (past)
+ fprintf(fp, "past picture: id (%d) width (%d) height (%d)\n",
+ past->surface_id, past->width, past->height);
+ if (future)
+ fprintf(fp, "future picture: id (%d) width (%d) height (%d)\n",
+ future->surface_id, future->width, future->height);
+
+ fprintf(fp, "num macroblocks: %d, first macroblocks %d\n",
+ num_macroblocks, first_macroblock);
+
+ for (i = first_macroblock; i < (first_macroblock + num_macroblocks);
+ i++) {
+ mb = &macroblock_array->macro_blocks[i];
+
+ fprintf(fp, "- MB(%d): ", i);
+ fprintf(fp, "x (%d) y (%d) ", mb->x, mb->y);
+ fprintf(fp, "macroblock type (");
+ if (mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD)
+ fprintf(fp, "motion_forward ");
+ if (mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD)
+ fprintf(fp, "motion_backward ");
+ if (mb->macroblock_type & XVMC_MB_TYPE_PATTERN)
+ fprintf(fp, "pattern ");
+ if (mb->macroblock_type & XVMC_MB_TYPE_INTRA)
+ fprintf(fp, "intra ");
+ fprintf(fp, ") ");
+ fprintf(fp, "mc type ");
+ if (picture_structure == XVMC_FRAME_PICTURE) {
+ if (mb->motion_type & XVMC_PREDICTION_FIELD)
+ fprintf(fp, "(field) ");
+ else if (mb->motion_type & XVMC_PREDICTION_FRAME)
+ fprintf(fp, "(frame) ");
+ else if (mb->motion_type & XVMC_PREDICTION_DUAL_PRIME)
+ fprintf(fp, "(dual-prime) ");
+ else
+ fprintf(fp, "(unknown %d) ", mb->motion_type);
+ } else { /* field */
+ if (mb->motion_type & XVMC_PREDICTION_FIELD)
+ fprintf(fp, "(field) ");
+ else if (mb->motion_type & XVMC_PREDICTION_DUAL_PRIME)
+ fprintf(fp, "(dual-prime) ");
+ else if (mb->motion_type & XVMC_PREDICTION_16x8)
+ fprintf(fp, "(16x8) ");
+ else
+ fprintf(fp, "(unknown %d) ", mb->motion_type);
+ }
+
+ if (mb->dct_type == XVMC_DCT_TYPE_FRAME)
+ fprintf(fp, "dct type (frame) ");
+ else if (mb->dct_type == XVMC_DCT_TYPE_FIELD)
+ fprintf(fp, "dct type (field) ");
+
+ fprintf(fp, "coded_block_pattern (0x%x)\n",
+ mb->coded_block_pattern);
+
+ /* XXX mv dump */
}
- if (mb->dct_type == XVMC_DCT_TYPE_FRAME)
- fprintf(fp, "dct type (frame) ");
- else if (mb->dct_type == XVMC_DCT_TYPE_FIELD)
- fprintf(fp, "dct type (field) ");
-
- fprintf(fp, "coded_block_pattern (0x%x)\n", mb->coded_block_pattern);
-
- /* XXX mv dump */
- }
-
}
diff --git a/src/xvmc/xvmc_vld.c b/src/xvmc/xvmc_vld.c
index d964fc1b..dca05737 100644
--- a/src/xvmc/xvmc_vld.c
+++ b/src/xvmc/xvmc_vld.c
@@ -47,246 +47,307 @@
#define C6 8867
#define C7 4520
const uint32_t idct_table[] = {
- C4, C1, C2, C3, C4, C5, C6, C7, //g5
- C4, C1, C2, C3, C4, C5, C6, C7,
- C4, C3, C6,-C7,-C4,-C1,-C2,-C5,
- C4, C3, C6,-C7,-C4,-C1,-C2,-C5,
- C4, C5,-C6,-C1,-C4, C7, C2, C3,
- C4, C5,-C6,-C1,-C4, C7, C2, C3,
- C4, C7,-C2,-C5, C4, C3,-C6,-C1,
- C4, C7,-C2,-C5, C4, C3,-C6,-C1,
- C4,-C7,-C2, C5, C4,-C3,-C6, C1,
- C4,-C7,-C2, C5, C4,-C3,-C6, C1,
- C4,-C5,-C6, C1,-C4,-C7, C2,-C3,
- C4,-C5,-C6, C1,-C4,-C7, C2,-C3,
- C4,-C3, C6, C7,-C4, C1,-C2, C5,
- C4,-C3, C6, C7,-C4, C1,-C2, C5,
- C4,-C1, C2,-C3, C4,-C5, C6,-C7,
- C4,-C1, C2,-C3, C4,-C5, C6,-C7 //g20
+ C4, C1, C2, C3, C4, C5, C6, C7, //g5
+ C4, C1, C2, C3, C4, C5, C6, C7,
+ C4, C3, C6, -C7, -C4, -C1, -C2, -C5,
+ C4, C3, C6, -C7, -C4, -C1, -C2, -C5,
+ C4, C5, -C6, -C1, -C4, C7, C2, C3,
+ C4, C5, -C6, -C1, -C4, C7, C2, C3,
+ C4, C7, -C2, -C5, C4, C3, -C6, -C1,
+ C4, C7, -C2, -C5, C4, C3, -C6, -C1,
+ C4, -C7, -C2, C5, C4, -C3, -C6, C1,
+ C4, -C7, -C2, C5, C4, -C3, -C6, C1,
+ C4, -C5, -C6, C1, -C4, -C7, C2, -C3,
+ C4, -C5, -C6, C1, -C4, -C7, C2, -C3,
+ C4, -C3, C6, C7, -C4, C1, -C2, C5,
+ C4, -C3, C6, C7, -C4, C1, -C2, C5,
+ C4, -C1, C2, -C3, C4, -C5, C6, -C7,
+ C4, -C1, C2, -C3, C4, -C5, C6, -C7 //g20
};
-#undef C0
-#undef C1
-#undef C2
-#undef C3
-#undef C4
-#undef C5
-#undef C6
-#undef C7
+
+#undef C0
+#undef C1
+#undef C2
+#undef C3
+#undef C4
+#undef C5
+#undef C6
+#undef C7
#define INTERFACE_NUM 8
enum interface {
- FRAME_INTRA = 0,
+ FRAME_INTRA = 0,
FRAME_FRAME_PRED_FORWARD,
FRAME_FRAME_PRED_BACKWARD,
FRAME_FRAME_PRED_BIDIRECT,
FRAME_FIELD_PRED_FORWARD,
FRAME_FIELD_PRED_BACKWARD,
FRAME_FIELD_PRED_BIDIRECT,
- LIB_INTERFACE
+ LIB_INTERFACE
};
/*kernels for vld mode*/
static uint32_t lib_kernel[][4] = {
- #include "shader/vld/lib.g4b"
+#include "shader/vld/lib.g4b"
};
+
static uint32_t ipicture_kernel[][4] = {
- #include "shader/vld/ipicture.g4b"
+#include "shader/vld/ipicture.g4b"
};
+
static uint32_t frame_forward_kernel[][4] = {
- #include "shader/vld/frame_forward.g4b"
+#include "shader/vld/frame_forward.g4b"
};
+
static uint32_t frame_backward_kernel[][4] = {
- #include "shader/vld/frame_backward.g4b"
+#include "shader/vld/frame_backward.g4b"
};
+
static uint32_t frame_f_b_kernel[][4] = {
- #include "shader/vld/frame_f_b.g4b"
+#include "shader/vld/frame_f_b.g4b"
};
+
static uint32_t field_forward_kernel[][4] = {
- #include "shader/vld/field_forward.g4b"
+#include "shader/vld/field_forward.g4b"
};
+
static uint32_t field_backward_kernel[][4] = {
- #include "shader/vld/field_backward.g4b"
+#include "shader/vld/field_backward.g4b"
};
+
static uint32_t field_f_b_kernel[][4] = {
- #include "shader/vld/field_f_b.g4b"
+#include "shader/vld/field_f_b.g4b"
};
/* on IGDNG */
static uint32_t lib_kernel_gen5[][4] = {
- #include "shader/vld/lib.g4b.gen5"
+#include "shader/vld/lib.g4b.gen5"
};
+
static uint32_t ipicture_kernel_gen5[][4] = {
- #include "shader/vld/ipicture.g4b.gen5"
+#include "shader/vld/ipicture.g4b.gen5"
};
+
static uint32_t frame_forward_kernel_gen5[][4] = {
- #include "shader/vld/frame_forward.g4b.gen5"
+#include "shader/vld/frame_forward.g4b.gen5"
};
+
static uint32_t frame_backward_kernel_gen5[][4] = {
- #include "shader/vld/frame_backward.g4b.gen5"
+#include "shader/vld/frame_backward.g4b.gen5"
};
+
static uint32_t frame_f_b_kernel_gen5[][4] = {
- #include "shader/vld/frame_f_b.g4b.gen5"
+#include "shader/vld/frame_f_b.g4b.gen5"
};
+
static uint32_t field_forward_kernel_gen5[][4] = {
- #include "shader/vld/field_forward.g4b.gen5"
+#include "shader/vld/field_forward.g4b.gen5"
};
+
static uint32_t field_backward_kernel_gen5[][4] = {
- #include "shader/vld/field_backward.g4b.gen5"
+#include "shader/vld/field_backward.g4b.gen5"
};
+
static uint32_t field_f_b_kernel_gen5[][4] = {
- #include "shader/vld/field_f_b.g4b.gen5"
+#include "shader/vld/field_f_b.g4b.gen5"
};
/*kernels for mc mode*/
static uint32_t lib_kernel_idct[][4] = {
- #include "shader/mc/lib_igd.g4b"
+#include "shader/mc/lib_igd.g4b"
};
+
static uint32_t ipicture_kernel_idct[][4] = {
- #include "shader/mc/ipicture_igd.g4b"
+#include "shader/mc/ipicture_igd.g4b"
};
+
static uint32_t frame_forward_kernel_idct[][4] = {
- #include "shader/mc/frame_forward_igd.g4b"
+#include "shader/mc/frame_forward_igd.g4b"
};
+
static uint32_t frame_backward_kernel_idct[][4] = {
- #include "shader/mc/frame_backward_igd.g4b"
+#include "shader/mc/frame_backward_igd.g4b"
};
+
static uint32_t frame_f_b_kernel_idct[][4] = {
- #include "shader/mc/frame_f_b_igd.g4b"
+#include "shader/mc/frame_f_b_igd.g4b"
};
+
static uint32_t field_forward_kernel_idct[][4] = {
- #include "shader/mc/field_forward_igd.g4b"
+#include "shader/mc/field_forward_igd.g4b"
};
+
static uint32_t field_backward_kernel_idct[][4] = {
- #include "shader/mc/field_backward_igd.g4b"
+#include "shader/mc/field_backward_igd.g4b"
};
+
static uint32_t field_f_b_kernel_idct[][4] = {
- #include "shader/mc/field_f_b_igd.g4b"
+#include "shader/mc/field_f_b_igd.g4b"
};
/* on IGDNG */
static uint32_t lib_kernel_idct_gen5[][4] = {
- #include "shader/mc/lib_igd.g4b.gen5"
+#include "shader/mc/lib_igd.g4b.gen5"
};
+
static uint32_t ipicture_kernel_idct_gen5[][4] = {
- #include "shader/mc/ipicture_igd.g4b.gen5"
+#include "shader/mc/ipicture_igd.g4b.gen5"
};
+
static uint32_t frame_forward_kernel_idct_gen5[][4] = {
- #include "shader/mc/frame_forward_igd.g4b.gen5"
+#include "shader/mc/frame_forward_igd.g4b.gen5"
};
+
static uint32_t frame_backward_kernel_idct_gen5[][4] = {
- #include "shader/mc/frame_backward_igd.g4b.gen5"
+#include "shader/mc/frame_backward_igd.g4b.gen5"
};
+
static uint32_t frame_f_b_kernel_idct_gen5[][4] = {
- #include "shader/mc/frame_f_b_igd.g4b.gen5"
+#include "shader/mc/frame_f_b_igd.g4b.gen5"
};
+
static uint32_t field_forward_kernel_idct_gen5[][4] = {
- #include "shader/mc/field_forward_igd.g4b.gen5"
+#include "shader/mc/field_forward_igd.g4b.gen5"
};
+
static uint32_t field_backward_kernel_idct_gen5[][4] = {
- #include "shader/mc/field_backward_igd.g4b.gen5"
+#include "shader/mc/field_backward_igd.g4b.gen5"
};
+
static uint32_t field_f_b_kernel_idct_gen5[][4] = {
- #include "shader/mc/field_f_b_igd.g4b.gen5"
+#include "shader/mc/field_f_b_igd.g4b.gen5"
};
struct media_kernel {
- uint32_t (*bin)[4];
- int size;
+ uint32_t(*bin)[4];
+ int size;
};
static struct media_kernel media_kernels[] = {
- /*kernels for vld mode*/
- {ipicture_kernel, sizeof(ipicture_kernel)},
- {frame_forward_kernel, sizeof(frame_forward_kernel)},
- {frame_backward_kernel, sizeof(frame_backward_kernel)},
- {frame_f_b_kernel, sizeof(frame_f_b_kernel)},
- {field_forward_kernel, sizeof(field_forward_kernel)},
- {field_backward_kernel, sizeof(field_backward_kernel)},
- {field_f_b_kernel, sizeof(field_f_b_kernel)},
- {lib_kernel, sizeof(lib_kernel)},
- /*kernels for mc mode*/
- {ipicture_kernel_idct, sizeof(ipicture_kernel_idct)},
- {frame_forward_kernel_idct, sizeof(frame_forward_kernel_idct)},
- {frame_backward_kernel_idct, sizeof(frame_backward_kernel_idct)},
- {frame_f_b_kernel_idct, sizeof(frame_f_b_kernel_idct)},
- {field_forward_kernel_idct, sizeof(field_forward_kernel_idct)},
- {field_backward_kernel_idct, sizeof(field_backward_kernel_idct)},
- {field_f_b_kernel_idct, sizeof(field_f_b_kernel_idct)},
- {lib_kernel_idct, sizeof(lib_kernel_idct)}
+ /*kernels for vld mode */
+ {ipicture_kernel, sizeof(ipicture_kernel)}
+ ,
+ {frame_forward_kernel, sizeof(frame_forward_kernel)}
+ ,
+ {frame_backward_kernel, sizeof(frame_backward_kernel)}
+ ,
+ {frame_f_b_kernel, sizeof(frame_f_b_kernel)}
+ ,
+ {field_forward_kernel, sizeof(field_forward_kernel)}
+ ,
+ {field_backward_kernel, sizeof(field_backward_kernel)}
+ ,
+ {field_f_b_kernel, sizeof(field_f_b_kernel)}
+ ,
+ {lib_kernel, sizeof(lib_kernel)}
+ ,
+ /*kernels for mc mode */
+ {ipicture_kernel_idct, sizeof(ipicture_kernel_idct)}
+ ,
+ {frame_forward_kernel_idct, sizeof(frame_forward_kernel_idct)}
+ ,
+ {frame_backward_kernel_idct, sizeof(frame_backward_kernel_idct)}
+ ,
+ {frame_f_b_kernel_idct, sizeof(frame_f_b_kernel_idct)}
+ ,
+ {field_forward_kernel_idct, sizeof(field_forward_kernel_idct)}
+ ,
+ {field_backward_kernel_idct, sizeof(field_backward_kernel_idct)}
+ ,
+ {field_f_b_kernel_idct, sizeof(field_f_b_kernel_idct)}
+ ,
+ {lib_kernel_idct, sizeof(lib_kernel_idct)}
};
static struct media_kernel media_gen5_kernels[] = {
- /*kernels for vld mode*/
- {ipicture_kernel_gen5, sizeof(ipicture_kernel_gen5)},
- {frame_forward_kernel_gen5, sizeof(frame_forward_kernel_gen5)},
- {frame_backward_kernel_gen5, sizeof(frame_backward_kernel_gen5)},
- {frame_f_b_kernel_gen5, sizeof(frame_f_b_kernel_gen5)},
- {field_forward_kernel_gen5, sizeof(field_forward_kernel_gen5)},
- {field_backward_kernel_gen5, sizeof(field_backward_kernel_gen5)},
- {field_f_b_kernel_gen5, sizeof(field_f_b_kernel_gen5)},
- {lib_kernel_gen5, sizeof(lib_kernel_gen5)},
- /*kernels for mc mode*/
- {ipicture_kernel_idct_gen5, sizeof(ipicture_kernel_idct_gen5)},
- {frame_forward_kernel_idct_gen5, sizeof(frame_forward_kernel_idct_gen5)},
- {frame_backward_kernel_idct_gen5, sizeof(frame_backward_kernel_idct_gen5)},
- {frame_f_b_kernel_idct_gen5, sizeof(frame_f_b_kernel_idct_gen5)},
- {field_forward_kernel_idct_gen5, sizeof(field_forward_kernel_idct_gen5)},
- {field_backward_kernel_idct_gen5, sizeof(field_backward_kernel_idct_gen5)},
- {field_f_b_kernel_idct_gen5, sizeof(field_f_b_kernel_idct_gen5)},
- {lib_kernel_idct_gen5, sizeof(lib_kernel_idct_gen5)}
+ /*kernels for vld mode */
+ {ipicture_kernel_gen5, sizeof(ipicture_kernel_gen5)}
+ ,
+ {frame_forward_kernel_gen5, sizeof(frame_forward_kernel_gen5)}
+ ,
+ {frame_backward_kernel_gen5, sizeof(frame_backward_kernel_gen5)}
+ ,
+ {frame_f_b_kernel_gen5, sizeof(frame_f_b_kernel_gen5)}
+ ,
+ {field_forward_kernel_gen5, sizeof(field_forward_kernel_gen5)}
+ ,
+ {field_backward_kernel_gen5, sizeof(field_backward_kernel_gen5)}
+ ,
+ {field_f_b_kernel_gen5, sizeof(field_f_b_kernel_gen5)}
+ ,
+ {lib_kernel_gen5, sizeof(lib_kernel_gen5)}
+ ,
+ /*kernels for mc mode */
+ {ipicture_kernel_idct_gen5, sizeof(ipicture_kernel_idct_gen5)}
+ ,
+ {frame_forward_kernel_idct_gen5, sizeof(frame_forward_kernel_idct_gen5)}
+ ,
+ {frame_backward_kernel_idct_gen5,
+ sizeof(frame_backward_kernel_idct_gen5)}
+ ,
+ {frame_f_b_kernel_idct_gen5, sizeof(frame_f_b_kernel_idct_gen5)}
+ ,
+ {field_forward_kernel_idct_gen5, sizeof(field_forward_kernel_idct_gen5)}
+ ,
+ {field_backward_kernel_idct_gen5,
+ sizeof(field_backward_kernel_idct_gen5)}
+ ,
+ {field_f_b_kernel_idct_gen5, sizeof(field_f_b_kernel_idct_gen5)}
+ ,
+ {lib_kernel_idct_gen5, sizeof(lib_kernel_idct_gen5)}
};
#define MEDIA_KERNEL_NUM (sizeof(media_kernels)/sizeof(media_kernels[0]))
struct media_kernel_obj {
- dri_bo *bo;
+ dri_bo *bo;
};
struct interface_descriptor_obj {
- dri_bo *bo;
- struct media_kernel_obj kernels[MEDIA_KERNEL_NUM];
+ dri_bo *bo;
+ struct media_kernel_obj kernels[MEDIA_KERNEL_NUM];
};
struct vfe_state_obj {
- dri_bo *bo;
- struct interface_descriptor_obj interface;
+ dri_bo *bo;
+ struct interface_descriptor_obj interface;
};
struct vld_state_obj {
- dri_bo *bo;
+ dri_bo *bo;
};
struct surface_obj {
- dri_bo *bo;
+ dri_bo *bo;
};
struct surface_state_obj {
- struct surface_obj surface;
- dri_bo *bo;
+ struct surface_obj surface;
+ dri_bo *bo;
};
struct binding_table_obj {
- dri_bo *bo;
- struct surface_state_obj surface_states[I965_MAX_SURFACES];
+ dri_bo *bo;
+ struct surface_state_obj surface_states[I965_MAX_SURFACES];
};
struct slice_data_obj {
- dri_bo *bo;
+ dri_bo *bo;
};
struct mb_data_obj {
- dri_bo *bo;
+ dri_bo *bo;
};
struct cs_state_obj {
- dri_bo *bo;
+ dri_bo *bo;
};
static struct media_state {
- struct vfe_state_obj vfe_state;
- struct vld_state_obj vld_state;
- struct binding_table_obj binding_table;
- struct cs_state_obj cs_object;
- struct slice_data_obj slice_data;
+ struct vfe_state_obj vfe_state;
+ struct vld_state_obj vld_state;
+ struct binding_table_obj binding_table;
+ struct cs_state_obj cs_object;
+ struct slice_data_obj slice_data;
struct mb_data_obj mb_data;
} media_state;
@@ -294,48 +355,49 @@ static struct media_state {
#define CS_OBJECT_SIZE (32*20 + sizeof(unsigned int) * 8)
static int free_object(struct media_state *s)
{
- int i;
+ int i;
#define FREE_ONE_BO(bo) \
if (bo) \
drm_intel_bo_unreference(bo)
- FREE_ONE_BO(s->vfe_state.bo);
- FREE_ONE_BO(s->vfe_state.interface.bo);
- for (i = 0; i < MEDIA_KERNEL_NUM; i++)
- FREE_ONE_BO(s->vfe_state.interface.kernels[i].bo);
- FREE_ONE_BO(s->binding_table.bo);
- for (i = 0; i < I965_MAX_SURFACES; i++)
- FREE_ONE_BO(s->binding_table.surface_states[i].bo);
- FREE_ONE_BO(s->slice_data.bo);
- FREE_ONE_BO(s->mb_data.bo);
- FREE_ONE_BO(s->cs_object.bo);
- FREE_ONE_BO(s->vld_state.bo);
+ FREE_ONE_BO(s->vfe_state.bo);
+ FREE_ONE_BO(s->vfe_state.interface.bo);
+ for (i = 0; i < MEDIA_KERNEL_NUM; i++)
+ FREE_ONE_BO(s->vfe_state.interface.kernels[i].bo);
+ FREE_ONE_BO(s->binding_table.bo);
+ for (i = 0; i < I965_MAX_SURFACES; i++)
+ FREE_ONE_BO(s->binding_table.surface_states[i].bo);
+ FREE_ONE_BO(s->slice_data.bo);
+ FREE_ONE_BO(s->mb_data.bo);
+ FREE_ONE_BO(s->cs_object.bo);
+ FREE_ONE_BO(s->vld_state.bo);
}
static int alloc_object(struct media_state *s)
{
- int i;
-
- for (i = 0; i < I965_MAX_SURFACES; i++) {
- s->binding_table.surface_states[i].bo =
- drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface_state",
- sizeof(struct brw_surface_state), 0x1000);
- if (!s->binding_table.surface_states[i].bo)
- goto out;
- }
- return 0;
+ int i;
+
+ for (i = 0; i < I965_MAX_SURFACES; i++) {
+ s->binding_table.surface_states[i].bo =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface_state",
+ sizeof(struct brw_surface_state),
+ 0x1000);
+ if (!s->binding_table.surface_states[i].bo)
+ goto out;
+ }
+ return 0;
out:
- free_object(s);
- return BadAlloc;
+ free_object(s);
+ return BadAlloc;
}
static void flush()
{
-#define FLUSH_STATE_CACHE 1
- struct brw_mi_flush f;
- memset(&f, 0, sizeof(f));
- f.opcode = CMD_MI_FLUSH;
- f.flags = (1<<FLUSH_STATE_CACHE);
- BATCH_STRUCT(f);
+#define FLUSH_STATE_CACHE 1
+ struct brw_mi_flush f;
+ memset(&f, 0, sizeof(f));
+ f.opcode = CMD_MI_FLUSH;
+ f.flags = (1 << FLUSH_STATE_CACHE);
+ BATCH_STRUCT(f);
}
static Status vfe_state(int vfe_mode)
@@ -345,7 +407,7 @@ static Status vfe_state(int vfe_mode)
if (vfe_mode == VFE_VLD_MODE) {
vfe_state->vfe0.extend_vfe_state_present = 1;
} else {
- vfe_state->vfe0.extend_vfe_state_present = 0;
+ vfe_state->vfe0.extend_vfe_state_present = 0;
}
vfe_state->vfe1.vfe_mode = vfe_mode;
vfe_state->vfe1.num_urb_entries = 1;
@@ -353,793 +415,868 @@ static Status vfe_state(int vfe_mode)
vfe_state->vfe1.urb_entry_alloc_size = 2;
vfe_state->vfe1.max_threads = 31;
vfe_state->vfe2.interface_descriptor_base =
- media_state.vfe_state.interface.bo->offset >> 4;
+ media_state.vfe_state.interface.bo->offset >> 4;
- if (media_state.vfe_state.bo)
- drm_intel_bo_unreference(media_state.vfe_state.bo);
+ if (media_state.vfe_state.bo)
+ drm_intel_bo_unreference(media_state.vfe_state.bo);
- media_state.vfe_state.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
- "vfe state", sizeof(struct brw_vfe_state), 0x1000);
- if (!media_state.vfe_state.bo)
- return BadAlloc;
+ media_state.vfe_state.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
+ "vfe state",
+ sizeof(struct
+ brw_vfe_state),
+ 0x1000);
+ if (!media_state.vfe_state.bo)
+ return BadAlloc;
- drm_intel_bo_subdata(media_state.vfe_state.bo, 0, sizeof(tmp), &tmp);
+ drm_intel_bo_subdata(media_state.vfe_state.bo, 0, sizeof(tmp), &tmp);
- drm_intel_bo_emit_reloc(media_state.vfe_state.bo,
- offsetof(struct brw_vfe_state, vfe2),
- media_state.vfe_state.interface.bo, 0,
- I915_GEM_DOMAIN_INSTRUCTION, 0);
- return Success;
+ drm_intel_bo_emit_reloc(media_state.vfe_state.bo,
+ offsetof(struct brw_vfe_state, vfe2),
+ media_state.vfe_state.interface.bo, 0,
+ I915_GEM_DOMAIN_INSTRUCTION, 0);
+ return Success;
}
static Status interface_descriptor()
{
- int i;
- struct brw_interface_descriptor tmp, *desc = &tmp;
+ int i;
+ struct brw_interface_descriptor tmp, *desc = &tmp;
- if (media_state.vfe_state.interface.bo)
- drm_intel_bo_unreference(media_state.vfe_state.interface.bo);
+ if (media_state.vfe_state.interface.bo)
+ drm_intel_bo_unreference(media_state.vfe_state.interface.bo);
- media_state.vfe_state.interface.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
- "interfaces", MEDIA_KERNEL_NUM*sizeof(struct brw_interface_descriptor),
- 0x1000);
- if (!media_state.vfe_state.interface.bo)
- return BadAlloc;
+ media_state.vfe_state.interface.bo =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "interfaces",
+ MEDIA_KERNEL_NUM *
+ sizeof(struct brw_interface_descriptor), 0x1000);
+ if (!media_state.vfe_state.interface.bo)
+ return BadAlloc;
- for (i = 0; i < MEDIA_KERNEL_NUM; i++) {
+ for (i = 0; i < MEDIA_KERNEL_NUM; i++) {
memset(desc, 0, sizeof(*desc));
desc->desc0.grf_reg_blocks = 15;
desc->desc0.kernel_start_pointer =
- media_state.vfe_state.interface.kernels[i].bo->offset >> 6;
+ media_state.vfe_state.interface.kernels[i].bo->offset >> 6;
desc->desc1.const_urb_entry_read_offset = 0;
desc->desc1.const_urb_entry_read_len = 30;
desc->desc3.binding_table_entry_count = I965_MAX_SURFACES - 1;
desc->desc3.binding_table_pointer =
- media_state.binding_table.bo->offset >> 5;
-
- drm_intel_bo_subdata(media_state.vfe_state.interface.bo, i*sizeof(tmp), sizeof(tmp), desc);
-
- drm_intel_bo_emit_reloc(
- media_state.vfe_state.interface.bo,
- i * sizeof(*desc) +
- offsetof(struct brw_interface_descriptor, desc0),
- media_state.vfe_state.interface.kernels[i].bo,
- desc->desc0.grf_reg_blocks,
- I915_GEM_DOMAIN_INSTRUCTION, 0);
-
- drm_intel_bo_emit_reloc(
- media_state.vfe_state.interface.bo,
- i * sizeof(*desc) +
- offsetof(struct brw_interface_descriptor, desc3),
- media_state.binding_table.bo,
- desc->desc3.binding_table_entry_count,
- I915_GEM_DOMAIN_INSTRUCTION, 0);
- }
- return Success;
+ media_state.binding_table.bo->offset >> 5;
+
+ drm_intel_bo_subdata(media_state.vfe_state.interface.bo,
+ i * sizeof(tmp), sizeof(tmp), desc);
+
+ drm_intel_bo_emit_reloc(media_state.vfe_state.interface.bo,
+ i * sizeof(*desc) + offsetof(struct
+ brw_interface_descriptor,
+ desc0),
+ media_state.vfe_state.
+ interface.kernels[i].bo,
+ desc->desc0.grf_reg_blocks,
+ I915_GEM_DOMAIN_INSTRUCTION, 0);
+
+ drm_intel_bo_emit_reloc(media_state.vfe_state.interface.bo,
+ i * sizeof(*desc) + offsetof(struct
+ brw_interface_descriptor,
+ desc3),
+ media_state.binding_table.bo,
+ desc->desc3.binding_table_entry_count,
+ I915_GEM_DOMAIN_INSTRUCTION, 0);
+ }
+ return Success;
}
static int setup_media_kernels(struct i965_xvmc_context *i965_ctx)
{
- int i;
-
- assert(MEDIA_KERNEL_NUM == sizeof(media_gen5_kernels) / sizeof(media_gen5_kernels[0]));
-
- for (i = 0; i < MEDIA_KERNEL_NUM; i++) {
- if (i965_ctx->is_igdng)
- media_state.vfe_state.interface.kernels[i].bo =
- drm_intel_bo_alloc(xvmc_driver->bufmgr, "kernel",
- media_gen5_kernels[i].size, 0x1000);
- else
- media_state.vfe_state.interface.kernels[i].bo =
- drm_intel_bo_alloc(xvmc_driver->bufmgr, "kernels",
- media_kernels[i].size, 0x1000);
-
- if (!media_state.vfe_state.interface.kernels[i].bo)
- goto out;
- }
-
- for (i = 0; i < MEDIA_KERNEL_NUM; i++) {
- dri_bo *bo = media_state.vfe_state.interface.kernels[i].bo;
-
- if (i965_ctx->is_igdng)
- drm_intel_bo_subdata(bo, 0, media_gen5_kernels[i].size, media_gen5_kernels[i].bin);
- else
- drm_intel_bo_subdata(bo, 0, media_kernels[i].size, media_kernels[i].bin);
- }
- return 0;
+ int i;
+
+ assert(MEDIA_KERNEL_NUM ==
+ sizeof(media_gen5_kernels) / sizeof(media_gen5_kernels[0]));
+
+ for (i = 0; i < MEDIA_KERNEL_NUM; i++) {
+ if (i965_ctx->is_igdng)
+ media_state.vfe_state.interface.kernels[i].bo =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "kernel",
+ media_gen5_kernels[i].size,
+ 0x1000);
+ else
+ media_state.vfe_state.interface.kernels[i].bo =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "kernels",
+ media_kernels[i].size, 0x1000);
+
+ if (!media_state.vfe_state.interface.kernels[i].bo)
+ goto out;
+ }
+
+ for (i = 0; i < MEDIA_KERNEL_NUM; i++) {
+ dri_bo *bo = media_state.vfe_state.interface.kernels[i].bo;
+
+ if (i965_ctx->is_igdng)
+ drm_intel_bo_subdata(bo, 0, media_gen5_kernels[i].size,
+ media_gen5_kernels[i].bin);
+ else
+ drm_intel_bo_subdata(bo, 0, media_kernels[i].size,
+ media_kernels[i].bin);
+ }
+ return 0;
out:
- free_object(&media_state);
- return BadAlloc;
+ free_object(&media_state);
+ return BadAlloc;
}
static Status binding_tables()
{
- unsigned int table[I965_MAX_SURFACES];
- int i;
-
- if (media_state.binding_table.bo)
- drm_intel_bo_unreference(media_state.binding_table.bo);
- media_state.binding_table.bo =
- drm_intel_bo_alloc(xvmc_driver->bufmgr, "binding_table",
- I965_MAX_SURFACES*4, 0x1000);
- if (!media_state.binding_table.bo)
- return BadAlloc;
-
- for (i = 0; i < I965_MAX_SURFACES; i++) {
- table[i] = media_state.binding_table.surface_states[i].bo->offset;
- drm_intel_bo_emit_reloc(media_state.binding_table.bo,
- i * sizeof(unsigned int),
- media_state.binding_table.surface_states[i].bo, 0,
- I915_GEM_DOMAIN_INSTRUCTION, 0);
- }
-
- drm_intel_bo_subdata(media_state.binding_table.bo, 0, sizeof(table), table);
- return Success;
+ unsigned int table[I965_MAX_SURFACES];
+ int i;
+
+ if (media_state.binding_table.bo)
+ drm_intel_bo_unreference(media_state.binding_table.bo);
+ media_state.binding_table.bo =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "binding_table",
+ I965_MAX_SURFACES * 4, 0x1000);
+ if (!media_state.binding_table.bo)
+ return BadAlloc;
+
+ for (i = 0; i < I965_MAX_SURFACES; i++) {
+ table[i] =
+ media_state.binding_table.surface_states[i].bo->offset;
+ drm_intel_bo_emit_reloc(media_state.binding_table.bo,
+ i * sizeof(unsigned int),
+ media_state.
+ binding_table.surface_states[i].bo, 0,
+ I915_GEM_DOMAIN_INSTRUCTION, 0);
+ }
+
+ drm_intel_bo_subdata(media_state.binding_table.bo, 0, sizeof(table),
+ table);
+ return Success;
}
static Status cs_init(int interface_offset)
{
- char buf[CS_OBJECT_SIZE];
- unsigned int *lib_reloc;
- int i;
-
- if (media_state.cs_object.bo)
- drm_intel_bo_unreference(media_state.cs_object.bo);
-
- media_state.cs_object.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr, "cs object", CS_OBJECT_SIZE, 64);
- if (!media_state.cs_object.bo)
- return BadAlloc;
-
- memcpy(buf + 32*4, idct_table, sizeof(idct_table));
- /* idct lib reloction */
- lib_reloc = (unsigned int *)(buf + 32*20);
- for (i = 0; i < 8; i++)
- lib_reloc[i] =
- media_state.vfe_state.interface.kernels[LIB_INTERFACE + interface_offset].bo->offset;
- drm_intel_bo_subdata(media_state.cs_object.bo, 32*4, 32*16 + 8*sizeof(unsigned int), buf + 32*4);
-
- for (i = 0; i < 8; i++)
- drm_intel_bo_emit_reloc(media_state.cs_object.bo,
- 32*20 + sizeof(unsigned int) * i,
- media_state.vfe_state.interface.kernels[LIB_INTERFACE + interface_offset].bo, 0,
- I915_GEM_DOMAIN_INSTRUCTION, 0);
-
- return Success;
+ char buf[CS_OBJECT_SIZE];
+ unsigned int *lib_reloc;
+ int i;
+
+ if (media_state.cs_object.bo)
+ drm_intel_bo_unreference(media_state.cs_object.bo);
+
+ media_state.cs_object.bo =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "cs object", CS_OBJECT_SIZE,
+ 64);
+ if (!media_state.cs_object.bo)
+ return BadAlloc;
+
+ memcpy(buf + 32 * 4, idct_table, sizeof(idct_table));
+ /* idct lib reloction */
+ lib_reloc = (unsigned int *)(buf + 32 * 20);
+ for (i = 0; i < 8; i++)
+ lib_reloc[i] =
+ media_state.vfe_state.interface.kernels[LIB_INTERFACE +
+ interface_offset].bo->
+ offset;
+ drm_intel_bo_subdata(media_state.cs_object.bo, 32 * 4,
+ 32 * 16 + 8 * sizeof(unsigned int), buf + 32 * 4);
+
+ for (i = 0; i < 8; i++)
+ drm_intel_bo_emit_reloc(media_state.cs_object.bo,
+ 32 * 20 + sizeof(unsigned int) * i,
+ media_state.vfe_state.
+ interface.kernels[LIB_INTERFACE +
+ interface_offset].bo,
+ 0, I915_GEM_DOMAIN_INSTRUCTION, 0);
+
+ return Success;
}
-static Status create_context(Display *display, XvMCContext *context,
- int priv_count, CARD32 *priv_data)
+static Status create_context(Display * display, XvMCContext * context,
+ int priv_count, CARD32 * priv_data)
{
- struct i965_xvmc_context *i965_ctx;
- i965_ctx = (struct i965_xvmc_context *)priv_data;
- context->privData = priv_data;
+ struct i965_xvmc_context *i965_ctx;
+ i965_ctx = (struct i965_xvmc_context *)priv_data;
+ context->privData = priv_data;
- if (alloc_object(&media_state))
- return BadAlloc;
+ if (alloc_object(&media_state))
+ return BadAlloc;
- if (setup_media_kernels(i965_ctx))
- return BadAlloc;
- return Success;
+ if (setup_media_kernels(i965_ctx))
+ return BadAlloc;
+ return Success;
}
-static Status destroy_context(Display *display, XvMCContext *context)
+static Status destroy_context(Display * display, XvMCContext * context)
{
- struct i965_xvmc_context *i965_ctx;
- i965_ctx = context->privData;
- Xfree(i965_ctx);
- return Success;
+ struct i965_xvmc_context *i965_ctx;
+ i965_ctx = context->privData;
+ Xfree(i965_ctx);
+ return Success;
}
#define STRIDE(w) (w)
#define SIZE_YUV420(w, h) (h * (STRIDE(w) + STRIDE(w >> 1)))
-static Status create_surface(Display *display,
- XvMCContext *context, XvMCSurface *surface, int priv_count,
- CARD32 *priv_data)
+static Status create_surface(Display * display,
+ XvMCContext * context, XvMCSurface * surface,
+ int priv_count, CARD32 * priv_data)
{
- struct i965_xvmc_surface *priv_surface =
- (struct i965_xvmc_surface *)priv_data;
- size_t size = SIZE_YUV420(priv_surface->w, priv_surface->h);
- surface->privData = priv_data;
- priv_surface->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface",
- size, 0x1000);
-
- return Success;
+ struct i965_xvmc_surface *priv_surface =
+ (struct i965_xvmc_surface *)priv_data;
+ size_t size = SIZE_YUV420(priv_surface->w, priv_surface->h);
+ surface->privData = priv_data;
+ priv_surface->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface",
+ size, 0x1000);
+
+ return Success;
}
-static Status destroy_surface(Display *display,
- XvMCSurface *surface)
+
+static Status destroy_surface(Display * display, XvMCSurface * surface)
{
- struct i965_xvmc_surface *priv_surface =
- surface->privData;
- XSync(display, False);
- drm_intel_bo_unreference(priv_surface->bo);
- return Success;
+ struct i965_xvmc_surface *priv_surface = surface->privData;
+ XSync(display, False);
+ drm_intel_bo_unreference(priv_surface->bo);
+ return Success;
}
-static Status load_qmatrix(Display *display, XvMCContext *context,
- const XvMCQMatrix *qmx)
+static Status load_qmatrix(Display * display, XvMCContext * context,
+ const XvMCQMatrix * qmx)
{
- Status ret;
- ret = cs_init(0);
- if (ret != Success)
- return ret;
- drm_intel_bo_subdata(media_state.cs_object.bo, 0, 64, qmx->intra_quantiser_matrix);
- drm_intel_bo_subdata(media_state.cs_object.bo, 64, 64, qmx->non_intra_quantiser_matrix);
-
- return Success;
+ Status ret;
+ ret = cs_init(0);
+ if (ret != Success)
+ return ret;
+ drm_intel_bo_subdata(media_state.cs_object.bo, 0, 64,
+ qmx->intra_quantiser_matrix);
+ drm_intel_bo_subdata(media_state.cs_object.bo, 64, 64,
+ qmx->non_intra_quantiser_matrix);
+
+ return Success;
}
-static Status get_surface_status(Display *display, XvMCSurface *surface,
- int *status)
+static Status get_surface_status(Display * display, XvMCSurface * surface,
+ int *status)
{
- *status = 0;
- return Success;
+ *status = 0;
+ return Success;
}
-static Status vld_state(const XvMCMpegControl *control)
+static Status vld_state(const XvMCMpegControl * control)
{
- struct brw_vld_state tmp, *vld = &tmp;
-
- if (media_state.vld_state.bo)
- drm_intel_bo_unreference(media_state.vld_state.bo);
- media_state.vld_state.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
- "vld state", sizeof(struct brw_vld_state), 64);
- if (!media_state.vld_state.bo)
- return BadAlloc;
-
- memset(vld, 0, sizeof(*vld));
- vld->vld0.f_code_0_0 = control->FHMV_range + 1;
- vld->vld0.f_code_0_1 = control->FVMV_range + 1;
- vld->vld0.f_code_1_0 = control->BHMV_range + 1;
- vld->vld0.f_code_1_1 = control->BVMV_range + 1;
- vld->vld0.intra_dc_precision = control->intra_dc_precision;
- vld->vld0.picture_structure = control->picture_structure;
- vld->vld0.top_field_first = !!(control->flags & XVMC_TOP_FIELD_FIRST);
- vld->vld0.frame_predict_frame_dct =
- !!(control->flags & XVMC_PRED_DCT_FRAME);
- vld->vld0.concealment_motion_vector =
- !!(control->flags & XVMC_CONCEALMENT_MOTION_VECTORS);
- vld->vld0.quantizer_scale_type = !!(control->flags & XVMC_Q_SCALE_TYPE);
- vld->vld0.intra_vlc_format = !!(control->flags & XVMC_INTRA_VLC_FORMAT);
- vld->vld0.scan_order = !!(control->flags & XVMC_ALTERNATE_SCAN);
-
- vld->vld1.picture_coding_type = control->picture_coding_type;
-
- vld->desc_remap_table0.index_0 = FRAME_INTRA;
- vld->desc_remap_table0.index_1 = FRAME_FRAME_PRED_FORWARD;
- vld->desc_remap_table0.index_2 = FRAME_FIELD_PRED_FORWARD;
- vld->desc_remap_table0.index_3 = FRAME_FIELD_PRED_BIDIRECT; /* dual prime */
- vld->desc_remap_table0.index_4 = FRAME_FRAME_PRED_BACKWARD;
- vld->desc_remap_table0.index_5 = FRAME_FIELD_PRED_BACKWARD;
- vld->desc_remap_table0.index_6 = FRAME_FRAME_PRED_BIDIRECT;
- vld->desc_remap_table0.index_7 = FRAME_FIELD_PRED_BIDIRECT;
-
- vld->desc_remap_table1.index_8 = FRAME_INTRA;
- vld->desc_remap_table1.index_9 = FRAME_FRAME_PRED_FORWARD;
- vld->desc_remap_table1.index_10 = FRAME_FIELD_PRED_FORWARD;
- vld->desc_remap_table1.index_11 = FRAME_FIELD_PRED_BIDIRECT;
- vld->desc_remap_table1.index_12 = FRAME_FRAME_PRED_BACKWARD;
- vld->desc_remap_table1.index_13 = FRAME_FIELD_PRED_BACKWARD;
- vld->desc_remap_table1.index_14 = FRAME_FRAME_PRED_BIDIRECT;
- vld->desc_remap_table1.index_15 = FRAME_FIELD_PRED_BIDIRECT;
-
- drm_intel_bo_subdata(media_state.vld_state.bo, 0, sizeof(tmp), vld);
- return Success;
+ struct brw_vld_state tmp, *vld = &tmp;
+
+ if (media_state.vld_state.bo)
+ drm_intel_bo_unreference(media_state.vld_state.bo);
+ media_state.vld_state.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
+ "vld state",
+ sizeof(struct
+ brw_vld_state),
+ 64);
+ if (!media_state.vld_state.bo)
+ return BadAlloc;
+
+ memset(vld, 0, sizeof(*vld));
+ vld->vld0.f_code_0_0 = control->FHMV_range + 1;
+ vld->vld0.f_code_0_1 = control->FVMV_range + 1;
+ vld->vld0.f_code_1_0 = control->BHMV_range + 1;
+ vld->vld0.f_code_1_1 = control->BVMV_range + 1;
+ vld->vld0.intra_dc_precision = control->intra_dc_precision;
+ vld->vld0.picture_structure = control->picture_structure;
+ vld->vld0.top_field_first = !!(control->flags & XVMC_TOP_FIELD_FIRST);
+ vld->vld0.frame_predict_frame_dct =
+ !!(control->flags & XVMC_PRED_DCT_FRAME);
+ vld->vld0.concealment_motion_vector =
+ !!(control->flags & XVMC_CONCEALMENT_MOTION_VECTORS);
+ vld->vld0.quantizer_scale_type = !!(control->flags & XVMC_Q_SCALE_TYPE);
+ vld->vld0.intra_vlc_format = !!(control->flags & XVMC_INTRA_VLC_FORMAT);
+ vld->vld0.scan_order = !!(control->flags & XVMC_ALTERNATE_SCAN);
+
+ vld->vld1.picture_coding_type = control->picture_coding_type;
+
+ vld->desc_remap_table0.index_0 = FRAME_INTRA;
+ vld->desc_remap_table0.index_1 = FRAME_FRAME_PRED_FORWARD;
+ vld->desc_remap_table0.index_2 = FRAME_FIELD_PRED_FORWARD;
+ vld->desc_remap_table0.index_3 = FRAME_FIELD_PRED_BIDIRECT; /* dual prime */
+ vld->desc_remap_table0.index_4 = FRAME_FRAME_PRED_BACKWARD;
+ vld->desc_remap_table0.index_5 = FRAME_FIELD_PRED_BACKWARD;
+ vld->desc_remap_table0.index_6 = FRAME_FRAME_PRED_BIDIRECT;
+ vld->desc_remap_table0.index_7 = FRAME_FIELD_PRED_BIDIRECT;
+
+ vld->desc_remap_table1.index_8 = FRAME_INTRA;
+ vld->desc_remap_table1.index_9 = FRAME_FRAME_PRED_FORWARD;
+ vld->desc_remap_table1.index_10 = FRAME_FIELD_PRED_FORWARD;
+ vld->desc_remap_table1.index_11 = FRAME_FIELD_PRED_BIDIRECT;
+ vld->desc_remap_table1.index_12 = FRAME_FRAME_PRED_BACKWARD;
+ vld->desc_remap_table1.index_13 = FRAME_FIELD_PRED_BACKWARD;
+ vld->desc_remap_table1.index_14 = FRAME_FRAME_PRED_BIDIRECT;
+ vld->desc_remap_table1.index_15 = FRAME_FIELD_PRED_BIDIRECT;
+
+ drm_intel_bo_subdata(media_state.vld_state.bo, 0, sizeof(tmp), vld);
+ return Success;
}
-static Status setup_media_surface(int index, dri_bo *bo,
- unsigned long offset, int w, int h, Bool write)
+static Status setup_media_surface(int index, dri_bo * bo,
+ unsigned long offset, int w, int h,
+ Bool write)
{
- struct brw_surface_state tmp, *ss = &tmp;
- memset(ss, 0, sizeof(*ss));
- ss->ss0.surface_type = BRW_SURFACE_2D;
- ss->ss0.surface_format = BRW_SURFACEFORMAT_R8_SINT;
- ss->ss1.base_addr = offset + bo->offset;
- ss->ss2.width = w - 1;
- ss->ss2.height = h - 1;
- ss->ss3.pitch = w - 1;
-
- if (media_state.binding_table.surface_states[index].bo)
- drm_intel_bo_unreference(media_state.binding_table.surface_states[index].bo);
-
- media_state.binding_table.surface_states[index].bo =
- drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface_state",
- sizeof(struct brw_surface_state), 0x1000);
- if (!media_state.binding_table.surface_states[index].bo)
- return BadAlloc;
-
- drm_intel_bo_subdata(
- media_state.binding_table.surface_states[index].bo,
- 0, sizeof(*ss), ss);
- drm_intel_bo_emit_reloc(media_state.binding_table.surface_states[index].bo,
- offsetof(struct brw_surface_state, ss1),
- bo, offset,
- I915_GEM_DOMAIN_RENDER, write?I915_GEM_DOMAIN_RENDER:0);
- return Success;
+ struct brw_surface_state tmp, *ss = &tmp;
+ memset(ss, 0, sizeof(*ss));
+ ss->ss0.surface_type = BRW_SURFACE_2D;
+ ss->ss0.surface_format = BRW_SURFACEFORMAT_R8_SINT;
+ ss->ss1.base_addr = offset + bo->offset;
+ ss->ss2.width = w - 1;
+ ss->ss2.height = h - 1;
+ ss->ss3.pitch = w - 1;
+
+ if (media_state.binding_table.surface_states[index].bo)
+ drm_intel_bo_unreference(media_state.
+ binding_table.surface_states[index].
+ bo);
+
+ media_state.binding_table.surface_states[index].bo =
+ drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface_state",
+ sizeof(struct brw_surface_state), 0x1000);
+ if (!media_state.binding_table.surface_states[index].bo)
+ return BadAlloc;
+
+ drm_intel_bo_subdata(media_state.binding_table.surface_states[index].bo,
+ 0, sizeof(*ss), ss);
+ drm_intel_bo_emit_reloc(media_state.binding_table.
+ surface_states[index].bo,
+ offsetof(struct brw_surface_state, ss1), bo,
+ offset, I915_GEM_DOMAIN_RENDER,
+ write ? I915_GEM_DOMAIN_RENDER : 0);
+ return Success;
}
static Status setup_surface(struct i965_xvmc_surface *target,
- struct i965_xvmc_surface *past,
- struct i965_xvmc_surface *future,
- int w, int h)
+ struct i965_xvmc_surface *past,
+ struct i965_xvmc_surface *future, int w, int h)
{
- Status ret;
- ret = setup_media_surface(0, target->bo, 0, w, h, TRUE);
- if (ret != Success)
- return ret;
- ret = setup_media_surface(1, target->bo, w*h, w/2, h/2, TRUE);
- if (ret != Success)
- return ret;
- ret = setup_media_surface(2, target->bo, w*h + w*h/4, w/2, h/2, TRUE);
- if (ret != Success)
- return ret;
- if (past) {
- ret = setup_media_surface(4, past->bo, 0, w, h, FALSE);
+ Status ret;
+ ret = setup_media_surface(0, target->bo, 0, w, h, TRUE);
if (ret != Success)
- return ret;
- ret = setup_media_surface(5, past->bo, w*h, w/2, h/2, FALSE);
+ return ret;
+ ret = setup_media_surface(1, target->bo, w * h, w / 2, h / 2, TRUE);
if (ret != Success)
- return ret;
- ret = setup_media_surface(6, past->bo, w*h + w*h/4, w/2, h/2, FALSE);
+ return ret;
+ ret =
+ setup_media_surface(2, target->bo, w * h + w * h / 4, w / 2, h / 2,
+ TRUE);
if (ret != Success)
- return ret;
- }
- if (future) {
- ret = setup_media_surface(7, future->bo, 0, w, h, FALSE);
+ return ret;
+ if (past) {
+ ret = setup_media_surface(4, past->bo, 0, w, h, FALSE);
+ if (ret != Success)
+ return ret;
+ ret =
+ setup_media_surface(5, past->bo, w * h, w / 2, h / 2,
+ FALSE);
+ if (ret != Success)
+ return ret;
+ ret =
+ setup_media_surface(6, past->bo, w * h + w * h / 4, w / 2,
+ h / 2, FALSE);
+ if (ret != Success)
+ return ret;
+ }
+ if (future) {
+ ret = setup_media_surface(7, future->bo, 0, w, h, FALSE);
+ if (ret != Success)
+ return ret;
+ ret =
+ setup_media_surface(8, future->bo, w * h, w / 2, h / 2,
+ FALSE);
+ if (ret != Success)
+ return ret;
+ ret =
+ setup_media_surface(9, future->bo, w * h + w * h / 4, w / 2,
+ h / 2, FALSE);
+ if (ret != Success)
+ return ret;
+ }
+ return Success;
+}
+
+static Status begin_surface(Display * display, XvMCContext * context,
+ XvMCSurface * target,
+ XvMCSurface * past,
+ XvMCSurface * future,
+ const XvMCMpegControl * control)
+{
+ struct i965_xvmc_contex *i965_ctx;
+ struct i965_xvmc_surface *priv_target, *priv_past, *priv_future;
+ intel_xvmc_context_ptr intel_ctx;
+ Status ret;
+
+ intel_ctx = intel_xvmc_find_context(context->context_id);
+ priv_target = target->privData;
+ priv_past = past ? past->privData : NULL;
+ priv_future = future ? future->privData : NULL;
+
+ ret = vld_state(control);
if (ret != Success)
- return ret;
- ret = setup_media_surface(8, future->bo, w*h, w/2, h/2, FALSE);
+ return ret;
+ ret = setup_surface(priv_target, priv_past, priv_future,
+ context->width, context->height);
if (ret != Success)
- return ret;
- ret = setup_media_surface(9, future->bo, w*h + w*h/4, w/2, h/2, FALSE);
+ return ret;
+ ret = binding_tables();
if (ret != Success)
- return ret;
- }
- return Success;
-}
+ return ret;
+ ret = interface_descriptor();
+ if (ret != Success)
+ return ret;
+ ret = vfe_state(VFE_VLD_MODE);
+ if (ret != Success)
+ return ret;
-static Status begin_surface(Display *display, XvMCContext *context,
- XvMCSurface *target,
- XvMCSurface *past,
- XvMCSurface *future,
- const XvMCMpegControl *control)
-{
- struct i965_xvmc_contex *i965_ctx;
- struct i965_xvmc_surface *priv_target, *priv_past, *priv_future;
- intel_xvmc_context_ptr intel_ctx;
- Status ret;
-
- intel_ctx = intel_xvmc_find_context(context->context_id);
- priv_target = target->privData;
- priv_past = past?past->privData:NULL;
- priv_future = future?future->privData:NULL;
-
- ret = vld_state(control);
- if (ret != Success)
- return ret;
- ret = setup_surface(priv_target, priv_past, priv_future,
- context->width, context->height);
- if (ret != Success)
- return ret;
- ret = binding_tables();
- if (ret != Success)
- return ret;
- ret = interface_descriptor();
- if (ret != Success)
- return ret;
- ret = vfe_state(VFE_VLD_MODE);
- if (ret != Success)
- return ret;
-
- LOCK_HARDWARE(intel_ctx->hw_context);
- flush();
- UNLOCK_HARDWARE(intel_ctx->hw_context);
- return Success;
+ LOCK_HARDWARE(intel_ctx->hw_context);
+ flush();
+ UNLOCK_HARDWARE(intel_ctx->hw_context);
+ return Success;
}
-static Status put_slice(Display *display, XvMCContext *context,
- unsigned char *slice, int nbytes)
+static Status put_slice(Display * display, XvMCContext * context,
+ unsigned char *slice, int nbytes)
{
- return Success;
+ return Success;
}
static void state_base_address(struct i965_xvmc_context *i965_ctx)
{
- BATCH_LOCALS;
-
- if (i965_ctx->is_igdng) {
- BEGIN_BATCH(8);
- OUT_BATCH(BRW_STATE_BASE_ADDRESS|6);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- ADVANCE_BATCH();
- } else {
- BEGIN_BATCH(6);
- OUT_BATCH(BRW_STATE_BASE_ADDRESS|4);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
- ADVANCE_BATCH();
- }
+ BATCH_LOCALS;
+
+ if (i965_ctx->is_igdng) {
+ BEGIN_BATCH(8);
+ OUT_BATCH(BRW_STATE_BASE_ADDRESS | 6);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ ADVANCE_BATCH();
+ } else {
+ BEGIN_BATCH(6);
+ OUT_BATCH(BRW_STATE_BASE_ADDRESS | 4);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
+ ADVANCE_BATCH();
+ }
}
+
static void pipeline_select()
{
- BATCH_LOCALS;
- BEGIN_BATCH(1);
- OUT_BATCH(NEW_PIPELINE_SELECT|PIPELINE_SELECT_MEDIA);
- ADVANCE_BATCH();
+ BATCH_LOCALS;
+ BEGIN_BATCH(1);
+ OUT_BATCH(NEW_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
+ ADVANCE_BATCH();
}
static void media_state_pointers(int vfe_mode)
{
- BATCH_LOCALS;
- BEGIN_BATCH(3);
- OUT_BATCH(BRW_MEDIA_STATE_POINTERS|1);
- if (vfe_mode == VFE_VLD_MODE)
- OUT_RELOC(media_state.vld_state.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1);
+ BATCH_LOCALS;
+ BEGIN_BATCH(3);
+ OUT_BATCH(BRW_MEDIA_STATE_POINTERS | 1);
+ if (vfe_mode == VFE_VLD_MODE)
+ OUT_RELOC(media_state.vld_state.bo, I915_GEM_DOMAIN_INSTRUCTION,
+ 0, 1);
else
OUT_BATCH(0);
- OUT_RELOC(media_state.vfe_state.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
- ADVANCE_BATCH();
+ OUT_RELOC(media_state.vfe_state.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+ ADVANCE_BATCH();
}
static void align_urb_fence()
{
- BATCH_LOCALS;
- int i, offset_to_next_cacheline;
- unsigned long batch_offset;
- BEGIN_BATCH(3);
- batch_offset = (void *)batch_ptr - xvmc_driver->alloc.ptr;
- offset_to_next_cacheline = ALIGN(batch_offset, 64) - batch_offset;
- if (offset_to_next_cacheline <= 12 && offset_to_next_cacheline != 0) {
- for (i = 0; i < offset_to_next_cacheline/4; i++)
- OUT_BATCH(0);
- ADVANCE_BATCH();
- }
+ BATCH_LOCALS;
+ int i, offset_to_next_cacheline;
+ unsigned long batch_offset;
+ BEGIN_BATCH(3);
+ batch_offset = (void *)batch_ptr - xvmc_driver->alloc.ptr;
+ offset_to_next_cacheline = ALIGN(batch_offset, 64) - batch_offset;
+ if (offset_to_next_cacheline <= 12 && offset_to_next_cacheline != 0) {
+ for (i = 0; i < offset_to_next_cacheline / 4; i++)
+ OUT_BATCH(0);
+ ADVANCE_BATCH();
+ }
}
static void urb_layout()
{
- BATCH_LOCALS;
- align_urb_fence();
- BEGIN_BATCH(3);
- OUT_BATCH(BRW_URB_FENCE |
- UF0_VFE_REALLOC |
- UF0_CS_REALLOC |
- UF0_SF_REALLOC |
- UF0_CLIP_REALLOC |
- UF0_GS_REALLOC |
- UF0_VS_REALLOC |
- 1);
-
- OUT_BATCH((0 << UF1_CLIP_FENCE_SHIFT) |
- (0 << UF1_GS_FENCE_SHIFT) |
- (0 << UF1_VS_FENCE_SHIFT));
-
- OUT_BATCH((0 << UF2_CS_FENCE_SHIFT) |
- (0 << UF2_SF_FENCE_SHIFT) |
- ((URB_SIZE - CS_SIZE - 1)<< UF2_VFE_FENCE_SHIFT) | /* VFE_SIZE */
- ((URB_SIZE)<< UF2_CS_FENCE_SHIFT)); /* CS_SIZE */
- ADVANCE_BATCH();
+ BATCH_LOCALS;
+ align_urb_fence();
+ BEGIN_BATCH(3);
+ OUT_BATCH(BRW_URB_FENCE |
+ UF0_VFE_REALLOC |
+ UF0_CS_REALLOC |
+ UF0_SF_REALLOC |
+ UF0_CLIP_REALLOC | UF0_GS_REALLOC | UF0_VS_REALLOC | 1);
+
+ OUT_BATCH((0 << UF1_CLIP_FENCE_SHIFT) |
+ (0 << UF1_GS_FENCE_SHIFT) | (0 << UF1_VS_FENCE_SHIFT));
+
+ OUT_BATCH((0 << UF2_CS_FENCE_SHIFT) | (0 << UF2_SF_FENCE_SHIFT) | ((URB_SIZE - CS_SIZE - 1) << UF2_VFE_FENCE_SHIFT) | /* VFE_SIZE */
+ ((URB_SIZE) << UF2_CS_FENCE_SHIFT)); /* CS_SIZE */
+ ADVANCE_BATCH();
}
static void cs_urb_layout()
{
- BATCH_LOCALS;
- BEGIN_BATCH(2);
- OUT_BATCH(BRW_CS_URB_STATE | 0);
- OUT_BATCH((CS_SIZE << 4) | /* URB Entry Allocation Size */
- (1 << 0)); /* Number of URB Entries */
- ADVANCE_BATCH();
+ BATCH_LOCALS;
+ BEGIN_BATCH(2);
+ OUT_BATCH(BRW_CS_URB_STATE | 0);
+ OUT_BATCH((CS_SIZE << 4) | /* URB Entry Allocation Size */
+ (1 << 0)); /* Number of URB Entries */
+ ADVANCE_BATCH();
}
static void cs_buffer()
{
- BATCH_LOCALS;
- BEGIN_BATCH(2);
- OUT_BATCH(BRW_CONSTANT_BUFFER|0|(1<<8));
- OUT_RELOC(media_state.cs_object.bo, I915_GEM_DOMAIN_INSTRUCTION, 0, CS_SIZE);
- ADVANCE_BATCH();
+ BATCH_LOCALS;
+ BEGIN_BATCH(2);
+ OUT_BATCH(BRW_CONSTANT_BUFFER | 0 | (1 << 8));
+ OUT_RELOC(media_state.cs_object.bo, I915_GEM_DOMAIN_INSTRUCTION, 0,
+ CS_SIZE);
+ ADVANCE_BATCH();
}
/* kick media object to gpu in idct mode*/
-static void send_media_object(XvMCMacroBlock *mb, dri_bo *bo,
- uint32_t offset,
- enum interface interface)
+static void send_media_object(XvMCMacroBlock * mb, dri_bo * bo,
+ uint32_t offset, enum interface interface)
{
- BATCH_LOCALS;
- BEGIN_BATCH(13);
- OUT_BATCH(BRW_MEDIA_OBJECT|11);
- OUT_BATCH(interface);
- OUT_BATCH(6*128);
- OUT_RELOC(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, offset);
-
- OUT_BATCH(mb->x<<4);
- OUT_BATCH(mb->y<<4);
+ BATCH_LOCALS;
+ BEGIN_BATCH(13);
+ OUT_BATCH(BRW_MEDIA_OBJECT | 11);
+ OUT_BATCH(interface);
+ OUT_BATCH(6 * 128);
OUT_RELOC(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, offset);
- OUT_BATCH_SHORT(mb->coded_block_pattern);
- OUT_BATCH_SHORT(mb->PMV[0][0][0]);
- OUT_BATCH_SHORT(mb->PMV[0][0][1]);
- OUT_BATCH_SHORT(mb->PMV[0][1][0]);
- OUT_BATCH_SHORT(mb->PMV[0][1][1]);
-
- OUT_BATCH_SHORT(mb->PMV[1][0][0]);
- OUT_BATCH_SHORT(mb->PMV[1][0][1]);
- OUT_BATCH_SHORT(mb->PMV[1][1][0]);
- OUT_BATCH_SHORT(mb->PMV[1][1][1]);
- OUT_BATCH_CHAR(mb->dct_type);
- OUT_BATCH_CHAR(mb->motion_vertical_field_select);
-
- OUT_BATCH(0xffffffff);
- ADVANCE_BATCH();
+
+ OUT_BATCH(mb->x << 4);
+ OUT_BATCH(mb->y << 4);
+ OUT_RELOC(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, offset);
+ OUT_BATCH_SHORT(mb->coded_block_pattern);
+ OUT_BATCH_SHORT(mb->PMV[0][0][0]);
+ OUT_BATCH_SHORT(mb->PMV[0][0][1]);
+ OUT_BATCH_SHORT(mb->PMV[0][1][0]);
+ OUT_BATCH_SHORT(mb->PMV[0][1][1]);
+
+ OUT_BATCH_SHORT(mb->PMV[1][0][0]);
+ OUT_BATCH_SHORT(mb->PMV[1][0][1]);
+ OUT_BATCH_SHORT(mb->PMV[1][1][0]);
+ OUT_BATCH_SHORT(mb->PMV[1][1][1]);
+ OUT_BATCH_CHAR(mb->dct_type);
+ OUT_BATCH_CHAR(mb->motion_vertical_field_select);
+
+ OUT_BATCH(0xffffffff);
+ ADVANCE_BATCH();
}
/* kick media object to gpu in vld mode*/
-static void vld_send_media_object(dri_bo *bo,
- int slice_len, int mb_h_pos, int mb_v_pos, int mb_bit_offset,
- int mb_count, int q_scale_code)
+static void vld_send_media_object(dri_bo * bo,
+ int slice_len, int mb_h_pos, int mb_v_pos,
+ int mb_bit_offset, int mb_count,
+ int q_scale_code)
{
- BATCH_LOCALS;
- BEGIN_BATCH(6);
- OUT_BATCH(BRW_MEDIA_OBJECT|4);
- OUT_BATCH(0);
- OUT_BATCH(slice_len);
- OUT_RELOC(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
- OUT_BATCH((mb_h_pos<<24)|(mb_v_pos<<16)|(mb_count<<8)|(mb_bit_offset));
- OUT_BATCH(q_scale_code<<24);
- ADVANCE_BATCH();
+ BATCH_LOCALS;
+ BEGIN_BATCH(6);
+ OUT_BATCH(BRW_MEDIA_OBJECT | 4);
+ OUT_BATCH(0);
+ OUT_BATCH(slice_len);
+ OUT_RELOC(bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
+ OUT_BATCH((mb_h_pos << 24) | (mb_v_pos << 16) | (mb_count << 8) |
+ (mb_bit_offset));
+ OUT_BATCH(q_scale_code << 24);
+ ADVANCE_BATCH();
}
-static Status put_slice2(Display *display, XvMCContext *context,
- unsigned char *slice, int nbytes, int sliceCode)
+static Status put_slice2(Display * display, XvMCContext * context,
+ unsigned char *slice, int nbytes, int sliceCode)
{
- unsigned int bit_buf;
- intel_xvmc_context_ptr intel_ctx;
- struct i965_xvmc_context *i965_ctx;
- int q_scale_code, mb_row;
-
- i965_ctx = (struct i965_xvmc_context *)context->privData;
- mb_row = *(slice - 1) - 1;
- bit_buf = (slice[0]<<24) | (slice[1]<<16) | (slice[2]<<8) | (slice[3]);
-
- q_scale_code = bit_buf>>27;
-
- if (media_state.slice_data.bo) {
- if (xvmc_driver->kernel_exec_fencing)
- drm_intel_gem_bo_unmap_gtt(media_state.slice_data.bo);
- else
- drm_intel_bo_unmap(media_state.slice_data.bo);
-
- drm_intel_bo_unreference(media_state.slice_data.bo);
- }
- media_state.slice_data.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
- "slice data", VLD_MAX_SLICE_SIZE, 64);
- if (!media_state.slice_data.bo)
- return BadAlloc;
- if (xvmc_driver->kernel_exec_fencing)
- drm_intel_gem_bo_map_gtt(media_state.slice_data.bo);
- else
- drm_intel_bo_map(media_state.slice_data.bo, 1);
-
- memcpy(media_state.slice_data.bo->virtual, slice, nbytes);
-
- intel_ctx = intel_xvmc_find_context(context->context_id);
- LOCK_HARDWARE(intel_ctx->hw_context);
- state_base_address(i965_ctx);
- pipeline_select();
- media_state_pointers(VFE_VLD_MODE);
- urb_layout();
- cs_urb_layout();
- cs_buffer();
- vld_send_media_object(media_state.slice_data.bo,
- nbytes,
- 0, mb_row, 6, 127, q_scale_code);
- intelFlushBatch(TRUE);
- UNLOCK_HARDWARE(intel_ctx->hw_context);
-
- return Success;
+ unsigned int bit_buf;
+ intel_xvmc_context_ptr intel_ctx;
+ struct i965_xvmc_context *i965_ctx;
+ int q_scale_code, mb_row;
+
+ i965_ctx = (struct i965_xvmc_context *)context->privData;
+ mb_row = *(slice - 1) - 1;
+ bit_buf =
+ (slice[0] << 24) | (slice[1] << 16) | (slice[2] << 8) | (slice[3]);
+
+ q_scale_code = bit_buf >> 27;
+
+ if (media_state.slice_data.bo) {
+ if (xvmc_driver->kernel_exec_fencing)
+ drm_intel_gem_bo_unmap_gtt(media_state.slice_data.bo);
+ else
+ drm_intel_bo_unmap(media_state.slice_data.bo);
+
+ drm_intel_bo_unreference(media_state.slice_data.bo);
+ }
+ media_state.slice_data.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
+ "slice data",
+ VLD_MAX_SLICE_SIZE, 64);
+ if (!media_state.slice_data.bo)
+ return BadAlloc;
+ if (xvmc_driver->kernel_exec_fencing)
+ drm_intel_gem_bo_map_gtt(media_state.slice_data.bo);
+ else
+ drm_intel_bo_map(media_state.slice_data.bo, 1);
+
+ memcpy(media_state.slice_data.bo->virtual, slice, nbytes);
+
+ intel_ctx = intel_xvmc_find_context(context->context_id);
+ LOCK_HARDWARE(intel_ctx->hw_context);
+ state_base_address(i965_ctx);
+ pipeline_select();
+ media_state_pointers(VFE_VLD_MODE);
+ urb_layout();
+ cs_urb_layout();
+ cs_buffer();
+ vld_send_media_object(media_state.slice_data.bo,
+ nbytes, 0, mb_row, 6, 127, q_scale_code);
+ intelFlushBatch(TRUE);
+ UNLOCK_HARDWARE(intel_ctx->hw_context);
+
+ return Success;
}
-static Status put_surface(Display *display,XvMCSurface *surface,
- Drawable draw, short srcx, short srcy,
- unsigned short srcw, unsigned short srch,
- short destx, short desty,
- unsigned short destw, unsigned short desth,
- int flags, struct intel_xvmc_command *data)
+static Status put_surface(Display * display, XvMCSurface * surface,
+ Drawable draw, short srcx, short srcy,
+ unsigned short srcw, unsigned short srch,
+ short destx, short desty,
+ unsigned short destw, unsigned short desth,
+ int flags, struct intel_xvmc_command *data)
{
- struct i965_xvmc_surface *private_surface =
- surface->privData;
- uint32_t handle;
+ struct i965_xvmc_surface *private_surface = surface->privData;
+ uint32_t handle;
- drm_intel_bo_flink(private_surface->bo, &handle);
- data->handle = handle;
+ drm_intel_bo_flink(private_surface->bo, &handle);
+ data->handle = handle;
return Success;
}
-static Status render_surface(Display *display,
- XvMCContext *context,
- unsigned int picture_structure,
- XvMCSurface *target_surface,
- XvMCSurface *past_surface,
- XvMCSurface *future_surface,
- unsigned int flags,
- unsigned int num_macroblocks,
- unsigned int first_macroblock,
- XvMCMacroBlockArray *macroblock_array,
- XvMCBlockArray *blocks)
+static Status render_surface(Display * display,
+ XvMCContext * context,
+ unsigned int picture_structure,
+ XvMCSurface * target_surface,
+ XvMCSurface * past_surface,
+ XvMCSurface * future_surface,
+ unsigned int flags,
+ unsigned int num_macroblocks,
+ unsigned int first_macroblock,
+ XvMCMacroBlockArray * macroblock_array,
+ XvMCBlockArray * blocks)
{
- struct i965_xvmc_surface *priv_target, *priv_past, *priv_future;
- intel_xvmc_context_ptr intel_ctx;
- XvMCMacroBlock *mb;
- Status ret;
- unsigned short *block_ptr;
- int i, j;
- int block_offset = 0;
- struct i965_xvmc_context *i965_ctx;
-
- intel_ctx = intel_xvmc_find_context(context->context_id);
- if (!intel_ctx) {
- XVMC_ERR("Can't find intel xvmc context\n");
- return BadValue;
- }
-
- i965_ctx = (struct i965_xvmc_context *)context->privData;
- priv_target = target_surface->privData;
- priv_past = past_surface?past_surface->privData:NULL;
- priv_future = future_surface?future_surface->privData:NULL;
-
- ret = setup_surface(priv_target, priv_past, priv_future,
- context->width, context->height);
- if (ret != Success)
- return ret;
- ret = binding_tables();
- if (ret != Success)
- return ret;
- ret = interface_descriptor();
- if (ret != Success)
- return ret;
- ret = cs_init(INTERFACE_NUM);
- if (ret != Success)
- return ret;
- ret = vfe_state(VFE_GENERIC_MODE);
- if (ret != Success)
- return ret;
-
- if (media_state.mb_data.bo) {
- if (xvmc_driver->kernel_exec_fencing)
- drm_intel_gem_bo_unmap_gtt(media_state.mb_data.bo);
- else
- drm_intel_bo_unmap(media_state.mb_data.bo);
-
- drm_intel_bo_unreference(media_state.mb_data.bo);
- }
- unsigned int block_num =
- (((context->width + 15) >> 4) * ((context->height + 15) >> 4));
- unsigned int surface_size = (64 * sizeof(short) * 6 * block_num);
- media_state.mb_data.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
- "macroblock data", surface_size, 64);
- if(!media_state.mb_data.bo)
- return BadAlloc;
- if(xvmc_driver->kernel_exec_fencing)
- drm_intel_gem_bo_map_gtt(media_state.mb_data.bo);
- else
- drm_intel_bo_map(media_state.mb_data.bo, 1);
-
- block_ptr = media_state.mb_data.bo->virtual;
- unsigned short *mb_block_ptr;
- for (i = first_macroblock;
- i < num_macroblocks + first_macroblock; i++) {
- mb = &macroblock_array->macro_blocks[i];
- mb_block_ptr = &blocks->blocks[(mb->index<<6)];
-
- if (mb->coded_block_pattern & 0x20) {
- for (j = 0; j < 8; j++)
- memcpy(block_ptr + 16*j, mb_block_ptr + 8*j, 16);
- mb_block_ptr += 64;
- }
- if (mb->coded_block_pattern & 0x10) {
- for (j = 0; j < 8; j++)
- memcpy(block_ptr + 16*j + 8, mb_block_ptr + 8*j, 16);
- mb_block_ptr += 64;
+ struct i965_xvmc_surface *priv_target, *priv_past, *priv_future;
+ intel_xvmc_context_ptr intel_ctx;
+ XvMCMacroBlock *mb;
+ Status ret;
+ unsigned short *block_ptr;
+ int i, j;
+ int block_offset = 0;
+ struct i965_xvmc_context *i965_ctx;
+
+ intel_ctx = intel_xvmc_find_context(context->context_id);
+ if (!intel_ctx) {
+ XVMC_ERR("Can't find intel xvmc context\n");
+ return BadValue;
}
- block_ptr += 2*64;
- if (mb->coded_block_pattern & 0x08) {
- for (j = 0; j < 8; j++)
- memcpy(block_ptr + 16*j, mb_block_ptr + 8*j, 16);
- mb_block_ptr += 64;
- }
- if (mb->coded_block_pattern & 0x04) {
- for (j = 0; j < 8; j++)
- memcpy(block_ptr + 16*j + 8, mb_block_ptr + 8*j, 16);
- mb_block_ptr += 64;
- }
+ i965_ctx = (struct i965_xvmc_context *)context->privData;
+ priv_target = target_surface->privData;
+ priv_past = past_surface ? past_surface->privData : NULL;
+ priv_future = future_surface ? future_surface->privData : NULL;
+
+ ret = setup_surface(priv_target, priv_past, priv_future,
+ context->width, context->height);
+ if (ret != Success)
+ return ret;
+ ret = binding_tables();
+ if (ret != Success)
+ return ret;
+ ret = interface_descriptor();
+ if (ret != Success)
+ return ret;
+ ret = cs_init(INTERFACE_NUM);
+ if (ret != Success)
+ return ret;
+ ret = vfe_state(VFE_GENERIC_MODE);
+ if (ret != Success)
+ return ret;
- block_ptr += 2*64;
- if (mb->coded_block_pattern & 0x2) {
- memcpy(block_ptr, mb_block_ptr, 128);
- mb_block_ptr += 64;
+ if (media_state.mb_data.bo) {
+ if (xvmc_driver->kernel_exec_fencing)
+ drm_intel_gem_bo_unmap_gtt(media_state.mb_data.bo);
+ else
+ drm_intel_bo_unmap(media_state.mb_data.bo);
+
+ drm_intel_bo_unreference(media_state.mb_data.bo);
}
+ unsigned int block_num =
+ (((context->width + 15) >> 4) * ((context->height + 15) >> 4));
+ unsigned int surface_size = (64 * sizeof(short) * 6 * block_num);
+ media_state.mb_data.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
+ "macroblock data",
+ surface_size, 64);
+ if (!media_state.mb_data.bo)
+ return BadAlloc;
+ if (xvmc_driver->kernel_exec_fencing)
+ drm_intel_gem_bo_map_gtt(media_state.mb_data.bo);
+ else
+ drm_intel_bo_map(media_state.mb_data.bo, 1);
+
+ block_ptr = media_state.mb_data.bo->virtual;
+ unsigned short *mb_block_ptr;
+ for (i = first_macroblock; i < num_macroblocks + first_macroblock; i++) {
+ mb = &macroblock_array->macro_blocks[i];
+ mb_block_ptr = &blocks->blocks[(mb->index << 6)];
+
+ if (mb->coded_block_pattern & 0x20) {
+ for (j = 0; j < 8; j++)
+ memcpy(block_ptr + 16 * j, mb_block_ptr + 8 * j,
+ 16);
+ mb_block_ptr += 64;
+ }
+ if (mb->coded_block_pattern & 0x10) {
+ for (j = 0; j < 8; j++)
+ memcpy(block_ptr + 16 * j + 8,
+ mb_block_ptr + 8 * j, 16);
+ mb_block_ptr += 64;
+ }
- block_ptr += 64;
- if (mb->coded_block_pattern & 0x1)
- memcpy(block_ptr, mb_block_ptr, 128);
- block_ptr += 64;
- }
-
- LOCK_HARDWARE(intel_ctx->hw_context);
- state_base_address(i965_ctx);
- flush();
- pipeline_select();
- urb_layout();
- media_state_pointers(VFE_GENERIC_MODE);
- cs_urb_layout();
- cs_buffer();
- for (i = first_macroblock;
- i < num_macroblocks + first_macroblock;
- i++, block_offset += 128*6) {
- mb = &macroblock_array->macro_blocks[i];
-
- if (mb->macroblock_type & XVMC_MB_TYPE_INTRA) {
- send_media_object(mb, media_state.mb_data.bo, block_offset,
- FRAME_INTRA + INTERFACE_NUM);
- } else {
- if (((mb->motion_type & 3) == XVMC_PREDICTION_FRAME)) {
- if ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD)) {
- if ((mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD)) {
- send_media_object(mb, media_state.mb_data.bo, block_offset,
- FRAME_FRAME_PRED_BIDIRECT + INTERFACE_NUM);
- } else {
- send_media_object(mb, media_state.mb_data.bo, block_offset,
- FRAME_FRAME_PRED_FORWARD + INTERFACE_NUM);
- }
- } else if ((mb->macroblock_type&XVMC_MB_TYPE_MOTION_BACKWARD)) {
- send_media_object(mb, media_state.mb_data.bo, block_offset,
- FRAME_FRAME_PRED_BACKWARD + INTERFACE_NUM);
+ block_ptr += 2 * 64;
+ if (mb->coded_block_pattern & 0x08) {
+ for (j = 0; j < 8; j++)
+ memcpy(block_ptr + 16 * j, mb_block_ptr + 8 * j,
+ 16);
+ mb_block_ptr += 64;
}
- } else if ((mb->motion_type & 3) == XVMC_PREDICTION_FIELD) {
- if ((mb->macroblock_type&XVMC_MB_TYPE_MOTION_FORWARD)) {
- if (((mb->macroblock_type&XVMC_MB_TYPE_MOTION_BACKWARD))) {
- send_media_object(mb, media_state.mb_data.bo, block_offset,
- FRAME_FIELD_PRED_BIDIRECT + INTERFACE_NUM);
- } else {
- send_media_object(mb, media_state.mb_data.bo, block_offset,
- FRAME_FIELD_PRED_FORWARD + INTERFACE_NUM);
- }
- } else if ((mb->macroblock_type&XVMC_MB_TYPE_MOTION_BACKWARD)) {
- send_media_object(mb, media_state.mb_data.bo, block_offset,
- FRAME_FIELD_PRED_BACKWARD + INTERFACE_NUM);
+ if (mb->coded_block_pattern & 0x04) {
+ for (j = 0; j < 8; j++)
+ memcpy(block_ptr + 16 * j + 8,
+ mb_block_ptr + 8 * j, 16);
+ mb_block_ptr += 64;
}
- } else {
- send_media_object(mb, media_state.mb_data.bo, block_offset,
- FRAME_FIELD_PRED_BIDIRECT + INTERFACE_NUM); /*dual prime*/
- }
+
+ block_ptr += 2 * 64;
+ if (mb->coded_block_pattern & 0x2) {
+ memcpy(block_ptr, mb_block_ptr, 128);
+ mb_block_ptr += 64;
+ }
+
+ block_ptr += 64;
+ if (mb->coded_block_pattern & 0x1)
+ memcpy(block_ptr, mb_block_ptr, 128);
+ block_ptr += 64;
}
- }
- intelFlushBatch(TRUE);
- UNLOCK_HARDWARE(intel_ctx->hw_context);
- return Success;
+
+ LOCK_HARDWARE(intel_ctx->hw_context);
+ state_base_address(i965_ctx);
+ flush();
+ pipeline_select();
+ urb_layout();
+ media_state_pointers(VFE_GENERIC_MODE);
+ cs_urb_layout();
+ cs_buffer();
+ for (i = first_macroblock;
+ i < num_macroblocks + first_macroblock;
+ i++, block_offset += 128 * 6) {
+ mb = &macroblock_array->macro_blocks[i];
+
+ if (mb->macroblock_type & XVMC_MB_TYPE_INTRA) {
+ send_media_object(mb, media_state.mb_data.bo,
+ block_offset,
+ FRAME_INTRA + INTERFACE_NUM);
+ } else {
+ if (((mb->motion_type & 3) == XVMC_PREDICTION_FRAME)) {
+ if ((mb->macroblock_type &
+ XVMC_MB_TYPE_MOTION_FORWARD)) {
+ if ((mb->macroblock_type &
+ XVMC_MB_TYPE_MOTION_BACKWARD)) {
+ send_media_object(mb,
+ media_state.mb_data.
+ bo,
+ block_offset,
+ FRAME_FRAME_PRED_BIDIRECT
+ +
+ INTERFACE_NUM);
+ } else {
+ send_media_object(mb,
+ media_state.mb_data.
+ bo,
+ block_offset,
+ FRAME_FRAME_PRED_FORWARD
+ +
+ INTERFACE_NUM);
+ }
+ } else
+ if ((mb->macroblock_type &
+ XVMC_MB_TYPE_MOTION_BACKWARD)) {
+ send_media_object(mb,
+ media_state.
+ mb_data.bo,
+ block_offset,
+ FRAME_FRAME_PRED_BACKWARD
+ + INTERFACE_NUM);
+ }
+ } else if ((mb->motion_type & 3) ==
+ XVMC_PREDICTION_FIELD) {
+ if ((mb->macroblock_type &
+ XVMC_MB_TYPE_MOTION_FORWARD)) {
+ if (((mb->macroblock_type &
+ XVMC_MB_TYPE_MOTION_BACKWARD))) {
+ send_media_object(mb,
+ media_state.mb_data.
+ bo,
+ block_offset,
+ FRAME_FIELD_PRED_BIDIRECT
+ +
+ INTERFACE_NUM);
+ } else {
+ send_media_object(mb,
+ media_state.mb_data.
+ bo,
+ block_offset,
+ FRAME_FIELD_PRED_FORWARD
+ +
+ INTERFACE_NUM);
+ }
+ } else
+ if ((mb->macroblock_type &
+ XVMC_MB_TYPE_MOTION_BACKWARD)) {
+ send_media_object(mb,
+ media_state.
+ mb_data.bo,
+ block_offset,
+ FRAME_FIELD_PRED_BACKWARD
+ + INTERFACE_NUM);
+ }
+ } else {
+ send_media_object(mb, media_state.mb_data.bo, block_offset, FRAME_FIELD_PRED_BIDIRECT + INTERFACE_NUM); /*dual prime */
+ }
+ }
+ }
+ intelFlushBatch(TRUE);
+ UNLOCK_HARDWARE(intel_ctx->hw_context);
+ return Success;
}
struct _intel_xvmc_driver xvmc_vld_driver = {
- .type = XVMC_I965_MPEG2_VLD,
- .create_context = create_context,
- .destroy_context = destroy_context,
- .create_surface = create_surface,
- .destroy_surface = destroy_surface,
- .load_qmatrix = load_qmatrix,
- .get_surface_status = get_surface_status,
- .begin_surface = begin_surface,
+ .type = XVMC_I965_MPEG2_VLD,
+ .create_context = create_context,
+ .destroy_context = destroy_context,
+ .create_surface = create_surface,
+ .destroy_surface = destroy_surface,
+ .load_qmatrix = load_qmatrix,
+ .get_surface_status = get_surface_status,
+ .begin_surface = begin_surface,
.render_surface = render_surface,
- .put_surface = put_surface,
- .put_slice = put_slice,
- .put_slice2 = put_slice2
+ .put_surface = put_surface,
+ .put_slice = put_slice,
+ .put_slice2 = put_slice2
};
diff --git a/uxa/uxa-accel.c b/uxa/uxa-accel.c
index 796f949e..f0bf92f1 100644
--- a/uxa/uxa-accel.c
+++ b/uxa/uxa-accel.c
@@ -39,179 +39,174 @@ static void
uxa_fill_spans(DrawablePtr pDrawable, GCPtr pGC, int n,
DDXPointPtr ppt, int *pwidth, int fSorted)
{
- ScreenPtr pScreen = pDrawable->pScreen;
- uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
- RegionPtr pClip = fbGetCompositeClip(pGC);
- PixmapPtr pPixmap = uxa_get_drawable_pixmap (pDrawable);
- BoxPtr pextent, pbox;
- int nbox;
- int extentX1, extentX2, extentY1, extentY2;
- int fullX1, fullX2, fullY1;
- int partX1, partX2;
- int off_x, off_y;
-
- if (uxa_screen->swappedOut || pGC->fillStyle != FillSolid ||
- !(pPixmap = uxa_get_offscreen_pixmap (pDrawable, &off_x, &off_y)) ||
- !(*uxa_screen->info->prepare_solid) (pPixmap,
- pGC->alu,
- pGC->planemask,
- pGC->fgPixel))
- {
- uxa_check_fill_spans (pDrawable, pGC, n, ppt, pwidth, fSorted);
- return;
- }
-
- pextent = REGION_EXTENTS(pGC->pScreen, pClip);
- extentX1 = pextent->x1;
- extentY1 = pextent->y1;
- extentX2 = pextent->x2;
- extentY2 = pextent->y2;
- while (n--)
- {
- fullX1 = ppt->x;
- fullY1 = ppt->y;
- fullX2 = fullX1 + (int) *pwidth;
- ppt++;
- pwidth++;
-
- if (fullY1 < extentY1 || extentY2 <= fullY1)
- continue;
-
- if (fullX1 < extentX1)
- fullX1 = extentX1;
-
- if (fullX2 > extentX2)
- fullX2 = extentX2;
-
- if (fullX1 >= fullX2)
- continue;
-
- nbox = REGION_NUM_RECTS (pClip);
- if (nbox == 1)
- {
- (*uxa_screen->info->solid) (pPixmap,
- fullX1 + off_x, fullY1 + off_y,
- fullX2 + off_x, fullY1 + 1 + off_y);
- }
- else
- {
- pbox = REGION_RECTS(pClip);
- while(nbox--)
- {
- if (pbox->y1 <= fullY1 && fullY1 < pbox->y2)
- {
- partX1 = pbox->x1;
- if (partX1 < fullX1)
- partX1 = fullX1;
- partX2 = pbox->x2;
- if (partX2 > fullX2)
- partX2 = fullX2;
- if (partX2 > partX1) {
- (*uxa_screen->info->solid) (pPixmap,
- partX1 + off_x, fullY1 + off_y,
- partX2 + off_x, fullY1 + 1 + off_y);
- }
- }
- pbox++;
- }
+ ScreenPtr pScreen = pDrawable->pScreen;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
+ RegionPtr pClip = fbGetCompositeClip(pGC);
+ PixmapPtr pPixmap = uxa_get_drawable_pixmap(pDrawable);
+ BoxPtr pextent, pbox;
+ int nbox;
+ int extentX1, extentX2, extentY1, extentY2;
+ int fullX1, fullX2, fullY1;
+ int partX1, partX2;
+ int off_x, off_y;
+
+ if (uxa_screen->swappedOut || pGC->fillStyle != FillSolid ||
+ !(pPixmap = uxa_get_offscreen_pixmap(pDrawable, &off_x, &off_y)) ||
+ !(*uxa_screen->info->prepare_solid) (pPixmap,
+ pGC->alu,
+ pGC->planemask,
+ pGC->fgPixel)) {
+ uxa_check_fill_spans(pDrawable, pGC, n, ppt, pwidth, fSorted);
+ return;
}
- }
- (*uxa_screen->info->done_solid) (pPixmap);
-}
-static Bool
-uxa_do_put_image (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
- int w, int h, int format, char *bits, int src_stride)
-{
- uxa_screen_t *uxa_screen = uxa_get_screen(pDrawable->pScreen);
- PixmapPtr pPix = uxa_get_drawable_pixmap (pDrawable);
- RegionPtr pClip;
- BoxPtr pbox;
- int nbox;
- int xoff, yoff;
- int bpp = pDrawable->bitsPerPixel;
- Bool access_prepared = FALSE;
-
- /* Don't bother with under 8bpp, XYPixmaps. */
- if (format != ZPixmap || bpp < 8)
- return FALSE;
+ pextent = REGION_EXTENTS(pGC->pScreen, pClip);
+ extentX1 = pextent->x1;
+ extentY1 = pextent->y1;
+ extentX2 = pextent->x2;
+ extentY2 = pextent->y2;
+ while (n--) {
+ fullX1 = ppt->x;
+ fullY1 = ppt->y;
+ fullX2 = fullX1 + (int)*pwidth;
+ ppt++;
+ pwidth++;
- /* Only accelerate copies: no rop or planemask. */
- if (!UXA_PM_IS_SOLID(pDrawable, pGC->planemask) || pGC->alu != GXcopy)
- return FALSE;
-
- if (uxa_screen->swappedOut)
- return FALSE;
+ if (fullY1 < extentY1 || extentY2 <= fullY1)
+ continue;
- pPix = uxa_get_offscreen_pixmap (pDrawable, &xoff, &yoff);
+ if (fullX1 < extentX1)
+ fullX1 = extentX1;
- if (!pPix || !uxa_screen->info->put_image)
- return FALSE;
+ if (fullX2 > extentX2)
+ fullX2 = extentX2;
- x += pDrawable->x;
- y += pDrawable->y;
-
- pClip = fbGetCompositeClip(pGC);
- for (nbox = REGION_NUM_RECTS(pClip),
- pbox = REGION_RECTS(pClip);
- nbox--;
- pbox++)
- {
- int x1 = x;
- int y1 = y;
- int x2 = x + w;
- int y2 = y + h;
- char *src;
- Bool ok;
+ if (fullX1 >= fullX2)
+ continue;
- if (x1 < pbox->x1)
- x1 = pbox->x1;
- if (y1 < pbox->y1)
- y1 = pbox->y1;
- if (x2 > pbox->x2)
- x2 = pbox->x2;
- if (y2 > pbox->y2)
- y2 = pbox->y2;
- if (x1 >= x2 || y1 >= y2)
- continue;
-
- src = bits + (y1 - y) * src_stride + (x1 - x) * (bpp / 8);
- ok = uxa_screen->info->put_image(pPix, x1 + xoff, y1 + yoff,
- x2 - x1, y2 - y1, src, src_stride);
- /* If we fail to accelerate the upload, fall back to using unaccelerated
- * fb calls.
- */
- if (!ok) {
- FbStip *dst;
- FbStride dst_stride;
- int dstBpp;
- int dstXoff, dstYoff;
+ nbox = REGION_NUM_RECTS(pClip);
+ if (nbox == 1) {
+ (*uxa_screen->info->solid) (pPixmap,
+ fullX1 + off_x,
+ fullY1 + off_y,
+ fullX2 + off_x,
+ fullY1 + 1 + off_y);
+ } else {
+ pbox = REGION_RECTS(pClip);
+ while (nbox--) {
+ if (pbox->y1 <= fullY1 && fullY1 < pbox->y2) {
+ partX1 = pbox->x1;
+ if (partX1 < fullX1)
+ partX1 = fullX1;
+ partX2 = pbox->x2;
+ if (partX2 > fullX2)
+ partX2 = fullX2;
+ if (partX2 > partX1) {
+ (*uxa_screen->info->
+ solid) (pPixmap,
+ partX1 + off_x,
+ fullY1 + off_y,
+ partX2 + off_x,
+ fullY1 + 1 + off_y);
+ }
+ }
+ pbox++;
+ }
+ }
+ }
+ (*uxa_screen->info->done_solid) (pPixmap);
+}
- if (!access_prepared) {
- if (!uxa_prepare_access(pDrawable, UXA_ACCESS_RW))
- return FALSE;
- access_prepared = TRUE;
- }
-
- fbGetStipDrawable(pDrawable, dst, dst_stride, dstBpp,
- dstXoff, dstYoff);
-
- fbBltStip((FbStip *)bits + (y1 - y) * (src_stride / sizeof(FbStip)),
- src_stride / sizeof(FbStip),
- (x1 - x) * dstBpp,
- dst + (y1 + dstYoff) * dst_stride,
- dst_stride,
- (x1 + dstXoff) * dstBpp,
- (x2 - x1) * dstBpp,
- y2 - y1,
- GXcopy, FB_ALLONES, dstBpp);
+static Bool
+uxa_do_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
+ int w, int h, int format, char *bits, int src_stride)
+{
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDrawable->pScreen);
+ PixmapPtr pPix = uxa_get_drawable_pixmap(pDrawable);
+ RegionPtr pClip;
+ BoxPtr pbox;
+ int nbox;
+ int xoff, yoff;
+ int bpp = pDrawable->bitsPerPixel;
+ Bool access_prepared = FALSE;
+
+ /* Don't bother with under 8bpp, XYPixmaps. */
+ if (format != ZPixmap || bpp < 8)
+ return FALSE;
+
+ /* Only accelerate copies: no rop or planemask. */
+ if (!UXA_PM_IS_SOLID(pDrawable, pGC->planemask) || pGC->alu != GXcopy)
+ return FALSE;
+
+ if (uxa_screen->swappedOut)
+ return FALSE;
+
+ pPix = uxa_get_offscreen_pixmap(pDrawable, &xoff, &yoff);
+
+ if (!pPix || !uxa_screen->info->put_image)
+ return FALSE;
+
+ x += pDrawable->x;
+ y += pDrawable->y;
+
+ pClip = fbGetCompositeClip(pGC);
+ for (nbox = REGION_NUM_RECTS(pClip),
+ pbox = REGION_RECTS(pClip); nbox--; pbox++) {
+ int x1 = x;
+ int y1 = y;
+ int x2 = x + w;
+ int y2 = y + h;
+ char *src;
+ Bool ok;
+
+ if (x1 < pbox->x1)
+ x1 = pbox->x1;
+ if (y1 < pbox->y1)
+ y1 = pbox->y1;
+ if (x2 > pbox->x2)
+ x2 = pbox->x2;
+ if (y2 > pbox->y2)
+ y2 = pbox->y2;
+ if (x1 >= x2 || y1 >= y2)
+ continue;
+
+ src = bits + (y1 - y) * src_stride + (x1 - x) * (bpp / 8);
+ ok = uxa_screen->info->put_image(pPix, x1 + xoff, y1 + yoff,
+ x2 - x1, y2 - y1, src,
+ src_stride);
+ /* If we fail to accelerate the upload, fall back to using
+ * unaccelerated fb calls.
+ */
+ if (!ok) {
+ FbStip *dst;
+ FbStride dst_stride;
+ int dstBpp;
+ int dstXoff, dstYoff;
+
+ if (!access_prepared) {
+ if (!uxa_prepare_access
+ (pDrawable, UXA_ACCESS_RW))
+ return FALSE;
+ access_prepared = TRUE;
+ }
+
+ fbGetStipDrawable(pDrawable, dst, dst_stride, dstBpp,
+ dstXoff, dstYoff);
+
+ fbBltStip((FbStip *) bits +
+ (y1 - y) * (src_stride / sizeof(FbStip)),
+ src_stride / sizeof(FbStip),
+ (x1 - x) * dstBpp,
+ dst + (y1 + dstYoff) * dst_stride, dst_stride,
+ (x1 + dstXoff) * dstBpp, (x2 - x1) * dstBpp,
+ y2 - y1, GXcopy, FB_ALLONES, dstBpp);
+ }
}
- }
- if (access_prepared)
- uxa_finish_access(pDrawable);
+ if (access_prepared)
+ uxa_finish_access(pDrawable);
- return TRUE;
+ return TRUE;
}
#ifdef MITSHM
@@ -220,37 +215,39 @@ uxa_do_put_image (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
static Bool
uxa_do_shm_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth,
- unsigned int format, int w, int h, int sx, int sy, int sw,
- int sh, int dx, int dy, char *data)
+ unsigned int format, int w, int h, int sx, int sy, int sw,
+ int sh, int dx, int dy, char *data)
{
- int src_stride = PixmapBytePad(w, depth);
+ int src_stride = PixmapBytePad(w, depth);
- if (uxa_do_put_image(pDrawable, pGC, depth, dx, dy, sw, sh, format, data +
- sy * src_stride + sx * BitsPerPixel(depth) / 8,
- src_stride))
- return TRUE;
+ if (uxa_do_put_image
+ (pDrawable, pGC, depth, dx, dy, sw, sh, format,
+ data + sy * src_stride + sx * BitsPerPixel(depth) / 8, src_stride))
+ return TRUE;
- if (format == ZPixmap)
- {
- PixmapPtr pPixmap;
+ if (format == ZPixmap) {
+ PixmapPtr pPixmap;
- pPixmap = GetScratchPixmapHeader(pDrawable->pScreen, w, h, depth,
- BitsPerPixel(depth), PixmapBytePad(w, depth),
- (pointer)data);
- if (!pPixmap)
- return FALSE;
+ pPixmap =
+ GetScratchPixmapHeader(pDrawable->pScreen, w, h, depth,
+ BitsPerPixel(depth), PixmapBytePad(w,
+ depth),
+ (pointer) data);
+ if (!pPixmap)
+ return FALSE;
- if (!uxa_prepare_access (pDrawable, UXA_ACCESS_RW))
- return FALSE;
- fbCopyArea((DrawablePtr)pPixmap, pDrawable, pGC, sx, sy, sw, sh, dx, dy);
- uxa_finish_access(pDrawable);
+ if (!uxa_prepare_access(pDrawable, UXA_ACCESS_RW))
+ return FALSE;
+ fbCopyArea((DrawablePtr) pPixmap, pDrawable, pGC, sx, sy, sw,
+ sh, dx, dy);
+ uxa_finish_access(pDrawable);
- FreeScratchPixmapHeader(pPixmap);
+ FreeScratchPixmapHeader(pPixmap);
- return TRUE;
- }
+ return TRUE;
+ }
- return FALSE;
+ return FALSE;
}
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,5,99,0,0)
@@ -262,18 +259,19 @@ uxa_do_shm_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth,
* cases.
*/
void
-uxa_shm_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth, unsigned int format,
- int w, int h, int sx, int sy, int sw, int sh, int dx, int dy,
- char *data)
+uxa_shm_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth,
+ unsigned int format, int w, int h, int sx, int sy, int sw,
+ int sh, int dx, int dy, char *data)
{
- if (!uxa_do_shm_put_image(pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh,
- dx, dy, data)) {
- if (!uxa_prepare_access (pDrawable, UXA_ACCESS_RW))
- return;
- fbShmPutImage(pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy,
- data);
- uxa_finish_access(pDrawable);
- }
+ if (!uxa_do_shm_put_image
+ (pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy,
+ data)) {
+ if (!uxa_prepare_access(pDrawable, UXA_ACCESS_RW))
+ return;
+ fbShmPutImage(pDrawable, pGC, depth, format, w, h, sx, sy, sw,
+ sh, dx, dy, data);
+ uxa_finish_access(pDrawable);
+ }
}
#else
#define uxa_shm_put_image NULL
@@ -284,257 +282,264 @@ ShmFuncs uxa_shm_funcs = { NULL, uxa_shm_put_image };
#endif
static void
-uxa_put_image (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
- int w, int h, int leftPad, int format, char *bits)
+uxa_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
+ int w, int h, int leftPad, int format, char *bits)
{
#ifdef MITSHM
- if (!uxa_do_shm_put_image(pDrawable, pGC, depth, format, w, h, 0, 0, w, h, x, y,
- bits))
+ if (!uxa_do_shm_put_image
+ (pDrawable, pGC, depth, format, w, h, 0, 0, w, h, x, y, bits))
#else
- if (!uxa_do_put_image(pDrawable, pGC, depth, x, y, w, h, format, bits,
- PixmapBytePad(w, pDrawable->depth)))
+ if (!uxa_do_put_image(pDrawable, pGC, depth, x, y, w, h, format, bits,
+ PixmapBytePad(w, pDrawable->depth)))
#endif
- uxa_check_put_image(pDrawable, pGC, depth, x, y, w, h, leftPad, format,
- bits);
+ uxa_check_put_image(pDrawable, pGC, depth, x, y, w, h, leftPad,
+ format, bits);
}
static Bool inline
-uxa_copy_n_to_n_two_dir (DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable,
- GCPtr pGC, BoxPtr pbox, int nbox, int dx, int dy)
+uxa_copy_n_to_n_two_dir(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable,
+ GCPtr pGC, BoxPtr pbox, int nbox, int dx, int dy)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pDstDrawable->pScreen);
- PixmapPtr pSrcPixmap, pDstPixmap;
- int src_off_x, src_off_y, dst_off_x, dst_off_y;
- int dirsetup;
-
- /* Need to get both pixmaps to call the driver routines */
- pSrcPixmap = uxa_get_offscreen_pixmap (pSrcDrawable, &src_off_x, &src_off_y);
- pDstPixmap = uxa_get_offscreen_pixmap (pDstDrawable, &dst_off_x, &dst_off_y);
- if (!pSrcPixmap || !pDstPixmap)
- return FALSE;
-
- /*
- * Now the case of a chip that only supports xdir = ydir = 1 or
- * xdir = ydir = -1, but we have xdir != ydir.
- */
- dirsetup = 0; /* No direction set up yet. */
- for (; nbox; pbox++, nbox--) {
- if (dx >= 0 && (src_off_y + pbox->y1 + dy) != pbox->y1) {
- /* Do a xdir = ydir = -1 blit instead. */
- if (dirsetup != -1) {
- if (dirsetup != 0)
- uxa_screen->info->done_copy(pDstPixmap);
- dirsetup = -1;
- if (!(*uxa_screen->info->prepare_copy)(pSrcPixmap,
- pDstPixmap,
- -1, -1,
- pGC ? pGC->alu : GXcopy,
- pGC ? pGC->planemask :
- FB_ALLONES))
- return FALSE;
- }
- (*uxa_screen->info->copy)(pDstPixmap,
- src_off_x + pbox->x1 + dx,
- src_off_y + pbox->y1 + dy,
- dst_off_x + pbox->x1,
- dst_off_y + pbox->y1,
- pbox->x2 - pbox->x1,
- pbox->y2 - pbox->y1);
- } else if (dx < 0 && (src_off_y + pbox->y1 + dy) != pbox->y1) {
- /* Do a xdir = ydir = 1 blit instead. */
- if (dirsetup != 1) {
- if (dirsetup != 0)
- uxa_screen->info->done_copy(pDstPixmap);
- dirsetup = 1;
- if (!(*uxa_screen->info->prepare_copy)(pSrcPixmap,
- pDstPixmap,
- 1, 1,
- pGC ? pGC->alu : GXcopy,
- pGC ? pGC->planemask :
- FB_ALLONES))
- return FALSE;
- }
- (*uxa_screen->info->copy)(pDstPixmap,
- src_off_x + pbox->x1 + dx,
- src_off_y + pbox->y1 + dy,
- dst_off_x + pbox->x1,
- dst_off_y + pbox->y1,
- pbox->x2 - pbox->x1,
- pbox->y2 - pbox->y1);
- } else if (dx >= 0) {
- /*
- * xdir = 1, ydir = -1.
- * Perform line-by-line xdir = ydir = 1 blits, going up.
- */
- int i;
- if (dirsetup != 1) {
- if (dirsetup != 0)
- uxa_screen->info->done_copy(pDstPixmap);
- dirsetup = 1;
- if (!(*uxa_screen->info->prepare_copy)(pSrcPixmap,
- pDstPixmap,
- 1, 1,
- pGC ? pGC->alu : GXcopy,
- pGC ? pGC->planemask :
- FB_ALLONES))
- return FALSE;
- }
- for (i = pbox->y2 - pbox->y1 - 1; i >= 0; i--)
- (*uxa_screen->info->copy)(pDstPixmap,
- src_off_x + pbox->x1 + dx,
- src_off_y + pbox->y1 + dy + i,
- dst_off_x + pbox->x1,
- dst_off_y + pbox->y1 + i,
- pbox->x2 - pbox->x1, 1);
- } else {
- /*
- * xdir = -1, ydir = 1.
- * Perform line-by-line xdir = ydir = -1 blits, going down.
- */
- int i;
- if (dirsetup != -1) {
- if (dirsetup != 0)
- uxa_screen->info->done_copy(pDstPixmap);
- dirsetup = -1;
- if (!(*uxa_screen->info->prepare_copy)(pSrcPixmap,
- pDstPixmap,
- -1, -1,
- pGC ? pGC->alu : GXcopy,
- pGC ? pGC->planemask :
- FB_ALLONES))
- return FALSE;
- }
- for (i = 0; i < pbox->y2 - pbox->y1; i++)
- (*uxa_screen->info->copy)(pDstPixmap,
- src_off_x + pbox->x1 + dx,
- src_off_y + pbox->y1 + dy + i,
- dst_off_x + pbox->x1,
- dst_off_y + pbox->y1 + i,
- pbox->x2 - pbox->x1, 1);
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDstDrawable->pScreen);
+ PixmapPtr pSrcPixmap, pDstPixmap;
+ int src_off_x, src_off_y, dst_off_x, dst_off_y;
+ int dirsetup;
+
+ /* Need to get both pixmaps to call the driver routines */
+ pSrcPixmap =
+ uxa_get_offscreen_pixmap(pSrcDrawable, &src_off_x, &src_off_y);
+ pDstPixmap =
+ uxa_get_offscreen_pixmap(pDstDrawable, &dst_off_x, &dst_off_y);
+ if (!pSrcPixmap || !pDstPixmap)
+ return FALSE;
+
+ /*
+ * Now the case of a chip that only supports xdir = ydir = 1 or
+ * xdir = ydir = -1, but we have xdir != ydir.
+ */
+ dirsetup = 0; /* No direction set up yet. */
+ for (; nbox; pbox++, nbox--) {
+ if (dx >= 0 && (src_off_y + pbox->y1 + dy) != pbox->y1) {
+ /* Do a xdir = ydir = -1 blit instead. */
+ if (dirsetup != -1) {
+ if (dirsetup != 0)
+ uxa_screen->info->done_copy(pDstPixmap);
+ dirsetup = -1;
+ if (!(*uxa_screen->info->prepare_copy)
+ (pSrcPixmap, pDstPixmap, -1, -1,
+ pGC ? pGC->alu : GXcopy,
+ pGC ? pGC->planemask : FB_ALLONES))
+ return FALSE;
+ }
+ (*uxa_screen->info->copy) (pDstPixmap,
+ src_off_x + pbox->x1 + dx,
+ src_off_y + pbox->y1 + dy,
+ dst_off_x + pbox->x1,
+ dst_off_y + pbox->y1,
+ pbox->x2 - pbox->x1,
+ pbox->y2 - pbox->y1);
+ } else if (dx < 0 && (src_off_y + pbox->y1 + dy) != pbox->y1) {
+ /* Do a xdir = ydir = 1 blit instead. */
+ if (dirsetup != 1) {
+ if (dirsetup != 0)
+ uxa_screen->info->done_copy(pDstPixmap);
+ dirsetup = 1;
+ if (!(*uxa_screen->info->prepare_copy)
+ (pSrcPixmap, pDstPixmap, 1, 1,
+ pGC ? pGC->alu : GXcopy,
+ pGC ? pGC->planemask : FB_ALLONES))
+ return FALSE;
+ }
+ (*uxa_screen->info->copy) (pDstPixmap,
+ src_off_x + pbox->x1 + dx,
+ src_off_y + pbox->y1 + dy,
+ dst_off_x + pbox->x1,
+ dst_off_y + pbox->y1,
+ pbox->x2 - pbox->x1,
+ pbox->y2 - pbox->y1);
+ } else if (dx >= 0) {
+ /*
+ * xdir = 1, ydir = -1.
+ * Perform line-by-line xdir = ydir = 1 blits, going up.
+ */
+ int i;
+ if (dirsetup != 1) {
+ if (dirsetup != 0)
+ uxa_screen->info->done_copy(pDstPixmap);
+ dirsetup = 1;
+ if (!(*uxa_screen->info->prepare_copy)
+ (pSrcPixmap, pDstPixmap, 1, 1,
+ pGC ? pGC->alu : GXcopy,
+ pGC ? pGC->planemask : FB_ALLONES))
+ return FALSE;
+ }
+ for (i = pbox->y2 - pbox->y1 - 1; i >= 0; i--)
+ (*uxa_screen->info->copy) (pDstPixmap,
+ src_off_x +
+ pbox->x1 + dx,
+ src_off_y +
+ pbox->y1 + dy + i,
+ dst_off_x + pbox->x1,
+ dst_off_y +
+ pbox->y1 + i,
+ pbox->x2 - pbox->x1,
+ 1);
+ } else {
+ /*
+ * xdir = -1, ydir = 1.
+ * Perform line-by-line xdir = ydir = -1 blits,
+ * going down.
+ */
+ int i;
+ if (dirsetup != -1) {
+ if (dirsetup != 0)
+ uxa_screen->info->done_copy(pDstPixmap);
+ dirsetup = -1;
+ if (!(*uxa_screen->info->prepare_copy)
+ (pSrcPixmap, pDstPixmap, -1, -1,
+ pGC ? pGC->alu : GXcopy,
+ pGC ? pGC->planemask : FB_ALLONES))
+ return FALSE;
+ }
+ for (i = 0; i < pbox->y2 - pbox->y1; i++)
+ (*uxa_screen->info->copy) (pDstPixmap,
+ src_off_x +
+ pbox->x1 + dx,
+ src_off_y +
+ pbox->y1 + dy + i,
+ dst_off_x + pbox->x1,
+ dst_off_y +
+ pbox->y1 + i,
+ pbox->x2 - pbox->x1,
+ 1);
+ }
}
- }
- if (dirsetup != 0)
- uxa_screen->info->done_copy(pDstPixmap);
- return TRUE;
+ if (dirsetup != 0)
+ uxa_screen->info->done_copy(pDstPixmap);
+ return TRUE;
}
void
-uxa_copy_n_to_n (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure)
+uxa_copy_n_to_n(DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse, Bool upsidedown, Pixel bitplane, void *closure)
{
- ScreenPtr screen = pDstDrawable->pScreen;
- uxa_screen_t *uxa_screen = uxa_get_screen(screen);
- int src_off_x, src_off_y;
- int dst_off_x, dst_off_y;
- PixmapPtr pSrcPixmap, pDstPixmap;
-
- pSrcPixmap = uxa_get_drawable_pixmap (pSrcDrawable);
- pDstPixmap = uxa_get_drawable_pixmap (pDstDrawable);
-
- uxa_get_drawable_deltas (pSrcDrawable, pSrcPixmap, &src_off_x, &src_off_y);
- uxa_get_drawable_deltas (pDstDrawable, pDstPixmap, &dst_off_x, &dst_off_y);
-
- /* Mixed directions must be handled specially if the card is lame */
- if ((uxa_screen->info->flags & UXA_TWO_BITBLT_DIRECTIONS) &&
- reverse != upsidedown) {
- if (uxa_copy_n_to_n_two_dir(pSrcDrawable, pDstDrawable, pGC, pbox, nbox,
- dx, dy))
- return;
- goto fallback;
- }
-
- if (!uxa_pixmap_is_offscreen(pSrcPixmap) ||
- !uxa_pixmap_is_offscreen(pDstPixmap) ||
- !(*uxa_screen->info->prepare_copy) (pSrcPixmap, pDstPixmap, reverse ? -1 : 1,
- upsidedown ? -1 : 1,
- pGC ? pGC->alu : GXcopy,
- pGC ? pGC->planemask : FB_ALLONES)) {
- goto fallback;
- }
-
- while (nbox--)
- {
- (*uxa_screen->info->copy) (pDstPixmap,
- pbox->x1 + dx + src_off_x,
- pbox->y1 + dy + src_off_y,
- pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
- pbox->x2 - pbox->x1, pbox->y2 - pbox->y1);
- pbox++;
- }
-
- (*uxa_screen->info->done_copy) (pDstPixmap);
-
- return;
+ ScreenPtr screen = pDstDrawable->pScreen;
+ uxa_screen_t *uxa_screen = uxa_get_screen(screen);
+ int src_off_x, src_off_y;
+ int dst_off_x, dst_off_y;
+ PixmapPtr pSrcPixmap, pDstPixmap;
+
+ pSrcPixmap = uxa_get_drawable_pixmap(pSrcDrawable);
+ pDstPixmap = uxa_get_drawable_pixmap(pDstDrawable);
+
+ uxa_get_drawable_deltas(pSrcDrawable, pSrcPixmap, &src_off_x,
+ &src_off_y);
+ uxa_get_drawable_deltas(pDstDrawable, pDstPixmap, &dst_off_x,
+ &dst_off_y);
+
+ /* Mixed directions must be handled specially if the card is lame */
+ if ((uxa_screen->info->flags & UXA_TWO_BITBLT_DIRECTIONS) &&
+ reverse != upsidedown) {
+ if (uxa_copy_n_to_n_two_dir
+ (pSrcDrawable, pDstDrawable, pGC, pbox, nbox, dx, dy))
+ return;
+ goto fallback;
+ }
+
+ if (!uxa_pixmap_is_offscreen(pSrcPixmap) ||
+ !uxa_pixmap_is_offscreen(pDstPixmap) ||
+ !(*uxa_screen->info->prepare_copy) (pSrcPixmap, pDstPixmap,
+ reverse ? -1 : 1,
+ upsidedown ? -1 : 1,
+ pGC ? pGC->alu : GXcopy,
+ pGC ? pGC->
+ planemask : FB_ALLONES)) {
+ goto fallback;
+ }
+
+ while (nbox--) {
+ (*uxa_screen->info->copy) (pDstPixmap,
+ pbox->x1 + dx + src_off_x,
+ pbox->y1 + dy + src_off_y,
+ pbox->x1 + dst_off_x,
+ pbox->y1 + dst_off_y,
+ pbox->x2 - pbox->x1,
+ pbox->y2 - pbox->y1);
+ pbox++;
+ }
+
+ (*uxa_screen->info->done_copy) (pDstPixmap);
+
+ return;
fallback:
- UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrcDrawable, pDstDrawable,
- uxa_drawable_location(pSrcDrawable),
- uxa_drawable_location(pDstDrawable)));
- if (uxa_prepare_access (pDstDrawable, UXA_ACCESS_RW)) {
- if (uxa_prepare_access (pSrcDrawable, UXA_ACCESS_RO)) {
- fbCopyNtoN (pSrcDrawable, pDstDrawable, pGC, pbox, nbox, dx, dy,
- reverse, upsidedown, bitplane, closure);
- uxa_finish_access (pSrcDrawable);
+ UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrcDrawable, pDstDrawable,
+ uxa_drawable_location(pSrcDrawable),
+ uxa_drawable_location(pDstDrawable)));
+ if (uxa_prepare_access(pDstDrawable, UXA_ACCESS_RW)) {
+ if (uxa_prepare_access(pSrcDrawable, UXA_ACCESS_RO)) {
+ fbCopyNtoN(pSrcDrawable, pDstDrawable, pGC, pbox, nbox,
+ dx, dy, reverse, upsidedown, bitplane,
+ closure);
+ uxa_finish_access(pSrcDrawable);
+ }
+ uxa_finish_access(pDstDrawable);
}
- uxa_finish_access (pDstDrawable);
- }
}
RegionPtr
uxa_copy_area(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
- int srcx, int srcy, int width, int height, int dstx, int dsty)
+ int srcx, int srcy, int width, int height, int dstx, int dsty)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pDstDrawable->pScreen);
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDstDrawable->pScreen);
- if (uxa_screen->swappedOut) {
- return uxa_check_copy_area(pSrcDrawable, pDstDrawable, pGC,
- srcx, srcy, width, height, dstx, dsty);
- }
+ if (uxa_screen->swappedOut) {
+ return uxa_check_copy_area(pSrcDrawable, pDstDrawable, pGC,
+ srcx, srcy, width, height, dstx,
+ dsty);
+ }
- return miDoCopy (pSrcDrawable, pDstDrawable, pGC,
- srcx, srcy, width, height,
- dstx, dsty, uxa_copy_n_to_n, 0, NULL);
+ return miDoCopy(pSrcDrawable, pDstDrawable, pGC,
+ srcx, srcy, width, height,
+ dstx, dsty, uxa_copy_n_to_n, 0, NULL);
}
static void
uxa_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
- DDXPointPtr ppt)
+ DDXPointPtr ppt)
{
- int i;
- xRectangle *prect;
-
- /* If we can't reuse the current GC as is, don't bother accelerating the
- * points.
- */
- if (pGC->fillStyle != FillSolid) {
- uxa_check_poly_point(pDrawable, pGC, mode, npt, ppt);
- return;
- }
+ int i;
+ xRectangle *prect;
- prect = xalloc(sizeof(xRectangle) * npt);
- if (!prect)
- return;
- for (i = 0; i < npt; i++) {
- prect[i].x = ppt[i].x;
- prect[i].y = ppt[i].y;
- if (i > 0 && mode == CoordModePrevious) {
- prect[i].x += prect[i - 1].x;
- prect[i].y += prect[i - 1].y;
+ /* If we can't reuse the current GC as is, don't bother accelerating the
+ * points.
+ */
+ if (pGC->fillStyle != FillSolid) {
+ uxa_check_poly_point(pDrawable, pGC, mode, npt, ppt);
+ return;
+ }
+
+ prect = xalloc(sizeof(xRectangle) * npt);
+ if (!prect)
+ return;
+ for (i = 0; i < npt; i++) {
+ prect[i].x = ppt[i].x;
+ prect[i].y = ppt[i].y;
+ if (i > 0 && mode == CoordModePrevious) {
+ prect[i].x += prect[i - 1].x;
+ prect[i].y += prect[i - 1].y;
+ }
+ prect[i].width = 1;
+ prect[i].height = 1;
}
- prect[i].width = 1;
- prect[i].height = 1;
- }
- pGC->ops->PolyFillRect(pDrawable, pGC, npt, prect);
- xfree(prect);
+ pGC->ops->PolyFillRect(pDrawable, pGC, npt, prect);
+ xfree(prect);
}
/**
@@ -546,58 +551,58 @@ static void
uxa_poly_lines(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
DDXPointPtr ppt)
{
- xRectangle *prect;
- int x1, x2, y1, y2;
- int i;
-
- /* Don't try to do wide lines or non-solid fill style. */
- if (pGC->lineWidth != 0 || pGC->lineStyle != LineSolid ||
- pGC->fillStyle != FillSolid) {
- uxa_check_poly_lines(pDrawable, pGC, mode, npt, ppt);
- return;
- }
-
- prect = xalloc(sizeof(xRectangle) * (npt - 1));
- if (!prect)
- return;
- x1 = ppt[0].x;
- y1 = ppt[0].y;
- /* If we have any non-horizontal/vertical, fall back. */
- for (i = 0; i < npt - 1; i++) {
- if (mode == CoordModePrevious) {
- x2 = x1 + ppt[i + 1].x;
- y2 = y1 + ppt[i + 1].y;
- } else {
- x2 = ppt[i + 1].x;
- y2 = ppt[i + 1].y;
+ xRectangle *prect;
+ int x1, x2, y1, y2;
+ int i;
+
+ /* Don't try to do wide lines or non-solid fill style. */
+ if (pGC->lineWidth != 0 || pGC->lineStyle != LineSolid ||
+ pGC->fillStyle != FillSolid) {
+ uxa_check_poly_lines(pDrawable, pGC, mode, npt, ppt);
+ return;
}
- if (x1 != x2 && y1 != y2) {
- xfree(prect);
- uxa_check_poly_lines(pDrawable, pGC, mode, npt, ppt);
- return;
- }
+ prect = xalloc(sizeof(xRectangle) * (npt - 1));
+ if (!prect)
+ return;
+ x1 = ppt[0].x;
+ y1 = ppt[0].y;
+ /* If we have any non-horizontal/vertical, fall back. */
+ for (i = 0; i < npt - 1; i++) {
+ if (mode == CoordModePrevious) {
+ x2 = x1 + ppt[i + 1].x;
+ y2 = y1 + ppt[i + 1].y;
+ } else {
+ x2 = ppt[i + 1].x;
+ y2 = ppt[i + 1].y;
+ }
- if (x1 < x2) {
- prect[i].x = x1;
- prect[i].width = x2 - x1 + 1;
- } else {
- prect[i].x = x2;
- prect[i].width = x1 - x2 + 1;
- }
- if (y1 < y2) {
- prect[i].y = y1;
- prect[i].height = y2 - y1 + 1;
- } else {
- prect[i].y = y2;
- prect[i].height = y1 - y2 + 1;
- }
+ if (x1 != x2 && y1 != y2) {
+ xfree(prect);
+ uxa_check_poly_lines(pDrawable, pGC, mode, npt, ppt);
+ return;
+ }
- x1 = x2;
- y1 = y2;
- }
- pGC->ops->PolyFillRect(pDrawable, pGC, npt - 1, prect);
- xfree(prect);
+ if (x1 < x2) {
+ prect[i].x = x1;
+ prect[i].width = x2 - x1 + 1;
+ } else {
+ prect[i].x = x2;
+ prect[i].width = x1 - x2 + 1;
+ }
+ if (y1 < y2) {
+ prect[i].y = y1;
+ prect[i].height = y2 - y1 + 1;
+ } else {
+ prect[i].y = y2;
+ prect[i].height = y1 - y2 + 1;
+ }
+
+ x1 = x2;
+ y1 = y2;
+ }
+ pGC->ops->PolyFillRect(pDrawable, pGC, npt - 1, prect);
+ xfree(prect);
}
/**
@@ -606,382 +611,377 @@ uxa_poly_lines(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
* acceleration if so.
*/
static void
-uxa_poly_segment (DrawablePtr pDrawable, GCPtr pGC, int nseg,
- xSegment *pSeg)
+uxa_poly_segment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment * pSeg)
{
- xRectangle *prect;
- int i;
-
- /* Don't try to do wide lines or non-solid fill style. */
- if (pGC->lineWidth != 0 || pGC->lineStyle != LineSolid ||
- pGC->fillStyle != FillSolid)
- {
- uxa_check_poly_segment(pDrawable, pGC, nseg, pSeg);
- return;
- }
-
- /* If we have any non-horizontal/vertical, fall back. */
- for (i = 0; i < nseg; i++) {
- if (pSeg[i].x1 != pSeg[i].x2 && pSeg[i].y1 != pSeg[i].y2) {
- uxa_check_poly_segment(pDrawable, pGC, nseg, pSeg);
- return;
+ xRectangle *prect;
+ int i;
+
+ /* Don't try to do wide lines or non-solid fill style. */
+ if (pGC->lineWidth != 0 || pGC->lineStyle != LineSolid ||
+ pGC->fillStyle != FillSolid) {
+ uxa_check_poly_segment(pDrawable, pGC, nseg, pSeg);
+ return;
}
- }
- prect = xalloc(sizeof(xRectangle) * nseg);
- if (!prect)
- return;
- for (i = 0; i < nseg; i++) {
- if (pSeg[i].x1 < pSeg[i].x2) {
- prect[i].x = pSeg[i].x1;
- prect[i].width = pSeg[i].x2 - pSeg[i].x1 + 1;
- } else {
- prect[i].x = pSeg[i].x2;
- prect[i].width = pSeg[i].x1 - pSeg[i].x2 + 1;
- }
- if (pSeg[i].y1 < pSeg[i].y2) {
- prect[i].y = pSeg[i].y1;
- prect[i].height = pSeg[i].y2 - pSeg[i].y1 + 1;
- } else {
- prect[i].y = pSeg[i].y2;
- prect[i].height = pSeg[i].y1 - pSeg[i].y2 + 1;
+ /* If we have any non-horizontal/vertical, fall back. */
+ for (i = 0; i < nseg; i++) {
+ if (pSeg[i].x1 != pSeg[i].x2 && pSeg[i].y1 != pSeg[i].y2) {
+ uxa_check_poly_segment(pDrawable, pGC, nseg, pSeg);
+ return;
+ }
}
- /* don't paint last pixel */
- if (pGC->capStyle == CapNotLast) {
- if (prect[i].width == 1)
- prect[i].height--;
- else
- prect[i].width--;
+ prect = xalloc(sizeof(xRectangle) * nseg);
+ if (!prect)
+ return;
+ for (i = 0; i < nseg; i++) {
+ if (pSeg[i].x1 < pSeg[i].x2) {
+ prect[i].x = pSeg[i].x1;
+ prect[i].width = pSeg[i].x2 - pSeg[i].x1 + 1;
+ } else {
+ prect[i].x = pSeg[i].x2;
+ prect[i].width = pSeg[i].x1 - pSeg[i].x2 + 1;
+ }
+ if (pSeg[i].y1 < pSeg[i].y2) {
+ prect[i].y = pSeg[i].y1;
+ prect[i].height = pSeg[i].y2 - pSeg[i].y1 + 1;
+ } else {
+ prect[i].y = pSeg[i].y2;
+ prect[i].height = pSeg[i].y1 - pSeg[i].y2 + 1;
+ }
+
+ /* don't paint last pixel */
+ if (pGC->capStyle == CapNotLast) {
+ if (prect[i].width == 1)
+ prect[i].height--;
+ else
+ prect[i].width--;
+ }
}
- }
- pGC->ops->PolyFillRect(pDrawable, pGC, nseg, prect);
- xfree(prect);
+ pGC->ops->PolyFillRect(pDrawable, pGC, nseg, prect);
+ xfree(prect);
}
-static Bool uxa_fill_region_solid (DrawablePtr pDrawable, RegionPtr pRegion,
- Pixel pixel, CARD32 planemask, CARD32 alu);
+static Bool uxa_fill_region_solid(DrawablePtr pDrawable, RegionPtr pRegion,
+ Pixel pixel, CARD32 planemask, CARD32 alu);
static void
uxa_poly_fill_rect(DrawablePtr pDrawable,
- GCPtr pGC,
- int nrect,
- xRectangle *prect)
+ GCPtr pGC, int nrect, xRectangle * prect)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pDrawable->pScreen);
- RegionPtr pClip = fbGetCompositeClip(pGC);
- PixmapPtr pPixmap = uxa_get_drawable_pixmap(pDrawable);
- register BoxPtr pbox;
- BoxPtr pextent;
- int extentX1, extentX2, extentY1, extentY2;
- int fullX1, fullX2, fullY1, fullY2;
- int partX1, partX2, partY1, partY2;
- int xoff, yoff;
- int xorg, yorg;
- int n;
- RegionPtr pReg = RECTS_TO_REGION(pScreen, nrect, prect, CT_UNSORTED);
-
- /* Compute intersection of rects and clip region */
- REGION_TRANSLATE(pScreen, pReg, pDrawable->x, pDrawable->y);
- REGION_INTERSECT(pScreen, pReg, pClip, pReg);
-
- if (!REGION_NUM_RECTS(pReg))
- goto out;
-
- uxa_get_drawable_deltas(pDrawable, pPixmap, &xoff, &yoff);
-
- if (uxa_screen->swappedOut)
- goto fallback;
-
- /* For ROPs where overlaps don't matter, convert rectangles to region and
- * call uxa_fill_region_{solid,tiled}.
- */
- if ((pGC->fillStyle == FillSolid || pGC->fillStyle == FillTiled) &&
- (nrect == 1 || pGC->alu == GXcopy || pGC->alu == GXclear ||
- pGC->alu == GXnoop || pGC->alu == GXcopyInverted ||
- pGC->alu == GXset)) {
- if (((pGC->fillStyle == FillSolid || pGC->tileIsPixel) &&
- uxa_fill_region_solid(pDrawable, pReg, pGC->fillStyle == FillSolid ?
- pGC->fgPixel : pGC->tile.pixel, pGC->planemask,
- pGC->alu)) ||
- (pGC->fillStyle == FillTiled && !pGC->tileIsPixel &&
- uxa_fill_region_tiled(pDrawable, pReg, pGC->tile.pixmap, &pGC->patOrg,
- pGC->planemask, pGC->alu))) {
- goto out;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDrawable->pScreen);
+ RegionPtr pClip = fbGetCompositeClip(pGC);
+ PixmapPtr pPixmap = uxa_get_drawable_pixmap(pDrawable);
+ register BoxPtr pbox;
+ BoxPtr pextent;
+ int extentX1, extentX2, extentY1, extentY2;
+ int fullX1, fullX2, fullY1, fullY2;
+ int partX1, partX2, partY1, partY2;
+ int xoff, yoff;
+ int xorg, yorg;
+ int n;
+ RegionPtr pReg = RECTS_TO_REGION(pScreen, nrect, prect, CT_UNSORTED);
+
+ /* Compute intersection of rects and clip region */
+ REGION_TRANSLATE(pScreen, pReg, pDrawable->x, pDrawable->y);
+ REGION_INTERSECT(pScreen, pReg, pClip, pReg);
+
+ if (!REGION_NUM_RECTS(pReg))
+ goto out;
+
+ uxa_get_drawable_deltas(pDrawable, pPixmap, &xoff, &yoff);
+
+ if (uxa_screen->swappedOut)
+ goto fallback;
+
+ /* For ROPs where overlaps don't matter, convert rectangles to region
+ * and call uxa_fill_region_{solid,tiled}.
+ */
+ if ((pGC->fillStyle == FillSolid || pGC->fillStyle == FillTiled) &&
+ (nrect == 1 || pGC->alu == GXcopy || pGC->alu == GXclear ||
+ pGC->alu == GXnoop || pGC->alu == GXcopyInverted ||
+ pGC->alu == GXset)) {
+ if (((pGC->fillStyle == FillSolid || pGC->tileIsPixel) &&
+ uxa_fill_region_solid(pDrawable, pReg,
+ pGC->fillStyle ==
+ FillSolid ? pGC->fgPixel : pGC->tile.
+ pixel, pGC->planemask, pGC->alu))
+ || (pGC->fillStyle == FillTiled && !pGC->tileIsPixel
+ && uxa_fill_region_tiled(pDrawable, pReg,
+ pGC->tile.pixmap, &pGC->patOrg,
+ pGC->planemask, pGC->alu))) {
+ goto out;
+ }
}
- }
-
- if (pGC->fillStyle != FillSolid &&
- !(pGC->tileIsPixel && pGC->fillStyle == FillTiled))
- {
- goto fallback;
- }
-
- if (!uxa_pixmap_is_offscreen (pPixmap) ||
- !(*uxa_screen->info->prepare_solid) (pPixmap,
- pGC->alu,
- pGC->planemask,
- pGC->fgPixel))
- {
-fallback:
- uxa_check_poly_fill_rect (pDrawable, pGC, nrect, prect);
- goto out;
- }
-
- xorg = pDrawable->x;
- yorg = pDrawable->y;
-
- pextent = REGION_EXTENTS(pGC->pScreen, pClip);
- extentX1 = pextent->x1;
- extentY1 = pextent->y1;
- extentX2 = pextent->x2;
- extentY2 = pextent->y2;
- while (nrect--)
- {
- fullX1 = prect->x + xorg;
- fullY1 = prect->y + yorg;
- fullX2 = fullX1 + (int) prect->width;
- fullY2 = fullY1 + (int) prect->height;
- prect++;
-
- if (fullX1 < extentX1)
- fullX1 = extentX1;
-
- if (fullY1 < extentY1)
- fullY1 = extentY1;
-
- if (fullX2 > extentX2)
- fullX2 = extentX2;
-
- if (fullY2 > extentY2)
- fullY2 = extentY2;
-
- if ((fullX1 >= fullX2) || (fullY1 >= fullY2))
- continue;
- n = REGION_NUM_RECTS (pClip);
- if (n == 1)
- {
- (*uxa_screen->info->solid) (pPixmap,
- fullX1 + xoff, fullY1 + yoff,
- fullX2 + xoff, fullY2 + yoff);
+
+ if (pGC->fillStyle != FillSolid &&
+ !(pGC->tileIsPixel && pGC->fillStyle == FillTiled)) {
+ goto fallback;
}
- else
- {
- pbox = REGION_RECTS(pClip);
- /*
- * clip the rectangle to each box in the clip region
- * this is logically equivalent to calling Intersect(),
- * but rectangles may overlap each other here.
- */
- while(n--)
- {
- partX1 = pbox->x1;
- if (partX1 < fullX1)
- partX1 = fullX1;
- partY1 = pbox->y1;
- if (partY1 < fullY1)
- partY1 = fullY1;
- partX2 = pbox->x2;
- if (partX2 > fullX2)
- partX2 = fullX2;
- partY2 = pbox->y2;
- if (partY2 > fullY2)
- partY2 = fullY2;
- pbox++;
+ if (!uxa_pixmap_is_offscreen(pPixmap) ||
+ !(*uxa_screen->info->prepare_solid) (pPixmap,
+ pGC->alu,
+ pGC->planemask,
+ pGC->fgPixel)) {
+fallback:
+ uxa_check_poly_fill_rect(pDrawable, pGC, nrect, prect);
+ goto out;
+ }
- if (partX1 < partX2 && partY1 < partY2) {
- (*uxa_screen->info->solid) (pPixmap,
- partX1 + xoff, partY1 + yoff,
- partX2 + xoff, partY2 + yoff);
+ xorg = pDrawable->x;
+ yorg = pDrawable->y;
+
+ pextent = REGION_EXTENTS(pGC->pScreen, pClip);
+ extentX1 = pextent->x1;
+ extentY1 = pextent->y1;
+ extentX2 = pextent->x2;
+ extentY2 = pextent->y2;
+ while (nrect--) {
+ fullX1 = prect->x + xorg;
+ fullY1 = prect->y + yorg;
+ fullX2 = fullX1 + (int)prect->width;
+ fullY2 = fullY1 + (int)prect->height;
+ prect++;
+
+ if (fullX1 < extentX1)
+ fullX1 = extentX1;
+
+ if (fullY1 < extentY1)
+ fullY1 = extentY1;
+
+ if (fullX2 > extentX2)
+ fullX2 = extentX2;
+
+ if (fullY2 > extentY2)
+ fullY2 = extentY2;
+
+ if ((fullX1 >= fullX2) || (fullY1 >= fullY2))
+ continue;
+ n = REGION_NUM_RECTS(pClip);
+ if (n == 1) {
+ (*uxa_screen->info->solid) (pPixmap,
+ fullX1 + xoff,
+ fullY1 + yoff,
+ fullX2 + xoff,
+ fullY2 + yoff);
+ } else {
+ pbox = REGION_RECTS(pClip);
+ /*
+ * clip the rectangle to each box in the clip region
+ * this is logically equivalent to calling Intersect(),
+ * but rectangles may overlap each other here.
+ */
+ while (n--) {
+ partX1 = pbox->x1;
+ if (partX1 < fullX1)
+ partX1 = fullX1;
+ partY1 = pbox->y1;
+ if (partY1 < fullY1)
+ partY1 = fullY1;
+ partX2 = pbox->x2;
+ if (partX2 > fullX2)
+ partX2 = fullX2;
+ partY2 = pbox->y2;
+ if (partY2 > fullY2)
+ partY2 = fullY2;
+
+ pbox++;
+
+ if (partX1 < partX2 && partY1 < partY2) {
+ (*uxa_screen->info->solid) (pPixmap,
+ partX1 +
+ xoff,
+ partY1 +
+ yoff,
+ partX2 +
+ xoff,
+ partY2 +
+ yoff);
+ }
+ }
}
- }
}
- }
- (*uxa_screen->info->done_solid) (pPixmap);
+ (*uxa_screen->info->done_solid) (pPixmap);
out:
- REGION_UNINIT(pScreen, pReg);
- REGION_DESTROY(pScreen, pReg);
+ REGION_UNINIT(pScreen, pReg);
+ REGION_DESTROY(pScreen, pReg);
}
const GCOps uxa_ops = {
- uxa_fill_spans,
- uxa_check_set_spans,
- uxa_put_image,
- uxa_copy_area,
- uxa_check_copy_plane,
- uxa_poly_point,
- uxa_poly_lines,
- uxa_poly_segment,
- miPolyRectangle,
- uxa_check_poly_arc,
- miFillPolygon,
- uxa_poly_fill_rect,
- miPolyFillArc,
- miPolyText8,
- miPolyText16,
- miImageText8,
- miImageText16,
- uxa_check_image_glyph_blt,
- uxa_check_poly_glyph_blt,
- uxa_check_push_pixels,
+ uxa_fill_spans,
+ uxa_check_set_spans,
+ uxa_put_image,
+ uxa_copy_area,
+ uxa_check_copy_plane,
+ uxa_poly_point,
+ uxa_poly_lines,
+ uxa_poly_segment,
+ miPolyRectangle,
+ uxa_check_poly_arc,
+ miFillPolygon,
+ uxa_poly_fill_rect,
+ miPolyFillArc,
+ miPolyText8,
+ miPolyText16,
+ miImageText8,
+ miImageText16,
+ uxa_check_image_glyph_blt,
+ uxa_check_poly_glyph_blt,
+ uxa_check_push_pixels,
};
-void
-uxa_copy_window(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
+void uxa_copy_window(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
{
- RegionRec rgnDst;
- int dx, dy;
- PixmapPtr pPixmap = (*pWin->drawable.pScreen->GetWindowPixmap) (pWin);
+ RegionRec rgnDst;
+ int dx, dy;
+ PixmapPtr pPixmap = (*pWin->drawable.pScreen->GetWindowPixmap) (pWin);
- dx = ptOldOrg.x - pWin->drawable.x;
- dy = ptOldOrg.y - pWin->drawable.y;
- REGION_TRANSLATE(pWin->drawable.pScreen, prgnSrc, -dx, -dy);
+ dx = ptOldOrg.x - pWin->drawable.x;
+ dy = ptOldOrg.y - pWin->drawable.y;
+ REGION_TRANSLATE(pWin->drawable.pScreen, prgnSrc, -dx, -dy);
- REGION_INIT (pWin->drawable.pScreen, &rgnDst, NullBox, 0);
+ REGION_INIT(pWin->drawable.pScreen, &rgnDst, NullBox, 0);
- REGION_INTERSECT(pWin->drawable.pScreen, &rgnDst, &pWin->borderClip, prgnSrc);
+ REGION_INTERSECT(pWin->drawable.pScreen, &rgnDst, &pWin->borderClip,
+ prgnSrc);
#ifdef COMPOSITE
- if (pPixmap->screen_x || pPixmap->screen_y)
- REGION_TRANSLATE (pWin->drawable.pScreen, &rgnDst,
- -pPixmap->screen_x, -pPixmap->screen_y);
+ if (pPixmap->screen_x || pPixmap->screen_y)
+ REGION_TRANSLATE(pWin->drawable.pScreen, &rgnDst,
+ -pPixmap->screen_x, -pPixmap->screen_y);
#endif
- miCopyRegion (&pPixmap->drawable, &pPixmap->drawable,
- NULL,
- &rgnDst, dx, dy, uxa_copy_n_to_n, 0, NULL);
+ miCopyRegion(&pPixmap->drawable, &pPixmap->drawable,
+ NULL, &rgnDst, dx, dy, uxa_copy_n_to_n, 0, NULL);
- REGION_UNINIT(pWin->drawable.pScreen, &rgnDst);
+ REGION_UNINIT(pWin->drawable.pScreen, &rgnDst);
}
static Bool
-uxa_fill_region_solid (DrawablePtr pDrawable,
- RegionPtr pRegion,
- Pixel pixel,
- CARD32 planemask,
- CARD32 alu)
+uxa_fill_region_solid(DrawablePtr pDrawable,
+ RegionPtr pRegion,
+ Pixel pixel, CARD32 planemask, CARD32 alu)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pDrawable->pScreen);
- PixmapPtr pPixmap = uxa_get_drawable_pixmap (pDrawable);
- int xoff, yoff;
- Bool ret = FALSE;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDrawable->pScreen);
+ PixmapPtr pPixmap = uxa_get_drawable_pixmap(pDrawable);
+ int xoff, yoff;
+ Bool ret = FALSE;
- uxa_get_drawable_deltas(pDrawable, pPixmap, &xoff, &yoff);
- REGION_TRANSLATE(pScreen, pRegion, xoff, yoff);
+ uxa_get_drawable_deltas(pDrawable, pPixmap, &xoff, &yoff);
+ REGION_TRANSLATE(pScreen, pRegion, xoff, yoff);
- if (uxa_pixmap_is_offscreen (pPixmap) &&
- (*uxa_screen->info->prepare_solid) (pPixmap, alu, planemask, pixel))
- {
- int nbox;
- BoxPtr pBox;
+ if (uxa_pixmap_is_offscreen(pPixmap) &&
+ (*uxa_screen->info->prepare_solid) (pPixmap, alu, planemask, pixel))
+ {
+ int nbox;
+ BoxPtr pBox;
- nbox = REGION_NUM_RECTS (pRegion);
- pBox = REGION_RECTS (pRegion);
+ nbox = REGION_NUM_RECTS(pRegion);
+ pBox = REGION_RECTS(pRegion);
- while (nbox--)
- {
- (*uxa_screen->info->solid) (pPixmap, pBox->x1, pBox->y1, pBox->x2,
- pBox->y2);
- pBox++;
- }
- (*uxa_screen->info->done_solid) (pPixmap);
+ while (nbox--) {
+ (*uxa_screen->info->solid) (pPixmap, pBox->x1, pBox->y1,
+ pBox->x2, pBox->y2);
+ pBox++;
+ }
+ (*uxa_screen->info->done_solid) (pPixmap);
- ret = TRUE;
- }
+ ret = TRUE;
+ }
- REGION_TRANSLATE(pScreen, pRegion, -xoff, -yoff);
+ REGION_TRANSLATE(pScreen, pRegion, -xoff, -yoff);
- return ret;
+ return ret;
}
/* Try to do an accelerated tile of the pTile into pRegion of pDrawable.
* Based on fbFillRegionTiled(), fbTile().
*/
Bool
-uxa_fill_region_tiled (DrawablePtr pDrawable,
- RegionPtr pRegion,
- PixmapPtr pTile,
- DDXPointPtr pPatOrg,
- CARD32 planemask,
- CARD32 alu)
+uxa_fill_region_tiled(DrawablePtr pDrawable,
+ RegionPtr pRegion,
+ PixmapPtr pTile,
+ DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pDrawable->pScreen);
- PixmapPtr pPixmap;
- int xoff, yoff;
- int tileWidth, tileHeight;
- int nbox = REGION_NUM_RECTS (pRegion);
- BoxPtr pBox = REGION_RECTS (pRegion);
- Bool ret = FALSE;
-
- tileWidth = pTile->drawable.width;
- tileHeight = pTile->drawable.height;
-
- /* If we're filling with a solid color, grab it out and go to
- * FillRegionsolid, saving numerous copies.
- */
- if (tileWidth == 1 && tileHeight == 1)
- return uxa_fill_region_solid(pDrawable, pRegion,
- uxa_get_pixmap_first_pixel (pTile), planemask,
- alu);
-
- pPixmap = uxa_get_drawable_pixmap (pDrawable);
- uxa_get_drawable_deltas(pDrawable, pPixmap, &xoff, &yoff);
- REGION_TRANSLATE(pScreen, pRegion, xoff, yoff);
-
- pPixmap = uxa_get_offscreen_pixmap (pDrawable, &xoff, &yoff);
-
- if (!pPixmap || !uxa_pixmap_is_offscreen(pTile))
- goto out;
-
- if ((*uxa_screen->info->prepare_copy) (pTile, pPixmap, 1, 1, alu, planemask))
- {
- while (nbox--)
- {
- int height = pBox->y2 - pBox->y1;
- int dstY = pBox->y1;
- int tileY;
-
- modulus(dstY - yoff - pDrawable->y - pPatOrg->y, tileHeight, tileY);
-
- while (height > 0) {
- int width = pBox->x2 - pBox->x1;
- int dstX = pBox->x1;
- int tileX;
- int h = tileHeight - tileY;
-
- if (h > height)
- h = height;
- height -= h;
-
- modulus(dstX - xoff - pDrawable->x - pPatOrg->x, tileWidth,
- tileX);
-
- while (width > 0) {
- int w = tileWidth - tileX;
- if (w > width)
- w = width;
- width -= w;
-
- (*uxa_screen->info->copy) (pPixmap, tileX, tileY, dstX, dstY,
- w, h);
- dstX += w;
- tileX = 0;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDrawable->pScreen);
+ PixmapPtr pPixmap;
+ int xoff, yoff;
+ int tileWidth, tileHeight;
+ int nbox = REGION_NUM_RECTS(pRegion);
+ BoxPtr pBox = REGION_RECTS(pRegion);
+ Bool ret = FALSE;
+
+ tileWidth = pTile->drawable.width;
+ tileHeight = pTile->drawable.height;
+
+ /* If we're filling with a solid color, grab it out and go to
+ * FillRegionsolid, saving numerous copies.
+ */
+ if (tileWidth == 1 && tileHeight == 1)
+ return uxa_fill_region_solid(pDrawable, pRegion,
+ uxa_get_pixmap_first_pixel(pTile),
+ planemask, alu);
+
+ pPixmap = uxa_get_drawable_pixmap(pDrawable);
+ uxa_get_drawable_deltas(pDrawable, pPixmap, &xoff, &yoff);
+ REGION_TRANSLATE(pScreen, pRegion, xoff, yoff);
+
+ pPixmap = uxa_get_offscreen_pixmap(pDrawable, &xoff, &yoff);
+
+ if (!pPixmap || !uxa_pixmap_is_offscreen(pTile))
+ goto out;
+
+ if ((*uxa_screen->info->prepare_copy) (pTile, pPixmap, 1, 1, alu,
+ planemask)) {
+ while (nbox--) {
+ int height = pBox->y2 - pBox->y1;
+ int dstY = pBox->y1;
+ int tileY;
+
+ modulus(dstY - yoff - pDrawable->y - pPatOrg->y,
+ tileHeight, tileY);
+
+ while (height > 0) {
+ int width = pBox->x2 - pBox->x1;
+ int dstX = pBox->x1;
+ int tileX;
+ int h = tileHeight - tileY;
+
+ if (h > height)
+ h = height;
+ height -= h;
+
+ modulus(dstX - xoff - pDrawable->x - pPatOrg->x,
+ tileWidth, tileX);
+
+ while (width > 0) {
+ int w = tileWidth - tileX;
+ if (w > width)
+ w = width;
+ width -= w;
+
+ (*uxa_screen->info->copy) (pPixmap,
+ tileX, tileY,
+ dstX, dstY,
+ w, h);
+ dstX += w;
+ tileX = 0;
+ }
+ dstY += h;
+ tileY = 0;
+ }
+ pBox++;
}
- dstY += h;
- tileY = 0;
- }
- pBox++;
- }
- (*uxa_screen->info->done_copy) (pPixmap);
+ (*uxa_screen->info->done_copy) (pPixmap);
- ret = TRUE;
- }
+ ret = TRUE;
+ }
out:
- REGION_TRANSLATE(pScreen, pRegion, -xoff, -yoff);
+ REGION_TRANSLATE(pScreen, pRegion, -xoff, -yoff);
- return ret;
+ return ret;
}
/**
@@ -992,55 +992,55 @@ out:
* the pixmap out of framebuffer.
*/
void
-uxa_get_image (DrawablePtr pDrawable, int x, int y, int w, int h,
- unsigned int format, unsigned long planeMask, char *d)
+uxa_get_image(DrawablePtr pDrawable, int x, int y, int w, int h,
+ unsigned int format, unsigned long planeMask, char *d)
{
- ScreenPtr screen = pDrawable->pScreen;
- uxa_screen_t *uxa_screen = uxa_get_screen(screen);
- BoxRec Box;
- PixmapPtr pPix = uxa_get_drawable_pixmap (pDrawable);
- int xoff, yoff;
- Bool ok;
-
- uxa_get_drawable_deltas (pDrawable, pPix, &xoff, &yoff);
-
- Box.x1 = pDrawable->y + x + xoff;
- Box.y1 = pDrawable->y + y + yoff;
- Box.x2 = Box.x1 + w;
- Box.y2 = Box.y1 + h;
-
- if (uxa_screen->swappedOut)
- goto fallback;
-
- pPix = uxa_get_offscreen_pixmap (pDrawable, &xoff, &yoff);
-
- if (pPix == NULL || uxa_screen->info->get_image == NULL)
- goto fallback;
-
- /* Only cover the ZPixmap, solid copy case. */
- if (format != ZPixmap || !UXA_PM_IS_SOLID(pDrawable, planeMask))
- goto fallback;
-
- /* Only try to handle the 8bpp and up cases, since we don't want to think
- * about <8bpp.
- */
- if (pDrawable->bitsPerPixel < 8)
- goto fallback;
-
- ok = uxa_screen->info->get_image(pPix, pDrawable->x + x + xoff,
- pDrawable->y + y + yoff, w, h, d,
- PixmapBytePad(w, pDrawable->depth));
- if (ok)
- return;
+ ScreenPtr screen = pDrawable->pScreen;
+ uxa_screen_t *uxa_screen = uxa_get_screen(screen);
+ BoxRec Box;
+ PixmapPtr pPix = uxa_get_drawable_pixmap(pDrawable);
+ int xoff, yoff;
+ Bool ok;
+
+ uxa_get_drawable_deltas(pDrawable, pPix, &xoff, &yoff);
+
+ Box.x1 = pDrawable->y + x + xoff;
+ Box.y1 = pDrawable->y + y + yoff;
+ Box.x2 = Box.x1 + w;
+ Box.y2 = Box.y1 + h;
+
+ if (uxa_screen->swappedOut)
+ goto fallback;
+
+ pPix = uxa_get_offscreen_pixmap(pDrawable, &xoff, &yoff);
+
+ if (pPix == NULL || uxa_screen->info->get_image == NULL)
+ goto fallback;
+
+ /* Only cover the ZPixmap, solid copy case. */
+ if (format != ZPixmap || !UXA_PM_IS_SOLID(pDrawable, planeMask))
+ goto fallback;
+
+ /* Only try to handle the 8bpp and up cases, since we don't want to
+ * think about <8bpp.
+ */
+ if (pDrawable->bitsPerPixel < 8)
+ goto fallback;
+
+ ok = uxa_screen->info->get_image(pPix, pDrawable->x + x + xoff,
+ pDrawable->y + y + yoff, w, h, d,
+ PixmapBytePad(w, pDrawable->depth));
+ if (ok)
+ return;
fallback:
- UXA_FALLBACK(("from %p (%c)\n", pDrawable,
- uxa_drawable_location(pDrawable)));
+ UXA_FALLBACK(("from %p (%c)\n", pDrawable,
+ uxa_drawable_location(pDrawable)));
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RO)) {
- fbGetImage (pDrawable, x, y, w, h, format, planeMask, d);
- uxa_finish_access (pDrawable);
- }
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RO)) {
+ fbGetImage(pDrawable, x, y, w, h, format, planeMask, d);
+ uxa_finish_access(pDrawable);
+ }
- return;
+ return;
}
diff --git a/uxa/uxa-glyphs.c b/uxa/uxa-glyphs.c
index af5f5879..5901552e 100644
--- a/uxa/uxa-glyphs.c
+++ b/uxa/uxa-glyphs.c
@@ -68,76 +68,78 @@
#define GLYPH_BUFFER_SIZE 256
typedef struct {
- PicturePtr source;
- uxa_composite_rect_t rects[GLYPH_BUFFER_SIZE];
- int count;
+ PicturePtr source;
+ uxa_composite_rect_t rects[GLYPH_BUFFER_SIZE];
+ int count;
} uxa_glyph_buffer_t;
typedef enum {
- UXA_GLYPH_SUCCESS, /* Glyph added to render buffer */
- UXA_GLYPH_FAIL, /* out of memory, etc */
- UXA_GLYPH_NEED_FLUSH, /* would evict a glyph already in the buffer */
+ UXA_GLYPH_SUCCESS, /* Glyph added to render buffer */
+ UXA_GLYPH_FAIL, /* out of memory, etc */
+ UXA_GLYPH_NEED_FLUSH, /* would evict a glyph already in the buffer */
} uxa_glyph_cache_result_t;
-void
-uxa_glyphs_init(ScreenPtr pScreen)
+void uxa_glyphs_init(ScreenPtr pScreen)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
- int i = 0;
-
- memset(uxa_screen->glyphCaches, 0, sizeof(uxa_screen->glyphCaches));
-
- uxa_screen->glyphCaches[i].format = PICT_a8;
- uxa_screen->glyphCaches[i].glyphWidth = uxa_screen->glyphCaches[i].glyphHeight = 16;
- i++;
- uxa_screen->glyphCaches[i].format = PICT_a8;
- uxa_screen->glyphCaches[i].glyphWidth = uxa_screen->glyphCaches[i].glyphHeight = 32;
- i++;
- uxa_screen->glyphCaches[i].format = PICT_a8r8g8b8;
- uxa_screen->glyphCaches[i].glyphWidth = uxa_screen->glyphCaches[i].glyphHeight = 16;
- i++;
- uxa_screen->glyphCaches[i].format = PICT_a8r8g8b8;
- uxa_screen->glyphCaches[i].glyphWidth = uxa_screen->glyphCaches[i].glyphHeight = 32;
- i++;
-
- assert(i == UXA_NUM_GLYPH_CACHES);
-
- for (i = 0; i < UXA_NUM_GLYPH_CACHES; i++) {
- uxa_screen->glyphCaches[i].columns = CACHE_PICTURE_WIDTH / uxa_screen->glyphCaches[i].glyphWidth;
- uxa_screen->glyphCaches[i].size = 256;
- uxa_screen->glyphCaches[i].hashSize = 557;
- }
+ uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
+ int i = 0;
+
+ memset(uxa_screen->glyphCaches, 0, sizeof(uxa_screen->glyphCaches));
+
+ uxa_screen->glyphCaches[i].format = PICT_a8;
+ uxa_screen->glyphCaches[i].glyphWidth =
+ uxa_screen->glyphCaches[i].glyphHeight = 16;
+ i++;
+ uxa_screen->glyphCaches[i].format = PICT_a8;
+ uxa_screen->glyphCaches[i].glyphWidth =
+ uxa_screen->glyphCaches[i].glyphHeight = 32;
+ i++;
+ uxa_screen->glyphCaches[i].format = PICT_a8r8g8b8;
+ uxa_screen->glyphCaches[i].glyphWidth =
+ uxa_screen->glyphCaches[i].glyphHeight = 16;
+ i++;
+ uxa_screen->glyphCaches[i].format = PICT_a8r8g8b8;
+ uxa_screen->glyphCaches[i].glyphWidth =
+ uxa_screen->glyphCaches[i].glyphHeight = 32;
+ i++;
+
+ assert(i == UXA_NUM_GLYPH_CACHES);
+
+ for (i = 0; i < UXA_NUM_GLYPH_CACHES; i++) {
+ uxa_screen->glyphCaches[i].columns =
+ CACHE_PICTURE_WIDTH / uxa_screen->glyphCaches[i].glyphWidth;
+ uxa_screen->glyphCaches[i].size = 256;
+ uxa_screen->glyphCaches[i].hashSize = 557;
+ }
}
-static void
-uxa_unrealize_glyph_caches(ScreenPtr pScreen,
- unsigned int format)
+static void uxa_unrealize_glyph_caches(ScreenPtr pScreen, unsigned int format)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
- int i;
-
- for (i = 0; i < UXA_NUM_GLYPH_CACHES; i++) {
- uxa_glyph_cache_t *cache = &uxa_screen->glyphCaches[i];
-
- if (cache->format != format)
- continue;
-
- if (cache->picture) {
- FreePicture ((pointer) cache->picture, (XID) 0);
- cache->picture = NULL;
- }
+ uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
+ int i;
- if (cache->hashEntries) {
- xfree(cache->hashEntries);
- cache->hashEntries = NULL;
- }
-
- if (cache->glyphs) {
- xfree(cache->glyphs);
- cache->glyphs = NULL;
+ for (i = 0; i < UXA_NUM_GLYPH_CACHES; i++) {
+ uxa_glyph_cache_t *cache = &uxa_screen->glyphCaches[i];
+
+ if (cache->format != format)
+ continue;
+
+ if (cache->picture) {
+ FreePicture((pointer) cache->picture, (XID) 0);
+ cache->picture = NULL;
+ }
+
+ if (cache->hashEntries) {
+ xfree(cache->hashEntries);
+ cache->hashEntries = NULL;
+ }
+
+ if (cache->glyphs) {
+ xfree(cache->glyphs);
+ cache->glyphs = NULL;
+ }
+ cache->glyphCount = 0;
}
- cache->glyphCount = 0;
- }
}
#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0)
@@ -151,200 +153,200 @@ uxa_unrealize_glyph_caches(ScreenPtr pScreen,
* This function allocates the storage pixmap, and then fills in the
* rest of the allocated structures for all caches with the given format.
*/
-static Bool
-uxa_realize_glyph_caches(ScreenPtr pScreen,
- unsigned int format)
+static Bool uxa_realize_glyph_caches(ScreenPtr pScreen, unsigned int format)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
- int depth = PIXMAN_FORMAT_DEPTH(format);
- PictFormatPtr pPictFormat;
- PixmapPtr pPixmap;
- PicturePtr pPicture;
- CARD32 component_alpha;
- int height;
- int i;
- int error;
-
- pPictFormat = PictureMatchFormat(pScreen, depth, format);
- if (!pPictFormat)
- return FALSE;
-
- /* Compute the total vertical size needed for the format */
+ uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
+ int depth = PIXMAN_FORMAT_DEPTH(format);
+ PictFormatPtr pPictFormat;
+ PixmapPtr pPixmap;
+ PicturePtr pPicture;
+ CARD32 component_alpha;
+ int height;
+ int i;
+ int error;
+
+ pPictFormat = PictureMatchFormat(pScreen, depth, format);
+ if (!pPictFormat)
+ return FALSE;
+
+ /* Compute the total vertical size needed for the format */
+
+ height = 0;
+ for (i = 0; i < UXA_NUM_GLYPH_CACHES; i++) {
+ uxa_glyph_cache_t *cache = &uxa_screen->glyphCaches[i];
+ int rows;
+
+ if (cache->format != format)
+ continue;
+
+ cache->yOffset = height;
+
+ rows = (cache->size + cache->columns - 1) / cache->columns;
+ height += rows * cache->glyphHeight;
+ }
- height = 0;
- for (i = 0; i < UXA_NUM_GLYPH_CACHES; i++) {
- uxa_glyph_cache_t *cache = &uxa_screen->glyphCaches[i];
- int rows;
+ /* Now allocate the pixmap and picture */
- if (cache->format != format)
- continue;
+ pPixmap = (*pScreen->CreatePixmap) (pScreen,
+ CACHE_PICTURE_WIDTH,
+ height, depth, 0);
+ if (!pPixmap)
+ return FALSE;
- cache->yOffset = height;
+ component_alpha = NeedsComponent(pPictFormat->format);
+ pPicture = CreatePicture(0, &pPixmap->drawable, pPictFormat,
+ CPComponentAlpha, &component_alpha,
+ serverClient, &error);
- rows = (cache->size + cache->columns - 1) / cache->columns;
- height += rows * cache->glyphHeight;
- }
+ (*pScreen->DestroyPixmap) (pPixmap); /* picture holds a refcount */
- /* Now allocate the pixmap and picture */
-
- pPixmap = (*pScreen->CreatePixmap) (pScreen,
- CACHE_PICTURE_WIDTH,
- height, depth, 0);
- if (!pPixmap)
- return FALSE;
+ if (!pPicture)
+ return FALSE;
- component_alpha = NeedsComponent(pPictFormat->format);
- pPicture = CreatePicture(0, &pPixmap->drawable, pPictFormat,
- CPComponentAlpha, &component_alpha, serverClient,
- &error);
+ /* And store the picture in all the caches for the format */
- (*pScreen->DestroyPixmap) (pPixmap); /* picture holds a refcount */
+ for (i = 0; i < UXA_NUM_GLYPH_CACHES; i++) {
+ uxa_glyph_cache_t *cache = &uxa_screen->glyphCaches[i];
+ int j;
- if (!pPicture)
- return FALSE;
+ if (cache->format != format)
+ continue;
- /* And store the picture in all the caches for the format */
-
- for (i = 0; i < UXA_NUM_GLYPH_CACHES; i++) {
- uxa_glyph_cache_t *cache = &uxa_screen->glyphCaches[i];
- int j;
+ cache->picture = pPicture;
+ cache->picture->refcnt++;
+ cache->hashEntries = xalloc(sizeof(int) * cache->hashSize);
+ cache->glyphs =
+ xalloc(sizeof(uxa_cached_glyph_t) * cache->size);
+ cache->glyphCount = 0;
- if (cache->format != format)
- continue;
+ if (!cache->hashEntries || !cache->glyphs)
+ goto bail;
- cache->picture = pPicture;
- cache->picture->refcnt++;
- cache->hashEntries = xalloc(sizeof(int) * cache->hashSize);
- cache->glyphs = xalloc(sizeof(uxa_cached_glyph_t) * cache->size);
- cache->glyphCount = 0;
+ for (j = 0; j < cache->hashSize; j++)
+ cache->hashEntries[j] = -1;
- if (!cache->hashEntries || !cache->glyphs)
- goto bail;
-
- for (j = 0; j < cache->hashSize; j++)
- cache->hashEntries[j] = -1;
-
- cache->evictionPosition = rand() % cache->size;
- }
+ cache->evictionPosition = rand() % cache->size;
+ }
- /* Each cache references the picture individually */
- FreePicture ((pointer) pPicture, (XID) 0);
- return TRUE;
+ /* Each cache references the picture individually */
+ FreePicture((pointer) pPicture, (XID) 0);
+ return TRUE;
bail:
- uxa_unrealize_glyph_caches(pScreen, format);
- return FALSE;
+ uxa_unrealize_glyph_caches(pScreen, format);
+ return FALSE;
}
-void
-uxa_glyphs_fini (ScreenPtr pScreen)
+void uxa_glyphs_fini(ScreenPtr pScreen)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
- int i;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
+ int i;
- for (i = 0; i < UXA_NUM_GLYPH_CACHES; i++) {
- uxa_glyph_cache_t *cache = &uxa_screen->glyphCaches[i];
+ for (i = 0; i < UXA_NUM_GLYPH_CACHES; i++) {
+ uxa_glyph_cache_t *cache = &uxa_screen->glyphCaches[i];
- if (cache->picture)
- uxa_unrealize_glyph_caches(pScreen, cache->format);
- }
+ if (cache->picture)
+ uxa_unrealize_glyph_caches(pScreen, cache->format);
+ }
}
static int
-uxa_glyph_cache_hash_lookup(uxa_glyph_cache_t *cache, GlyphPtr pGlyph)
+uxa_glyph_cache_hash_lookup(uxa_glyph_cache_t * cache, GlyphPtr pGlyph)
{
- int slot;
+ int slot;
- slot = (*(CARD32 *) pGlyph->sha1) % cache->hashSize;
-
- while (TRUE) { /* hash table can never be full */
- int entryPos = cache->hashEntries[slot];
- if (entryPos == -1)
- return -1;
+ slot = (*(CARD32 *) pGlyph->sha1) % cache->hashSize;
- if (memcmp(pGlyph->sha1, cache->glyphs[entryPos].sha1, sizeof(pGlyph->sha1)) == 0){
- return entryPos;
+ while (TRUE) { /* hash table can never be full */
+ int entryPos = cache->hashEntries[slot];
+ if (entryPos == -1)
+ return -1;
+
+ if (memcmp
+ (pGlyph->sha1, cache->glyphs[entryPos].sha1,
+ sizeof(pGlyph->sha1)) == 0) {
+ return entryPos;
+ }
+
+ slot--;
+ if (slot < 0)
+ slot = cache->hashSize - 1;
}
-
- slot--;
- if (slot < 0)
- slot = cache->hashSize - 1;
- }
}
static void
-uxa_glyph_cache_hash_insert(uxa_glyph_cache_t *cache,
- GlyphPtr pGlyph,
- int pos)
+uxa_glyph_cache_hash_insert(uxa_glyph_cache_t * cache, GlyphPtr pGlyph, int pos)
{
- int slot;
-
- memcpy(cache->glyphs[pos].sha1, pGlyph->sha1, sizeof(pGlyph->sha1));
-
- slot = (*(CARD32 *) pGlyph->sha1) % cache->hashSize;
-
- while (TRUE) { /* hash table can never be full */
- if (cache->hashEntries[slot] == -1) {
- cache->hashEntries[slot] = pos;
- return;
+ int slot;
+
+ memcpy(cache->glyphs[pos].sha1, pGlyph->sha1, sizeof(pGlyph->sha1));
+
+ slot = (*(CARD32 *) pGlyph->sha1) % cache->hashSize;
+
+ while (TRUE) { /* hash table can never be full */
+ if (cache->hashEntries[slot] == -1) {
+ cache->hashEntries[slot] = pos;
+ return;
+ }
+
+ slot--;
+ if (slot < 0)
+ slot = cache->hashSize - 1;
}
-
- slot--;
- if (slot < 0)
- slot = cache->hashSize - 1;
- }
}
-static void
-uxa_glyph_cache_hash_remove(uxa_glyph_cache_t *cache,
- int pos)
+static void uxa_glyph_cache_hash_remove(uxa_glyph_cache_t * cache, int pos)
{
- int slot;
- int emptiedSlot = -1;
-
- slot = (*(CARD32 *) cache->glyphs[pos].sha1) % cache->hashSize;
-
- while (TRUE) { /* hash table can never be full */
- int entryPos = cache->hashEntries[slot];
-
- if (entryPos == -1)
- return;
-
- if (entryPos == pos) {
- cache->hashEntries[slot] = -1;
- emptiedSlot = slot;
- } else if (emptiedSlot != -1) {
- /* See if we can move this entry into the emptied slot, we can't
- * do that if if entry would have hashed between the current position
- * and the emptied slot. (taking wrapping into account). Bad positions
- * are:
- *
- * | XXXXXXXXXX |
- * i j
- *
- * |XXX XXXX|
- * j i
- *
- * i - slot, j - emptiedSlot
- *
- * (Knuth 6.4R)
- */
-
- int entrySlot = (*(CARD32 *) cache->glyphs[entryPos].sha1) % cache->hashSize;
-
- if (!((entrySlot >= slot && entrySlot < emptiedSlot) ||
- (emptiedSlot < slot && (entrySlot < emptiedSlot || entrySlot >= slot))))
- {
- cache->hashEntries[emptiedSlot] = entryPos;
- cache->hashEntries[slot] = -1;
- emptiedSlot = slot;
- }
+ int slot;
+ int emptiedSlot = -1;
+
+ slot = (*(CARD32 *) cache->glyphs[pos].sha1) % cache->hashSize;
+
+ while (TRUE) { /* hash table can never be full */
+ int entryPos = cache->hashEntries[slot];
+
+ if (entryPos == -1)
+ return;
+
+ if (entryPos == pos) {
+ cache->hashEntries[slot] = -1;
+ emptiedSlot = slot;
+ } else if (emptiedSlot != -1) {
+ /* See if we can move this entry into the emptied slot,
+ * we can't do that if if entry would have hashed
+ * between the current position and the emptied slot.
+ * (taking wrapping into account). Bad positions
+ * are:
+ *
+ * | XXXXXXXXXX |
+ * i j
+ *
+ * |XXX XXXX|
+ * j i
+ *
+ * i - slot, j - emptiedSlot
+ *
+ * (Knuth 6.4R)
+ */
+
+ int entrySlot =
+ (*(CARD32 *) cache->glyphs[entryPos].sha1) %
+ cache->hashSize;
+
+ if (!((entrySlot >= slot && entrySlot < emptiedSlot) ||
+ (emptiedSlot < slot
+ && (entrySlot < emptiedSlot
+ || entrySlot >= slot)))) {
+ cache->hashEntries[emptiedSlot] = entryPos;
+ cache->hashEntries[slot] = -1;
+ emptiedSlot = slot;
+ }
+ }
+
+ slot--;
+ if (slot < 0)
+ slot = cache->hashSize - 1;
}
-
- slot--;
- if (slot < 0)
- slot = cache->hashSize - 1;
- }
}
#define CACHE_X(pos) (((pos) % cache->columns) * cache->glyphWidth)
@@ -354,291 +356,281 @@ uxa_glyph_cache_hash_remove(uxa_glyph_cache_t *cache,
* is to use CopyArea; uxa pixmaps are always offscreen.
*/
static Bool
-uxa_glyph_cache_upload_glyph(ScreenPtr pScreen,
- uxa_glyph_cache_t *cache,
- int pos,
- GlyphPtr pGlyph)
+uxa_glyph_cache_upload_glyph(ScreenPtr pScreen,
+ uxa_glyph_cache_t * cache,
+ int pos, GlyphPtr pGlyph)
{
- PicturePtr pGlyphPicture = GlyphPicture(pGlyph)[pScreen->myNum];
- PixmapPtr pGlyphPixmap = (PixmapPtr)pGlyphPicture->pDrawable;
- PixmapPtr pCachePixmap = (PixmapPtr)cache->picture->pDrawable;
- GCPtr pGC;
-
- /* UploadToScreen only works if bpp match */
- if (pGlyphPixmap->drawable.bitsPerPixel != pCachePixmap->drawable.bitsPerPixel)
- return FALSE;
-
- pGC = GetScratchGC(pCachePixmap->drawable.depth, pScreen);
- ValidateGC(&pCachePixmap->drawable, pGC);
- (void) uxa_copy_area (&pGlyphPixmap->drawable,
- &pCachePixmap->drawable,
- pGC,
- 0, 0, pGlyph->info.width, pGlyph->info.height,
- CACHE_X(pos), CACHE_Y(pos));
- FreeScratchGC (pGC);
- return TRUE;
+ PicturePtr pGlyphPicture = GlyphPicture(pGlyph)[pScreen->myNum];
+ PixmapPtr pGlyphPixmap = (PixmapPtr) pGlyphPicture->pDrawable;
+ PixmapPtr pCachePixmap = (PixmapPtr) cache->picture->pDrawable;
+ GCPtr pGC;
+
+ /* UploadToScreen only works if bpp match */
+ if (pGlyphPixmap->drawable.bitsPerPixel !=
+ pCachePixmap->drawable.bitsPerPixel)
+ return FALSE;
+
+ pGC = GetScratchGC(pCachePixmap->drawable.depth, pScreen);
+ ValidateGC(&pCachePixmap->drawable, pGC);
+ (void)uxa_copy_area(&pGlyphPixmap->drawable,
+ &pCachePixmap->drawable,
+ pGC,
+ 0, 0, pGlyph->info.width, pGlyph->info.height,
+ CACHE_X(pos), CACHE_Y(pos));
+ FreeScratchGC(pGC);
+ return TRUE;
}
static uxa_glyph_cache_result_t
-uxa_glyph_cache_buffer_glyph(ScreenPtr pScreen,
- uxa_glyph_cache_t *cache,
- uxa_glyph_buffer_t *buffer,
- GlyphPtr pGlyph,
- int xGlyph,
- int yGlyph)
+uxa_glyph_cache_buffer_glyph(ScreenPtr pScreen,
+ uxa_glyph_cache_t * cache,
+ uxa_glyph_buffer_t * buffer,
+ GlyphPtr pGlyph, int xGlyph, int yGlyph)
{
- uxa_composite_rect_t *rect;
- int pos;
-
- if (buffer->source && buffer->source != cache->picture)
- return UXA_GLYPH_NEED_FLUSH;
-
- if (!cache->picture) {
- if (!uxa_realize_glyph_caches(pScreen, cache->format))
- return UXA_GLYPH_FAIL;
- }
-
- DBG_GLYPH_CACHE(("(%d,%d,%s): buffering glyph %lx\n",
- cache->glyphWidth, cache->glyphHeight, cache->format == PICT_a8 ? "A" : "ARGB",
- (long)*(CARD32 *) pGlyph->sha1));
-
- pos = uxa_glyph_cache_hash_lookup(cache, pGlyph);
- if (pos != -1) {
- DBG_GLYPH_CACHE((" found existing glyph at %d\n", pos));
- } else {
- if (cache->glyphCount < cache->size) {
- /* Space remaining; we fill from the start */
- pos = cache->glyphCount;
- cache->glyphCount++;
- DBG_GLYPH_CACHE((" storing glyph in free space at %d\n", pos));
-
- uxa_glyph_cache_hash_insert(cache, pGlyph, pos);
+ uxa_composite_rect_t *rect;
+ int pos;
+
+ if (buffer->source && buffer->source != cache->picture)
+ return UXA_GLYPH_NEED_FLUSH;
+
+ if (!cache->picture) {
+ if (!uxa_realize_glyph_caches(pScreen, cache->format))
+ return UXA_GLYPH_FAIL;
+ }
+
+ DBG_GLYPH_CACHE(("(%d,%d,%s): buffering glyph %lx\n",
+ cache->glyphWidth, cache->glyphHeight,
+ cache->format == PICT_a8 ? "A" : "ARGB",
+ (long)*(CARD32 *) pGlyph->sha1));
+ pos = uxa_glyph_cache_hash_lookup(cache, pGlyph);
+ if (pos != -1) {
+ DBG_GLYPH_CACHE((" found existing glyph at %d\n", pos));
} else {
- /* Need to evict an entry. We have to see if any glyphs
- * already in the output buffer were at this position in
- * the cache
- */
-
- pos = cache->evictionPosition;
- DBG_GLYPH_CACHE((" evicting glyph at %d\n", pos));
- if (buffer->count) {
- int x, y;
- int i;
-
- x = CACHE_X(pos);
- y = CACHE_Y(pos);
-
- for (i = 0; i < buffer->count; i++) {
- if (buffer->rects[i].xSrc == x && buffer->rects[i].ySrc == y) {
- DBG_GLYPH_CACHE((" must flush buffer\n"));
- return UXA_GLYPH_NEED_FLUSH;
- }
+ if (cache->glyphCount < cache->size) {
+ /* Space remaining; we fill from the start */
+ pos = cache->glyphCount;
+ cache->glyphCount++;
+ DBG_GLYPH_CACHE((" storing glyph in free space at %d\n", pos));
+
+ uxa_glyph_cache_hash_insert(cache, pGlyph, pos);
+
+ } else {
+ /* Need to evict an entry. We have to see if any glyphs
+ * already in the output buffer were at this position in
+ * the cache
+ */
+
+ pos = cache->evictionPosition;
+ DBG_GLYPH_CACHE((" evicting glyph at %d\n", pos));
+ if (buffer->count) {
+ int x, y;
+ int i;
+
+ x = CACHE_X(pos);
+ y = CACHE_Y(pos);
+
+ for (i = 0; i < buffer->count; i++) {
+ if (buffer->rects[i].xSrc == x
+ && buffer->rects[i].ySrc == y) {
+ DBG_GLYPH_CACHE((" must flush buffer\n"));
+ return UXA_GLYPH_NEED_FLUSH;
+ }
+ }
+ }
+
+ /* OK, we're all set, swap in the new glyph */
+ uxa_glyph_cache_hash_remove(cache, pos);
+ uxa_glyph_cache_hash_insert(cache, pGlyph, pos);
+
+ /* And pick a new eviction position */
+ cache->evictionPosition = rand() % cache->size;
}
- }
- /* OK, we're all set, swap in the new glyph */
- uxa_glyph_cache_hash_remove(cache, pos);
- uxa_glyph_cache_hash_insert(cache, pGlyph, pos);
+ /* Now actually upload the glyph into the cache picture; if
+ * we can't do it with UploadToScreen (because the glyph is
+ * offscreen, etc), we fall back to CompositePicture.
+ */
+ if (!uxa_glyph_cache_upload_glyph(pScreen, cache, pos, pGlyph)) {
+ CompositePicture(PictOpSrc,
+ GlyphPicture(pGlyph)[pScreen->myNum],
+ None,
+ cache->picture,
+ 0, 0,
+ 0, 0,
+ CACHE_X(pos),
+ CACHE_Y(pos),
+ pGlyph->info.width,
+ pGlyph->info.height);
+ }
- /* And pick a new eviction position */
- cache->evictionPosition = rand() % cache->size;
}
- /* Now actually upload the glyph into the cache picture; if
- * we can't do it with UploadToScreen (because the glyph is
- * offscreen, etc), we fall back to CompositePicture.
- */
- if (!uxa_glyph_cache_upload_glyph(pScreen, cache, pos, pGlyph)) {
- CompositePicture (PictOpSrc,
- GlyphPicture(pGlyph)[pScreen->myNum],
- None,
- cache->picture,
- 0, 0,
- 0, 0,
- CACHE_X(pos),
- CACHE_Y(pos),
- pGlyph->info.width,
- pGlyph->info.height);
- }
+ buffer->source = cache->picture;
+
+ rect = &buffer->rects[buffer->count];
+ rect->xSrc = CACHE_X(pos);
+ rect->ySrc = CACHE_Y(pos);
+ rect->xDst = xGlyph - pGlyph->info.x;
+ rect->yDst = yGlyph - pGlyph->info.y;
+ rect->width = pGlyph->info.width;
+ rect->height = pGlyph->info.height;
+
+ buffer->count++;
- }
-
-
- buffer->source = cache->picture;
-
- rect = &buffer->rects[buffer->count];
- rect->xSrc = CACHE_X(pos);
- rect->ySrc = CACHE_Y(pos);
- rect->xDst = xGlyph - pGlyph->info.x;
- rect->yDst = yGlyph - pGlyph->info.y;
- rect->width = pGlyph->info.width;
- rect->height = pGlyph->info.height;
-
- buffer->count++;
-
- return UXA_GLYPH_SUCCESS;
+ return UXA_GLYPH_SUCCESS;
}
#undef CACHE_X
#undef CACHE_Y
static uxa_glyph_cache_result_t
-uxa_buffer_glyph(ScreenPtr pScreen,
- uxa_glyph_buffer_t *buffer,
- GlyphPtr pGlyph,
- int xGlyph,
- int yGlyph)
+uxa_buffer_glyph(ScreenPtr pScreen,
+ uxa_glyph_buffer_t * buffer,
+ GlyphPtr pGlyph, int xGlyph, int yGlyph)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
- unsigned int format = (GlyphPicture(pGlyph)[pScreen->myNum])->format;
- int width = pGlyph->info.width;
- int height = pGlyph->info.height;
- uxa_composite_rect_t *rect;
- PicturePtr source;
- int i;
-
- if (buffer->count == GLYPH_BUFFER_SIZE)
- return UXA_GLYPH_NEED_FLUSH;
-
- if (PICT_FORMAT_BPP(format) == 1)
- format = PICT_a8;
-
- for (i = 0; i < UXA_NUM_GLYPH_CACHES; i++) {
- uxa_glyph_cache_t *cache = &uxa_screen->glyphCaches[i];
-
- if (format == cache->format &&
- width <= cache->glyphWidth &&
- height <= cache->glyphHeight) {
- uxa_glyph_cache_result_t result = uxa_glyph_cache_buffer_glyph(pScreen, &uxa_screen->glyphCaches[i],
- buffer,
- pGlyph, xGlyph, yGlyph);
- switch (result) {
- case UXA_GLYPH_FAIL:
- break;
- case UXA_GLYPH_SUCCESS:
- case UXA_GLYPH_NEED_FLUSH:
- return result;
- }
+ uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
+ unsigned int format = (GlyphPicture(pGlyph)[pScreen->myNum])->format;
+ int width = pGlyph->info.width;
+ int height = pGlyph->info.height;
+ uxa_composite_rect_t *rect;
+ PicturePtr source;
+ int i;
+
+ if (buffer->count == GLYPH_BUFFER_SIZE)
+ return UXA_GLYPH_NEED_FLUSH;
+
+ if (PICT_FORMAT_BPP(format) == 1)
+ format = PICT_a8;
+
+ for (i = 0; i < UXA_NUM_GLYPH_CACHES; i++) {
+ uxa_glyph_cache_t *cache = &uxa_screen->glyphCaches[i];
+
+ if (format == cache->format &&
+ width <= cache->glyphWidth &&
+ height <= cache->glyphHeight) {
+ uxa_glyph_cache_result_t result =
+ uxa_glyph_cache_buffer_glyph(pScreen,
+ &uxa_screen->
+ glyphCaches[i],
+ buffer,
+ pGlyph, xGlyph,
+ yGlyph);
+ switch (result) {
+ case UXA_GLYPH_FAIL:
+ break;
+ case UXA_GLYPH_SUCCESS:
+ case UXA_GLYPH_NEED_FLUSH:
+ return result;
+ }
+ }
}
- }
- /* Couldn't find the glyph in the cache, use the glyph picture directly */
+ /* Couldn't find the glyph in the cache, use the glyph picture directly */
+
+ source = GlyphPicture(pGlyph)[pScreen->myNum];
+ if (buffer->source && buffer->source != source)
+ return UXA_GLYPH_NEED_FLUSH;
- source = GlyphPicture(pGlyph)[pScreen->myNum];
- if (buffer->source && buffer->source != source)
- return UXA_GLYPH_NEED_FLUSH;
+ buffer->source = source;
- buffer->source = source;
-
- rect = &buffer->rects[buffer->count];
- rect->xSrc = 0;
- rect->ySrc = 0;
- rect->xDst = xGlyph - pGlyph->info.x;
- rect->yDst = yGlyph - pGlyph->info.y;
- rect->width = pGlyph->info.width;
- rect->height = pGlyph->info.height;
+ rect = &buffer->rects[buffer->count];
+ rect->xSrc = 0;
+ rect->ySrc = 0;
+ rect->xDst = xGlyph - pGlyph->info.x;
+ rect->yDst = yGlyph - pGlyph->info.y;
+ rect->width = pGlyph->info.width;
+ rect->height = pGlyph->info.height;
- buffer->count++;
+ buffer->count++;
- return UXA_GLYPH_SUCCESS;
+ return UXA_GLYPH_SUCCESS;
}
-static void
-uxa_glyphs_to_mask(PicturePtr pMask,
- uxa_glyph_buffer_t *buffer)
+static void uxa_glyphs_to_mask(PicturePtr pMask, uxa_glyph_buffer_t * buffer)
{
- uxa_composite_rects(PictOpAdd, buffer->source, pMask,
- buffer->count, buffer->rects);
-
- buffer->count = 0;
- buffer->source = NULL;
+ uxa_composite_rects(PictOpAdd, buffer->source, pMask,
+ buffer->count, buffer->rects);
+
+ buffer->count = 0;
+ buffer->source = NULL;
}
static void
-uxa_glyphs_to_dst(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- uxa_glyph_buffer_t *buffer,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xDst,
- INT16 yDst)
+uxa_glyphs_to_dst(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ uxa_glyph_buffer_t * buffer,
+ INT16 xSrc, INT16 ySrc, INT16 xDst, INT16 yDst)
{
- int i;
-
- for (i = 0; i < buffer->count; i++) {
- uxa_composite_rect_t *rect = &buffer->rects[i];
-
- CompositePicture (op,
- pSrc,
- buffer->source,
- pDst,
- xSrc + rect->xDst - xDst,
- ySrc + rect->yDst - yDst,
- rect->xSrc,
- rect->ySrc,
- rect->xDst,
- rect->yDst,
- rect->width,
- rect->height);
- }
-
- buffer->count = 0;
- buffer->source = NULL;
+ int i;
+
+ for (i = 0; i < buffer->count; i++) {
+ uxa_composite_rect_t *rect = &buffer->rects[i];
+
+ CompositePicture(op,
+ pSrc,
+ buffer->source,
+ pDst,
+ xSrc + rect->xDst - xDst,
+ ySrc + rect->yDst - yDst,
+ rect->xSrc,
+ rect->ySrc,
+ rect->xDst,
+ rect->yDst, rect->width, rect->height);
+ }
+
+ buffer->count = 0;
+ buffer->source = NULL;
}
/* Cut and paste from render/glyph.c - probably should export it instead */
static void
-uxa_glyph_extents (int nlist,
- GlyphListPtr list,
- GlyphPtr *glyphs,
- BoxPtr extents)
+uxa_glyph_extents(int nlist,
+ GlyphListPtr list, GlyphPtr * glyphs, BoxPtr extents)
{
- int x1, x2, y1, y2;
- int n;
- GlyphPtr glyph;
- int x, y;
-
- x = 0;
- y = 0;
- extents->x1 = MAXSHORT;
- extents->x2 = MINSHORT;
- extents->y1 = MAXSHORT;
- extents->y2 = MINSHORT;
- while (nlist--)
- {
- x += list->xOff;
- y += list->yOff;
- n = list->len;
- list++;
- while (n--)
- {
- glyph = *glyphs++;
- x1 = x - glyph->info.x;
- if (x1 < MINSHORT)
- x1 = MINSHORT;
- y1 = y - glyph->info.y;
- if (y1 < MINSHORT)
- y1 = MINSHORT;
- x2 = x1 + glyph->info.width;
- if (x2 > MAXSHORT)
- x2 = MAXSHORT;
- y2 = y1 + glyph->info.height;
- if (y2 > MAXSHORT)
- y2 = MAXSHORT;
- if (x1 < extents->x1)
- extents->x1 = x1;
- if (x2 > extents->x2)
- extents->x2 = x2;
- if (y1 < extents->y1)
- extents->y1 = y1;
- if (y2 > extents->y2)
- extents->y2 = y2;
- x += glyph->info.xOff;
- y += glyph->info.yOff;
+ int x1, x2, y1, y2;
+ int n;
+ GlyphPtr glyph;
+ int x, y;
+
+ x = 0;
+ y = 0;
+ extents->x1 = MAXSHORT;
+ extents->x2 = MINSHORT;
+ extents->y1 = MAXSHORT;
+ extents->y2 = MINSHORT;
+ while (nlist--) {
+ x += list->xOff;
+ y += list->yOff;
+ n = list->len;
+ list++;
+ while (n--) {
+ glyph = *glyphs++;
+ x1 = x - glyph->info.x;
+ if (x1 < MINSHORT)
+ x1 = MINSHORT;
+ y1 = y - glyph->info.y;
+ if (y1 < MINSHORT)
+ y1 = MINSHORT;
+ x2 = x1 + glyph->info.width;
+ if (x2 > MAXSHORT)
+ x2 = MAXSHORT;
+ y2 = y1 + glyph->info.height;
+ if (y2 > MAXSHORT)
+ y2 = MAXSHORT;
+ if (x1 < extents->x1)
+ extents->x1 = x1;
+ if (x2 > extents->x2)
+ extents->x2 = x2;
+ if (y1 < extents->y1)
+ extents->y1 = y1;
+ if (y2 > extents->y2)
+ extents->y2 = y2;
+ x += glyph->info.xOff;
+ y += glyph->info.yOff;
+ }
}
- }
}
/**
@@ -646,228 +638,218 @@ uxa_glyph_extents (int nlist,
* bounding box, which appears to be good enough to catch most cases at least.
*/
static Bool
-uxa_glyphs_intersect(int nlist, GlyphListPtr list, GlyphPtr *glyphs)
+uxa_glyphs_intersect(int nlist, GlyphListPtr list, GlyphPtr * glyphs)
{
- int x1, x2, y1, y2;
- int n;
- GlyphPtr glyph;
- int x, y;
- BoxRec extents;
- Bool first = TRUE;
-
- x = 0;
- y = 0;
- extents.x1 = 0;
- extents.y1 = 0;
- extents.x2 = 0;
- extents.y2 = 0;
- while (nlist--) {
- x += list->xOff;
- y += list->yOff;
- n = list->len;
- list++;
- while (n--) {
- glyph = *glyphs++;
-
- if (glyph->info.width == 0 || glyph->info.height == 0) {
- x += glyph->info.xOff;
- y += glyph->info.yOff;
- continue;
- }
-
- x1 = x - glyph->info.x;
- if (x1 < MINSHORT)
- x1 = MINSHORT;
- y1 = y - glyph->info.y;
- if (y1 < MINSHORT)
- y1 = MINSHORT;
- x2 = x1 + glyph->info.width;
- if (x2 > MAXSHORT)
- x2 = MAXSHORT;
- y2 = y1 + glyph->info.height;
- if (y2 > MAXSHORT)
- y2 = MAXSHORT;
-
- if (first) {
- extents.x1 = x1;
- extents.y1 = y1;
- extents.x2 = x2;
- extents.y2 = y2;
- first = FALSE;
- } else {
- if (x1 < extents.x2 && x2 > extents.x1 &&
- y1 < extents.y2 && y2 > extents.y1)
- {
- return TRUE;
- }
-
- if (x1 < extents.x1)
- extents.x1 = x1;
- if (x2 > extents.x2)
- extents.x2 = x2;
- if (y1 < extents.y1)
- extents.y1 = y1;
- if (y2 > extents.y2)
- extents.y2 = y2;
- }
- x += glyph->info.xOff;
- y += glyph->info.yOff;
- }
- }
-
- return FALSE;
+ int x1, x2, y1, y2;
+ int n;
+ GlyphPtr glyph;
+ int x, y;
+ BoxRec extents;
+ Bool first = TRUE;
+
+ x = 0;
+ y = 0;
+ extents.x1 = 0;
+ extents.y1 = 0;
+ extents.x2 = 0;
+ extents.y2 = 0;
+ while (nlist--) {
+ x += list->xOff;
+ y += list->yOff;
+ n = list->len;
+ list++;
+ while (n--) {
+ glyph = *glyphs++;
+
+ if (glyph->info.width == 0 || glyph->info.height == 0) {
+ x += glyph->info.xOff;
+ y += glyph->info.yOff;
+ continue;
+ }
+
+ x1 = x - glyph->info.x;
+ if (x1 < MINSHORT)
+ x1 = MINSHORT;
+ y1 = y - glyph->info.y;
+ if (y1 < MINSHORT)
+ y1 = MINSHORT;
+ x2 = x1 + glyph->info.width;
+ if (x2 > MAXSHORT)
+ x2 = MAXSHORT;
+ y2 = y1 + glyph->info.height;
+ if (y2 > MAXSHORT)
+ y2 = MAXSHORT;
+
+ if (first) {
+ extents.x1 = x1;
+ extents.y1 = y1;
+ extents.x2 = x2;
+ extents.y2 = y2;
+ first = FALSE;
+ } else {
+ if (x1 < extents.x2 && x2 > extents.x1 &&
+ y1 < extents.y2 && y2 > extents.y1) {
+ return TRUE;
+ }
+
+ if (x1 < extents.x1)
+ extents.x1 = x1;
+ if (x2 > extents.x2)
+ extents.x2 = x2;
+ if (y1 < extents.y1)
+ extents.y1 = y1;
+ if (y2 > extents.y2)
+ extents.y2 = y2;
+ }
+ x += glyph->info.xOff;
+ y += glyph->info.yOff;
+ }
+ }
+
+ return FALSE;
}
void
-uxa_glyphs (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
+uxa_glyphs(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int nlist,
- GlyphListPtr list,
- GlyphPtr *glyphs)
+ INT16 xSrc,
+ INT16 ySrc, int nlist, GlyphListPtr list, GlyphPtr * glyphs)
{
- PicturePtr pPicture;
- PixmapPtr pMaskPixmap = 0;
- PicturePtr pMask;
- ScreenPtr pScreen = pDst->pDrawable->pScreen;
- int width = 0, height = 0;
- int x, y;
- int xDst = list->xOff, yDst = list->yOff;
- int n;
- GlyphPtr glyph;
- int error;
- BoxRec extents = {0, 0, 0, 0};
- CARD32 component_alpha;
- uxa_glyph_buffer_t buffer;
-
- /* If we don't have a mask format but all the glyphs have the same format
- * and don't intersect, use the glyph format as mask format for the full
- * benefits of the glyph cache.
- */
- if (!maskFormat) {
- Bool sameFormat = TRUE;
- int i;
-
- maskFormat = list[0].format;
-
- for (i = 0; i < nlist; i++) {
- if (maskFormat->format != list[i].format->format) {
- sameFormat = FALSE;
- break;
- }
- }
-
- if (!sameFormat || (maskFormat->depth != 1 &&
- uxa_glyphs_intersect(nlist, list, glyphs))) {
- maskFormat = NULL;
- }
- }
-
- if (maskFormat)
- {
- GCPtr pGC;
- xRectangle rect;
-
- uxa_glyph_extents (nlist, list, glyphs, &extents);
-
- if (extents.x2 <= extents.x1 || extents.y2 <= extents.y1)
- return;
- width = extents.x2 - extents.x1;
- height = extents.y2 - extents.y1;
-
- if (maskFormat->depth == 1) {
- PictFormatPtr a8Format = PictureMatchFormat (pScreen, 8, PICT_a8);
-
- if (a8Format)
- maskFormat = a8Format;
+ PicturePtr pPicture;
+ PixmapPtr pMaskPixmap = 0;
+ PicturePtr pMask;
+ ScreenPtr pScreen = pDst->pDrawable->pScreen;
+ int width = 0, height = 0;
+ int x, y;
+ int xDst = list->xOff, yDst = list->yOff;
+ int n;
+ GlyphPtr glyph;
+ int error;
+ BoxRec extents = { 0, 0, 0, 0 };
+ CARD32 component_alpha;
+ uxa_glyph_buffer_t buffer;
+
+ /* If we don't have a mask format but all the glyphs have the same format
+ * and don't intersect, use the glyph format as mask format for the full
+ * benefits of the glyph cache.
+ */
+ if (!maskFormat) {
+ Bool sameFormat = TRUE;
+ int i;
+
+ maskFormat = list[0].format;
+
+ for (i = 0; i < nlist; i++) {
+ if (maskFormat->format != list[i].format->format) {
+ sameFormat = FALSE;
+ break;
+ }
+ }
+
+ if (!sameFormat || (maskFormat->depth != 1 &&
+ uxa_glyphs_intersect(nlist, list,
+ glyphs))) {
+ maskFormat = NULL;
+ }
}
- pMaskPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
- maskFormat->depth,
- CREATE_PIXMAP_USAGE_SCRATCH);
- if (!pMaskPixmap)
- return;
- component_alpha = NeedsComponent(maskFormat->format);
- pMask = CreatePicture (0, &pMaskPixmap->drawable,
- maskFormat, CPComponentAlpha, &component_alpha,
- serverClient, &error);
- if (!pMask)
- {
- (*pScreen->DestroyPixmap) (pMaskPixmap);
- return;
+ if (maskFormat) {
+ GCPtr pGC;
+ xRectangle rect;
+
+ uxa_glyph_extents(nlist, list, glyphs, &extents);
+
+ if (extents.x2 <= extents.x1 || extents.y2 <= extents.y1)
+ return;
+ width = extents.x2 - extents.x1;
+ height = extents.y2 - extents.y1;
+
+ if (maskFormat->depth == 1) {
+ PictFormatPtr a8Format =
+ PictureMatchFormat(pScreen, 8, PICT_a8);
+
+ if (a8Format)
+ maskFormat = a8Format;
+ }
+
+ pMaskPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
+ maskFormat->depth,
+ CREATE_PIXMAP_USAGE_SCRATCH);
+ if (!pMaskPixmap)
+ return;
+ component_alpha = NeedsComponent(maskFormat->format);
+ pMask = CreatePicture(0, &pMaskPixmap->drawable,
+ maskFormat, CPComponentAlpha,
+ &component_alpha, serverClient, &error);
+ if (!pMask) {
+ (*pScreen->DestroyPixmap) (pMaskPixmap);
+ return;
+ }
+ pGC = GetScratchGC(pMaskPixmap->drawable.depth, pScreen);
+ ValidateGC(&pMaskPixmap->drawable, pGC);
+ rect.x = 0;
+ rect.y = 0;
+ rect.width = width;
+ rect.height = height;
+ (*pGC->ops->PolyFillRect) (&pMaskPixmap->drawable, pGC, 1,
+ &rect);
+ FreeScratchGC(pGC);
+ x = -extents.x1;
+ y = -extents.y1;
+ } else {
+ pMask = pDst;
+ x = 0;
+ y = 0;
}
- pGC = GetScratchGC (pMaskPixmap->drawable.depth, pScreen);
- ValidateGC (&pMaskPixmap->drawable, pGC);
- rect.x = 0;
- rect.y = 0;
- rect.width = width;
- rect.height = height;
- (*pGC->ops->PolyFillRect) (&pMaskPixmap->drawable, pGC, 1, &rect);
- FreeScratchGC (pGC);
- x = -extents.x1;
- y = -extents.y1;
- }
- else
- {
- pMask = pDst;
- x = 0;
- y = 0;
- }
- buffer.count = 0;
- buffer.source = NULL;
- while (nlist--)
- {
- x += list->xOff;
- y += list->yOff;
- n = list->len;
- while (n--)
- {
- glyph = *glyphs++;
- pPicture = GlyphPicture (glyph)[pScreen->myNum];
-
- if (glyph->info.width > 0 && glyph->info.height > 0 &&
- uxa_buffer_glyph(pScreen, &buffer, glyph, x, y) == UXA_GLYPH_NEED_FLUSH)
- {
+ buffer.count = 0;
+ buffer.source = NULL;
+ while (nlist--) {
+ x += list->xOff;
+ y += list->yOff;
+ n = list->len;
+ while (n--) {
+ glyph = *glyphs++;
+ pPicture = GlyphPicture(glyph)[pScreen->myNum];
+
+ if (glyph->info.width > 0 && glyph->info.height > 0 &&
+ uxa_buffer_glyph(pScreen, &buffer, glyph, x,
+ y) == UXA_GLYPH_NEED_FLUSH) {
+ if (maskFormat)
+ uxa_glyphs_to_mask(pMask, &buffer);
+ else
+ uxa_glyphs_to_dst(op, pSrc, pDst,
+ &buffer, xSrc, ySrc,
+ xDst, yDst);
+
+ uxa_buffer_glyph(pScreen, &buffer, glyph, x, y);
+ }
+
+ x += glyph->info.xOff;
+ y += glyph->info.yOff;
+ }
+ list++;
+ }
+
+ if (buffer.count) {
if (maskFormat)
- uxa_glyphs_to_mask(pMask, &buffer);
+ uxa_glyphs_to_mask(pMask, &buffer);
else
- uxa_glyphs_to_dst(op, pSrc, pDst, &buffer,
- xSrc, ySrc, xDst, yDst);
-
- uxa_buffer_glyph(pScreen, &buffer, glyph, x, y);
- }
+ uxa_glyphs_to_dst(op, pSrc, pDst, &buffer,
+ xSrc, ySrc, xDst, yDst);
+ }
- x += glyph->info.xOff;
- y += glyph->info.yOff;
+ if (maskFormat) {
+ x = extents.x1;
+ y = extents.y1;
+ CompositePicture(op,
+ pSrc,
+ pMask,
+ pDst,
+ xSrc + x - xDst,
+ ySrc + y - yDst, 0, 0, x, y, width, height);
+ FreePicture((pointer) pMask, (XID) 0);
+ (*pScreen->DestroyPixmap) (pMaskPixmap);
}
- list++;
- }
-
- if (buffer.count) {
- if (maskFormat)
- uxa_glyphs_to_mask(pMask, &buffer);
- else
- uxa_glyphs_to_dst(op, pSrc, pDst, &buffer,
- xSrc, ySrc, xDst, yDst);
- }
-
- if (maskFormat)
- {
- x = extents.x1;
- y = extents.y1;
- CompositePicture (op,
- pSrc,
- pMask,
- pDst,
- xSrc + x - xDst,
- ySrc + y - yDst,
- 0, 0,
- x, y,
- width, height);
- FreePicture ((pointer) pMask, (XID) 0);
- (*pScreen->DestroyPixmap) (pMaskPixmap);
- }
}
diff --git a/uxa/uxa-priv.h b/uxa/uxa-priv.h
index 363b9f70..35961aa5 100644
--- a/uxa/uxa-priv.h
+++ b/uxa/uxa-priv.h
@@ -70,14 +70,13 @@
/* Provide substitutes for gcc's __FUNCTION__ on other compilers */
#if !defined(__GNUC__) && !defined(__FUNCTION__)
-# if defined(__STDC__) && (__STDC_VERSION__>=199901L) /* C99 */
+# if defined(__STDC__) && (__STDC_VERSION__>=199901L) /* C99 */
# define __FUNCTION__ __func__
# else
# define __FUNCTION__ ""
# endif
#endif
-
/* 1.6 and earlier server compat */
#ifndef miGetCompositeClip
#define miCopyRegion fbCopyRegion
@@ -95,8 +94,7 @@ if (uxa_get_screen(screen)->fallback_debug) { \
ErrorF x; \
}
-char
-uxa_drawable_location(DrawablePtr pDrawable);
+char uxa_drawable_location(DrawablePtr pDrawable);
#if DEBUG_PIXMAP
#define DBG_PIXMAP(a) ErrorF a
@@ -105,64 +103,65 @@ uxa_drawable_location(DrawablePtr pDrawable);
#endif
typedef struct {
- unsigned char sha1[20];
+ unsigned char sha1[20];
} uxa_cached_glyph_t;
typedef struct {
- /* The identity of the cache, statically configured at initialization */
- unsigned int format;
- int glyphWidth;
- int glyphHeight;
-
- int size; /* Size of cache; eventually this should be dynamically determined */
-
- /* Hash table mapping from glyph sha1 to position in the glyph; we use
- * open addressing with a hash table size determined based on size and large
- * enough so that we always have a good amount of free space, so we can
- * use linear probing. (Linear probing is preferrable to double hashing
- * here because it allows us to easily remove entries.)
- */
- int *hashEntries;
- int hashSize;
-
- uxa_cached_glyph_t *glyphs;
- int glyphCount; /* Current number of glyphs */
-
- PicturePtr picture; /* Where the glyphs of the cache are stored */
- int yOffset; /* y location within the picture where the cache starts */
- int columns; /* Number of columns the glyphs are layed out in */
- int evictionPosition; /* Next random position to evict a glyph */
+ /* The identity of the cache, statically configured at initialization */
+ unsigned int format;
+ int glyphWidth;
+ int glyphHeight;
+
+ /* Size of cache; eventually this should be dynamically determined */
+ int size;
+
+ /* Hash table mapping from glyph sha1 to position in the glyph; we use
+ * open addressing with a hash table size determined based on size and large
+ * enough so that we always have a good amount of free space, so we can
+ * use linear probing. (Linear probing is preferrable to double hashing
+ * here because it allows us to easily remove entries.)
+ */
+ int *hashEntries;
+ int hashSize;
+
+ uxa_cached_glyph_t *glyphs;
+ int glyphCount; /* Current number of glyphs */
+
+ PicturePtr picture; /* Where the glyphs of the cache are stored */
+ int yOffset; /* y location within the picture where the cache starts */
+ int columns; /* Number of columns the glyphs are layed out in */
+ int evictionPosition; /* Next random position to evict a glyph */
} uxa_glyph_cache_t;
#define UXA_NUM_GLYPH_CACHES 4
-typedef void (*EnableDisableFBAccessProcPtr)(int, Bool);
+typedef void (*EnableDisableFBAccessProcPtr) (int, Bool);
typedef struct {
- uxa_driver_t *info;
- CreateGCProcPtr SavedCreateGC;
- CloseScreenProcPtr SavedCloseScreen;
- GetImageProcPtr SavedGetImage;
- GetSpansProcPtr SavedGetSpans;
- CreatePixmapProcPtr SavedCreatePixmap;
- DestroyPixmapProcPtr SavedDestroyPixmap;
- CopyWindowProcPtr SavedCopyWindow;
- ChangeWindowAttributesProcPtr SavedChangeWindowAttributes;
- BitmapToRegionProcPtr SavedBitmapToRegion;
+ uxa_driver_t *info;
+ CreateGCProcPtr SavedCreateGC;
+ CloseScreenProcPtr SavedCloseScreen;
+ GetImageProcPtr SavedGetImage;
+ GetSpansProcPtr SavedGetSpans;
+ CreatePixmapProcPtr SavedCreatePixmap;
+ DestroyPixmapProcPtr SavedDestroyPixmap;
+ CopyWindowProcPtr SavedCopyWindow;
+ ChangeWindowAttributesProcPtr SavedChangeWindowAttributes;
+ BitmapToRegionProcPtr SavedBitmapToRegion;
#ifdef RENDER
- CompositeProcPtr SavedComposite;
- TrianglesProcPtr SavedTriangles;
- GlyphsProcPtr SavedGlyphs;
- TrapezoidsProcPtr SavedTrapezoids;
- AddTrapsProcPtr SavedAddTraps;
+ CompositeProcPtr SavedComposite;
+ TrianglesProcPtr SavedTriangles;
+ GlyphsProcPtr SavedGlyphs;
+ TrapezoidsProcPtr SavedTrapezoids;
+ AddTrapsProcPtr SavedAddTraps;
#endif
- EnableDisableFBAccessProcPtr SavedEnableDisableFBAccess;
+ EnableDisableFBAccessProcPtr SavedEnableDisableFBAccess;
- Bool fallback_debug;
- Bool swappedOut;
- unsigned disableFbCount;
- unsigned offScreenCounter;
+ Bool fallback_debug;
+ Bool swappedOut;
+ unsigned disableFbCount;
+ unsigned offScreenCounter;
- uxa_glyph_cache_t glyphCaches[UXA_NUM_GLYPH_CACHES];
+ uxa_glyph_cache_t glyphCaches[UXA_NUM_GLYPH_CACHES];
} uxa_screen_t;
/*
@@ -178,11 +177,10 @@ typedef struct {
#endif
extern int uxa_screen_index;
-static inline uxa_screen_t *
-uxa_get_screen(ScreenPtr screen)
+static inline uxa_screen_t *uxa_get_screen(ScreenPtr screen)
{
- return (uxa_screen_t *)dixLookupPrivate(&screen->devPrivates,
- &uxa_screen_index);
+ return (uxa_screen_t *) dixLookupPrivate(&screen->devPrivates,
+ &uxa_screen_index);
}
/** Align an offset to an arbitrary alignment */
@@ -192,135 +190,122 @@ uxa_get_screen(ScreenPtr screen)
#define UXA_ALIGN2(offset, align) (((offset) + (align) - 1) & ~((align) - 1))
typedef struct {
- INT16 xSrc;
- INT16 ySrc;
- INT16 xDst;
- INT16 yDst;
- INT16 width;
- INT16 height;
+ INT16 xSrc;
+ INT16 ySrc;
+ INT16 xDst;
+ INT16 yDst;
+ INT16 width;
+ INT16 height;
} uxa_composite_rect_t;
/**
* exaDDXDriverInit must be implemented by the DDX using EXA, and is the place
* to set EXA options or hook in screen functions to handle using EXA as the AA.
*/
-void exaDDXDriverInit (ScreenPtr pScreen);
+void exaDDXDriverInit(ScreenPtr pScreen);
-Bool
-uxa_prepare_access_window(WindowPtr pWin);
+Bool uxa_prepare_access_window(WindowPtr pWin);
-void
-uxa_finish_access_window(WindowPtr pWin);
+void uxa_finish_access_window(WindowPtr pWin);
/* uxa-unaccel.c */
-Bool
-uxa_prepare_access_gc(GCPtr pGC);
+Bool uxa_prepare_access_gc(GCPtr pGC);
-void
-uxa_finish_access_gc(GCPtr pGC);
+void uxa_finish_access_gc(GCPtr pGC);
void
-uxa_check_fill_spans (DrawablePtr pDrawable, GCPtr pGC, int nspans,
- DDXPointPtr ppt, int *pwidth, int fSorted);
+uxa_check_fill_spans(DrawablePtr pDrawable, GCPtr pGC, int nspans,
+ DDXPointPtr ppt, int *pwidth, int fSorted);
void
-uxa_check_set_spans (DrawablePtr pDrawable, GCPtr pGC, char *psrc,
- DDXPointPtr ppt, int *pwidth, int nspans, int fSorted);
+uxa_check_set_spans(DrawablePtr pDrawable, GCPtr pGC, char *psrc,
+ DDXPointPtr ppt, int *pwidth, int nspans, int fSorted);
void
-uxa_check_put_image (DrawablePtr pDrawable, GCPtr pGC, int depth,
- int x, int y, int w, int h, int leftPad, int format,
- char *bits);
+uxa_check_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth,
+ int x, int y, int w, int h, int leftPad, int format,
+ char *bits);
RegionPtr
-uxa_check_copy_area (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty);
+uxa_check_copy_area(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ int srcx, int srcy, int w, int h, int dstx, int dsty);
RegionPtr
-uxa_check_copy_plane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty,
- unsigned long bitPlane);
+uxa_check_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ int srcx, int srcy, int w, int h, int dstx, int dsty,
+ unsigned long bitPlane);
void
-uxa_check_poly_point (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
- DDXPointPtr pptInit);
+uxa_check_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
+ DDXPointPtr pptInit);
void
-uxa_check_poly_lines (DrawablePtr pDrawable, GCPtr pGC,
- int mode, int npt, DDXPointPtr ppt);
+uxa_check_poly_lines(DrawablePtr pDrawable, GCPtr pGC,
+ int mode, int npt, DDXPointPtr ppt);
void
-uxa_check_poly_segment (DrawablePtr pDrawable, GCPtr pGC,
- int nsegInit, xSegment *pSegInit);
+uxa_check_poly_segment(DrawablePtr pDrawable, GCPtr pGC,
+ int nsegInit, xSegment * pSegInit);
void
-uxa_check_poly_arc (DrawablePtr pDrawable, GCPtr pGC,
- int narcs, xArc *pArcs);
+uxa_check_poly_arc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc * pArcs);
void
-uxa_check_poly_fill_rect (DrawablePtr pDrawable, GCPtr pGC,
- int nrect, xRectangle *prect);
+uxa_check_poly_fill_rect(DrawablePtr pDrawable, GCPtr pGC,
+ int nrect, xRectangle * prect);
void
-uxa_check_image_glyph_blt (DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr *ppci, pointer pglyphBase);
+uxa_check_image_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr * ppci, pointer pglyphBase);
void
-uxa_check_poly_glyph_blt (DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr *ppci, pointer pglyphBase);
+uxa_check_poly_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr * ppci, pointer pglyphBase);
void
-uxa_check_push_pixels (GCPtr pGC, PixmapPtr pBitmap,
- DrawablePtr pDrawable,
- int w, int h, int x, int y);
+uxa_check_push_pixels(GCPtr pGC, PixmapPtr pBitmap,
+ DrawablePtr pDrawable, int w, int h, int x, int y);
void
-uxa_check_get_spans (DrawablePtr pDrawable,
- int wMax,
- DDXPointPtr ppt,
- int *pwidth,
- int nspans,
- char *pdstStart);
+uxa_check_get_spans(DrawablePtr pDrawable,
+ int wMax,
+ DDXPointPtr ppt, int *pwidth, int nspans, char *pdstStart);
-void uxa_check_paint_window (WindowPtr pWin, RegionPtr pRegion, int what);
+void uxa_check_paint_window(WindowPtr pWin, RegionPtr pRegion, int what);
void
-uxa_check_add_traps (PicturePtr pPicture,
- INT16 x_off,
- INT16 y_off,
- int ntrap,
- xTrap *traps);
+uxa_check_add_traps(PicturePtr pPicture,
+ INT16 x_off, INT16 y_off, int ntrap, xTrap * traps);
/* uxa-accel.c */
static _X_INLINE Bool
uxa_gc_reads_destination(DrawablePtr pDrawable, unsigned long planemask,
- unsigned int fillStyle, unsigned char alu)
+ unsigned int fillStyle, unsigned char alu)
{
- return ((alu != GXcopy && alu != GXclear &&alu != GXset &&
- alu != GXcopyInverted) || fillStyle == FillStippled ||
- !UXA_PM_IS_SOLID(pDrawable, planemask));
+ return ((alu != GXcopy && alu != GXclear && alu != GXset &&
+ alu != GXcopyInverted) || fillStyle == FillStippled ||
+ !UXA_PM_IS_SOLID(pDrawable, planemask));
}
-void
-uxa_copy_window(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
+void uxa_copy_window(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
Bool
-uxa_fill_region_tiled (DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
- DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu);
+uxa_fill_region_tiled(DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
+ DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu);
void
-uxa_shm_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth, unsigned int format,
- int w, int h, int sx, int sy, int sw, int sh, int dx, int dy,
- char *data);
+uxa_shm_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth,
+ unsigned int format, int w, int h, int sx, int sy, int sw,
+ int sh, int dx, int dy, char *data);
void uxa_paint_window(WindowPtr pWin, RegionPtr pRegion, int what);
void
-uxa_get_image (DrawablePtr pDrawable, int x, int y, int w, int h,
- unsigned int format, unsigned long planeMask, char *d);
+uxa_get_image(DrawablePtr pDrawable, int x, int y, int w, int h,
+ unsigned int format, unsigned long planeMask, char *d);
extern const GCOps uxa_ops;
@@ -331,14 +316,11 @@ extern const GCOps uxa_ops;
#include "shmint.h"
#else
-void
-ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs);
+void ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs);
-void
-ShmSetPixmapFormat(ScreenPtr pScreen, int format);
+void ShmSetPixmapFormat(ScreenPtr pScreen, int format);
-void
-fbShmPutImage(XSHM_PUT_IMAGE_ARGS);
+void fbShmPutImage(XSHM_PUT_IMAGE_ARGS);
#endif
extern ShmFuncs uxa_shm_funcs;
@@ -349,132 +331,101 @@ extern ShmFuncs uxa_shm_funcs;
/* XXX these are in fbpict.h, which is not installed */
void
-fbComposite (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height);
-
-void
-fbAddTraps (PicturePtr pPicture,
- INT16 xOff,
- INT16 yOff,
- int ntrap,
- xTrap *traps);
-
-void
-uxa_check_composite (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height);
+fbComposite(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
+
+void
+fbAddTraps(PicturePtr pPicture,
+ INT16 xOff, INT16 yOff, int ntrap, xTrap * traps);
+
+void
+uxa_check_composite(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
#endif
/* uxa.c */
-Bool
-uxa_prepare_access(DrawablePtr pDrawable, uxa_access_t access);
+Bool uxa_prepare_access(DrawablePtr pDrawable, uxa_access_t access);
-void
-uxa_finish_access(DrawablePtr pDrawable);
+void uxa_finish_access(DrawablePtr pDrawable);
void
-uxa_get_drawable_deltas (DrawablePtr pDrawable, PixmapPtr pPixmap,
- int *xp, int *yp);
+uxa_get_drawable_deltas(DrawablePtr pDrawable, PixmapPtr pPixmap,
+ int *xp, int *yp);
-Bool
-uxa_drawable_is_offscreen (DrawablePtr pDrawable);
+Bool uxa_drawable_is_offscreen(DrawablePtr pDrawable);
-Bool
-uxa_pixmap_is_offscreen(PixmapPtr p);
+Bool uxa_pixmap_is_offscreen(PixmapPtr p);
-PixmapPtr
-uxa_get_offscreen_pixmap (DrawablePtr pDrawable, int *xp, int *yp);
+PixmapPtr uxa_get_offscreen_pixmap(DrawablePtr pDrawable, int *xp, int *yp);
-PixmapPtr
-uxa_get_drawable_pixmap(DrawablePtr pDrawable);
+PixmapPtr uxa_get_drawable_pixmap(DrawablePtr pDrawable);
RegionPtr
uxa_copy_area(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
- int srcx, int srcy, int width, int height, int dstx, int dsty);
+ int srcx, int srcy, int width, int height, int dstx, int dsty);
void
-uxa_copy_n_to_n (DrawablePtr pSrcDrawable,
- DrawablePtr pDstDrawable,
- GCPtr pGC,
- BoxPtr pbox,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown,
- Pixel bitplane,
- void *closure);
+uxa_copy_n_to_n(DrawablePtr pSrcDrawable,
+ DrawablePtr pDstDrawable,
+ GCPtr pGC,
+ BoxPtr pbox,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse, Bool upsidedown, Pixel bitplane, void *closure);
/* uxa_render.c */
-Bool
-uxa_op_reads_destination (CARD8 op);
+Bool uxa_op_reads_destination(CARD8 op);
void
-uxa_composite(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height);
+uxa_composite(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
void
-uxa_composite_rects(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- int nrect,
- uxa_composite_rect_t *rects);
+uxa_composite_rects(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst, int nrect, uxa_composite_rect_t * rects);
void
-uxa_trapezoids (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
- PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
- int ntrap, xTrapezoid *traps);
+uxa_trapezoids(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
+ PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
+ int ntrap, xTrapezoid * traps);
void
-uxa_triangles (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
- PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
- int ntri, xTriangle *tris);
+uxa_triangles(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
+ PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
+ int ntri, xTriangle * tris);
/* uxa_glyph.c */
-void
-uxa_glyphs_init(ScreenPtr pScreen);
+void uxa_glyphs_init(ScreenPtr pScreen);
-void
-uxa_glyphs_fini (ScreenPtr pScreen);
+void uxa_glyphs_fini(ScreenPtr pScreen);
void
-uxa_glyphs (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc,
- int nlist,
- GlyphListPtr list,
- GlyphPtr *glyphs);
+uxa_glyphs(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc, int nlist, GlyphListPtr list, GlyphPtr * glyphs);
#endif /* UXAPRIV_H */
diff --git a/uxa/uxa-render.c b/uxa/uxa-render.c
index 4850185d..32ea3798 100644
--- a/uxa/uxa-render.c
+++ b/uxa/uxa-render.c
@@ -34,285 +34,272 @@
#ifdef RENDER
#include "mipict.h"
-static void uxa_composite_fallback_pict_desc(PicturePtr pict, char *string, int n)
+static void uxa_composite_fallback_pict_desc(PicturePtr pict, char *string,
+ int n)
{
- char format[20];
- char size[20];
- char loc;
-
- if (!pict) {
- snprintf(string, n, "None");
- return;
- }
-
- if (pict->pDrawable == NULL) {
- snprintf(string, n, "source-only");
- return;
- }
-
- switch (pict->format)
- {
- case PICT_a8r8g8b8:
- snprintf(format, 20, "ARGB8888");
- break;
- case PICT_x8r8g8b8:
- snprintf(format, 20, "XRGB8888");
- break;
- case PICT_r5g6b5:
- snprintf(format, 20, "RGB565 ");
- break;
- case PICT_x1r5g5b5:
- snprintf(format, 20, "RGB555 ");
- break;
- case PICT_a8:
- snprintf(format, 20, "A8 ");
- break;
- case PICT_a1:
- snprintf(format, 20, "A1 ");
- break;
- default:
- snprintf(format, 20, "0x%x", (int)pict->format);
- break;
- }
-
- loc = uxa_drawable_is_offscreen(pict->pDrawable) ? 's' : 'm';
-
- snprintf(size, 20, "%dx%d%s", pict->pDrawable->width,
- pict->pDrawable->height, pict->repeat ?
- " R" : "");
-
- snprintf(string, n, "%p:%c fmt %s (%s)", pict->pDrawable, loc, format, size);
+ char format[20];
+ char size[20];
+ char loc;
+
+ if (!pict) {
+ snprintf(string, n, "None");
+ return;
+ }
+
+ if (pict->pDrawable == NULL) {
+ snprintf(string, n, "source-only");
+ return;
+ }
+
+ switch (pict->format) {
+ case PICT_a8r8g8b8:
+ snprintf(format, 20, "ARGB8888");
+ break;
+ case PICT_x8r8g8b8:
+ snprintf(format, 20, "XRGB8888");
+ break;
+ case PICT_r5g6b5:
+ snprintf(format, 20, "RGB565 ");
+ break;
+ case PICT_x1r5g5b5:
+ snprintf(format, 20, "RGB555 ");
+ break;
+ case PICT_a8:
+ snprintf(format, 20, "A8 ");
+ break;
+ case PICT_a1:
+ snprintf(format, 20, "A1 ");
+ break;
+ default:
+ snprintf(format, 20, "0x%x", (int)pict->format);
+ break;
+ }
+
+ loc = uxa_drawable_is_offscreen(pict->pDrawable) ? 's' : 'm';
+
+ snprintf(size, 20, "%dx%d%s", pict->pDrawable->width,
+ pict->pDrawable->height, pict->repeat ? " R" : "");
+
+ snprintf(string, n, "%p:%c fmt %s (%s)", pict->pDrawable, loc, format,
+ size);
}
static void
uxa_print_composite_fallback(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst)
+ PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst)
{
- char sop[20];
- char srcdesc[40], maskdesc[40], dstdesc[40];
-
- switch(op)
- {
- case PictOpSrc:
- sprintf(sop, "Src");
- break;
- case PictOpOver:
- sprintf(sop, "Over");
- break;
- default:
- sprintf(sop, "0x%x", (int)op);
- break;
- }
-
- uxa_composite_fallback_pict_desc(pSrc, srcdesc, 40);
- uxa_composite_fallback_pict_desc(pMask, maskdesc, 40);
- uxa_composite_fallback_pict_desc(pDst, dstdesc, 40);
-
- ErrorF("Composite fallback: op %s, \n"
- " src %s, \n"
- " mask %s, \n"
- " dst %s, \n",
- sop, srcdesc, maskdesc, dstdesc);
+ char sop[20];
+ char srcdesc[40], maskdesc[40], dstdesc[40];
+
+ switch (op) {
+ case PictOpSrc:
+ sprintf(sop, "Src");
+ break;
+ case PictOpOver:
+ sprintf(sop, "Over");
+ break;
+ default:
+ sprintf(sop, "0x%x", (int)op);
+ break;
+ }
+
+ uxa_composite_fallback_pict_desc(pSrc, srcdesc, 40);
+ uxa_composite_fallback_pict_desc(pMask, maskdesc, 40);
+ uxa_composite_fallback_pict_desc(pDst, dstdesc, 40);
+
+ ErrorF("Composite fallback: op %s, \n"
+ " src %s, \n"
+ " mask %s, \n"
+ " dst %s, \n",
+ sop, srcdesc, maskdesc, dstdesc);
}
-Bool
-uxa_op_reads_destination (CARD8 op)
+Bool uxa_op_reads_destination(CARD8 op)
{
- /* FALSE (does not read destination) is the list of ops in the protocol
- * document with "0" in the "Fb" column and no "Ab" in the "Fa" column.
- * That's just Clear and Src. ReduceCompositeOp() will already have
- * converted con/disjoint clear/src to Clear or Src.
- */
- switch (op) {
- case PictOpClear:
- case PictOpSrc:
- return FALSE;
- default:
- return TRUE;
- }
+ /* FALSE (does not read destination) is the list of ops in the protocol
+ * document with "0" in the "Fb" column and no "Ab" in the "Fa" column.
+ * That's just Clear and Src. ReduceCompositeOp() will already have
+ * converted con/disjoint clear/src to Clear or Src.
+ */
+ switch (op) {
+ case PictOpClear:
+ case PictOpSrc:
+ return FALSE;
+ default:
+ return TRUE;
+ }
}
-
static Bool
-uxa_get_pixel_from_rgba(CARD32 *pixel,
- CARD16 red,
- CARD16 green,
- CARD16 blue,
- CARD16 alpha,
- CARD32 format)
+uxa_get_pixel_from_rgba(CARD32 * pixel,
+ CARD16 red,
+ CARD16 green, CARD16 blue, CARD16 alpha, CARD32 format)
{
- int rbits, bbits, gbits, abits;
- int rshift, bshift, gshift, ashift;
-
- *pixel = 0;
-
- if (!PICT_FORMAT_COLOR(format))
- return FALSE;
-
- rbits = PICT_FORMAT_R(format);
- gbits = PICT_FORMAT_G(format);
- bbits = PICT_FORMAT_B(format);
- abits = PICT_FORMAT_A(format);
-
- if (PICT_FORMAT_TYPE(format) == PICT_TYPE_ARGB) {
- bshift = 0;
- gshift = bbits;
- rshift = gshift + gbits;
- ashift = rshift + rbits;
- } else { /* PICT_TYPE_ABGR */
- rshift = 0;
- gshift = rbits;
- bshift = gshift + gbits;
- ashift = bshift + bbits;
- }
-
- *pixel |= ( blue >> (16 - bbits)) << bshift;
- *pixel |= ( red >> (16 - rbits)) << rshift;
- *pixel |= (green >> (16 - gbits)) << gshift;
- *pixel |= (alpha >> (16 - abits)) << ashift;
-
- return TRUE;
+ int rbits, bbits, gbits, abits;
+ int rshift, bshift, gshift, ashift;
+
+ *pixel = 0;
+
+ if (!PICT_FORMAT_COLOR(format))
+ return FALSE;
+
+ rbits = PICT_FORMAT_R(format);
+ gbits = PICT_FORMAT_G(format);
+ bbits = PICT_FORMAT_B(format);
+ abits = PICT_FORMAT_A(format);
+
+ if (PICT_FORMAT_TYPE(format) == PICT_TYPE_ARGB) {
+ bshift = 0;
+ gshift = bbits;
+ rshift = gshift + gbits;
+ ashift = rshift + rbits;
+ } else { /* PICT_TYPE_ABGR */
+ rshift = 0;
+ gshift = rbits;
+ bshift = gshift + gbits;
+ ashift = bshift + bbits;
+ }
+
+ *pixel |= (blue >> (16 - bbits)) << bshift;
+ *pixel |= (red >> (16 - rbits)) << rshift;
+ *pixel |= (green >> (16 - gbits)) << gshift;
+ *pixel |= (alpha >> (16 - abits)) << ashift;
+
+ return TRUE;
}
static Bool
-uxa_get_rgba_from_pixel(CARD32 pixel,
- CARD16 *red,
- CARD16 *green,
- CARD16 *blue,
- CARD16 *alpha,
- CARD32 format)
+uxa_get_rgba_from_pixel(CARD32 pixel,
+ CARD16 * red,
+ CARD16 * green,
+ CARD16 * blue, CARD16 * alpha, CARD32 format)
{
- int rbits, bbits, gbits, abits;
- int rshift, bshift, gshift, ashift;
-
- if (!PICT_FORMAT_COLOR(format))
- return FALSE;
-
- rbits = PICT_FORMAT_R(format);
- gbits = PICT_FORMAT_G(format);
- bbits = PICT_FORMAT_B(format);
- abits = PICT_FORMAT_A(format);
-
- if (PICT_FORMAT_TYPE(format) == PICT_TYPE_ARGB) {
- bshift = 0;
- gshift = bbits;
- rshift = gshift + gbits;
- ashift = rshift + rbits;
- } else { /* PICT_TYPE_ABGR */
- rshift = 0;
- gshift = rbits;
- bshift = gshift + gbits;
- ashift = bshift + bbits;
- }
-
- *red = ((pixel >> rshift ) & ((1 << rbits) - 1)) << (16 - rbits);
- while (rbits < 16) {
- *red |= *red >> rbits;
- rbits <<= 1;
- }
-
- *green = ((pixel >> gshift ) & ((1 << gbits) - 1)) << (16 - gbits);
- while (gbits < 16) {
- *green |= *green >> gbits;
- gbits <<= 1;
- }
-
- *blue = ((pixel >> bshift ) & ((1 << bbits) - 1)) << (16 - bbits);
- while (bbits < 16) {
- *blue |= *blue >> bbits;
- bbits <<= 1;
- }
-
- if (abits) {
- *alpha = ((pixel >> ashift ) & ((1 << abits) - 1)) << (16 - abits);
- while (abits < 16) {
- *alpha |= *alpha >> abits;
- abits <<= 1;
+ int rbits, bbits, gbits, abits;
+ int rshift, bshift, gshift, ashift;
+
+ if (!PICT_FORMAT_COLOR(format))
+ return FALSE;
+
+ rbits = PICT_FORMAT_R(format);
+ gbits = PICT_FORMAT_G(format);
+ bbits = PICT_FORMAT_B(format);
+ abits = PICT_FORMAT_A(format);
+
+ if (PICT_FORMAT_TYPE(format) == PICT_TYPE_ARGB) {
+ bshift = 0;
+ gshift = bbits;
+ rshift = gshift + gbits;
+ ashift = rshift + rbits;
+ } else { /* PICT_TYPE_ABGR */
+ rshift = 0;
+ gshift = rbits;
+ bshift = gshift + gbits;
+ ashift = bshift + bbits;
+ }
+
+ *red = ((pixel >> rshift) & ((1 << rbits) - 1)) << (16 - rbits);
+ while (rbits < 16) {
+ *red |= *red >> rbits;
+ rbits <<= 1;
}
- } else
- *alpha = 0xffff;
- return TRUE;
+ *green = ((pixel >> gshift) & ((1 << gbits) - 1)) << (16 - gbits);
+ while (gbits < 16) {
+ *green |= *green >> gbits;
+ gbits <<= 1;
+ }
+
+ *blue = ((pixel >> bshift) & ((1 << bbits) - 1)) << (16 - bbits);
+ while (bbits < 16) {
+ *blue |= *blue >> bbits;
+ bbits <<= 1;
+ }
+
+ if (abits) {
+ *alpha =
+ ((pixel >> ashift) & ((1 << abits) - 1)) << (16 - abits);
+ while (abits < 16) {
+ *alpha |= *alpha >> abits;
+ abits <<= 1;
+ }
+ } else
+ *alpha = 0xffff;
+
+ return TRUE;
}
static int
-uxa_try_driver_solid_fill(PicturePtr pSrc,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height)
+uxa_try_driver_solid_fill(PicturePtr pSrc,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xDst, INT16 yDst, CARD16 width, CARD16 height)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pDst->pDrawable->pScreen);
- RegionRec region;
- BoxPtr pbox;
- int nbox;
- int dst_off_x, dst_off_y;
- PixmapPtr pSrcPix, pDstPix;
- CARD32 pixel;
- CARD16 red, green, blue, alpha;
-
- pDstPix = uxa_get_drawable_pixmap (pDst->pDrawable);
- pSrcPix = uxa_get_drawable_pixmap (pSrc->pDrawable);
-
- xDst += pDst->pDrawable->x;
- yDst += pDst->pDrawable->y;
- xSrc += pSrc->pDrawable->x;
- ySrc += pSrc->pDrawable->y;
-
- if (!miComputeCompositeRegion (&region, pSrc, NULL, pDst,
- xSrc, ySrc, 0, 0, xDst, yDst,
- width, height))
- return 1;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDst->pDrawable->pScreen);
+ RegionRec region;
+ BoxPtr pbox;
+ int nbox;
+ int dst_off_x, dst_off_y;
+ PixmapPtr pSrcPix, pDstPix;
+ CARD32 pixel;
+ CARD16 red, green, blue, alpha;
- uxa_get_drawable_deltas (pDst->pDrawable, pDstPix, &dst_off_x, &dst_off_y);
+ pDstPix = uxa_get_drawable_pixmap(pDst->pDrawable);
+ pSrcPix = uxa_get_drawable_pixmap(pSrc->pDrawable);
- REGION_TRANSLATE(pScreen, &region, dst_off_x, dst_off_y);
+ xDst += pDst->pDrawable->x;
+ yDst += pDst->pDrawable->y;
+ xSrc += pSrc->pDrawable->x;
+ ySrc += pSrc->pDrawable->y;
- pixel = uxa_get_pixmap_first_pixel (pSrcPix);
+ if (!miComputeCompositeRegion(&region, pSrc, NULL, pDst,
+ xSrc, ySrc, 0, 0, xDst, yDst,
+ width, height))
+ return 1;
- if (!uxa_pixmap_is_offscreen(pDstPix)) {
- REGION_UNINIT(pDst->pDrawable->pScreen, &region);
- return 0;
- }
+ uxa_get_drawable_deltas(pDst->pDrawable, pDstPix, &dst_off_x,
+ &dst_off_y);
- if (!uxa_get_rgba_from_pixel(pixel, &red, &green, &blue, &alpha,
- pSrc->format))
- {
- REGION_UNINIT(pDst->pDrawable->pScreen, &region);
- return -1;
- }
+ REGION_TRANSLATE(pScreen, &region, dst_off_x, dst_off_y);
- if (!uxa_get_pixel_from_rgba(&pixel, red, green, blue, alpha,
- pDst->format))
- {
- REGION_UNINIT(pDst->pDrawable->pScreen, &region);
- return -1;
- }
+ pixel = uxa_get_pixmap_first_pixel(pSrcPix);
- if (!(*uxa_screen->info->prepare_solid) (pDstPix, GXcopy, 0xffffffff, pixel))
- {
- REGION_UNINIT(pDst->pDrawable->pScreen, &region);
- return -1;
- }
+ if (!uxa_pixmap_is_offscreen(pDstPix)) {
+ REGION_UNINIT(pDst->pDrawable->pScreen, &region);
+ return 0;
+ }
+
+ if (!uxa_get_rgba_from_pixel(pixel, &red, &green, &blue, &alpha,
+ pSrc->format)) {
+ REGION_UNINIT(pDst->pDrawable->pScreen, &region);
+ return -1;
+ }
- nbox = REGION_NUM_RECTS(&region);
- pbox = REGION_RECTS(&region);
+ if (!uxa_get_pixel_from_rgba(&pixel, red, green, blue, alpha,
+ pDst->format)) {
+ REGION_UNINIT(pDst->pDrawable->pScreen, &region);
+ return -1;
+ }
- while (nbox--)
- {
- (*uxa_screen->info->solid) (pDstPix, pbox->x1, pbox->y1, pbox->x2, pbox->y2);
- pbox++;
- }
+ if (!(*uxa_screen->info->prepare_solid)
+ (pDstPix, GXcopy, 0xffffffff, pixel)) {
+ REGION_UNINIT(pDst->pDrawable->pScreen, &region);
+ return -1;
+ }
- (*uxa_screen->info->done_solid) (pDstPix);
+ nbox = REGION_NUM_RECTS(&region);
+ pbox = REGION_RECTS(&region);
- REGION_UNINIT(pDst->pDrawable->pScreen, &region);
- return 1;
+ while (nbox--) {
+ (*uxa_screen->info->solid) (pDstPix, pbox->x1, pbox->y1,
+ pbox->x2, pbox->y2);
+ pbox++;
+ }
+
+ (*uxa_screen->info->done_solid) (pDstPix);
+
+ REGION_UNINIT(pDst->pDrawable->pScreen, &region);
+ return 1;
}
/* In order to avoid fallbacks when using an a1 source/mask,
@@ -322,119 +309,113 @@ uxa_try_driver_solid_fill(PicturePtr pSrc,
* than causing a fallback.
*/
static PicturePtr
-uxa_picture_from_a1_pixman_image (ScreenPtr pScreen,
- pixman_image_t *image)
+uxa_picture_from_a1_pixman_image(ScreenPtr pScreen, pixman_image_t * image)
{
- PicturePtr pPicture;
- PicturePtr pSrc;
- PixmapPtr pPixmap;
- int width, height;
- int error;
-
- width = pixman_image_get_width (image);
- height = pixman_image_get_height (image);
-
- pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 8,
- UXA_CREATE_PIXMAP_FOR_MAP);
- if (!pPixmap)
- return 0;
-
- pPicture = CreatePicture (0, &pPixmap->drawable,
- PictureMatchFormat (pScreen, 8, PICT_a8),
- 0, 0, serverClient, &error);
- (*pScreen->DestroyPixmap) (pPixmap);
- if (!pPicture)
- return 0;
-
- ValidatePicture (pPicture);
-
- pPixmap = GetScratchPixmapHeader(pScreen, width, height, 1,
- BitsPerPixel (1),
- pixman_image_get_stride (image),
- pixman_image_get_data (image));
- if (!pPixmap) {
- FreePicture (pPicture, 0);
- return 0;
- }
-
- pSrc = CreatePicture (0, &pPixmap->drawable,
- PictureMatchFormat (pScreen, 1, PICT_a1),
- 0, 0, serverClient, &error);
- FreeScratchPixmapHeader (pPixmap);
- if (!pSrc) {
- FreePicture (pPicture, 0);
- return 0;
- }
-
- CompositePicture (PictOpSrc, pSrc, NULL, pPicture,
- 0, 0,
- 0, 0,
- 0, 0,
- width, height);
-
- FreePicture (pSrc, 0);
-
- return pPicture;
+ PicturePtr pPicture;
+ PicturePtr pSrc;
+ PixmapPtr pPixmap;
+ int width, height;
+ int error;
+
+ width = pixman_image_get_width(image);
+ height = pixman_image_get_height(image);
+
+ pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, 8,
+ UXA_CREATE_PIXMAP_FOR_MAP);
+ if (!pPixmap)
+ return 0;
+
+ pPicture = CreatePicture(0, &pPixmap->drawable,
+ PictureMatchFormat(pScreen, 8, PICT_a8),
+ 0, 0, serverClient, &error);
+ (*pScreen->DestroyPixmap) (pPixmap);
+ if (!pPicture)
+ return 0;
+
+ ValidatePicture(pPicture);
+
+ pPixmap = GetScratchPixmapHeader(pScreen, width, height, 1,
+ BitsPerPixel(1),
+ pixman_image_get_stride(image),
+ pixman_image_get_data(image));
+ if (!pPixmap) {
+ FreePicture(pPicture, 0);
+ return 0;
+ }
+
+ pSrc = CreatePicture(0, &pPixmap->drawable,
+ PictureMatchFormat(pScreen, 1, PICT_a1),
+ 0, 0, serverClient, &error);
+ FreeScratchPixmapHeader(pPixmap);
+ if (!pSrc) {
+ FreePicture(pPicture, 0);
+ return 0;
+ }
+
+ CompositePicture(PictOpSrc, pSrc, NULL, pPicture,
+ 0, 0, 0, 0, 0, 0, width, height);
+
+ FreePicture(pSrc, 0);
+
+ return pPicture;
}
static PicturePtr
-uxa_picture_from_pixman_image (ScreenPtr pScreen,
- pixman_image_t *image,
- pixman_format_code_t format)
+uxa_picture_from_pixman_image(ScreenPtr pScreen,
+ pixman_image_t * image,
+ pixman_format_code_t format)
{
- PicturePtr pPicture;
- PixmapPtr pPixmap;
- GCPtr pGC;
- int width, height, depth;
- int error;
-
- if (format == PICT_a1)
- return uxa_picture_from_a1_pixman_image (pScreen, image);
-
- width = pixman_image_get_width (image);
- height = pixman_image_get_height (image);
- depth = pixman_image_get_depth (image);
-
- pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, depth,
- UXA_CREATE_PIXMAP_FOR_MAP);
- if (!pPixmap)
- return 0;
-
- pPicture = CreatePicture (0, &pPixmap->drawable,
- PictureMatchFormat (pScreen, depth, format),
- 0, 0, serverClient, &error);
- (*pScreen->DestroyPixmap) (pPixmap);
- if (!pPicture)
- return 0;
-
- ValidatePicture (pPicture);
-
- pPixmap = GetScratchPixmapHeader(pScreen, width, height, depth,
- BitsPerPixel (depth),
- pixman_image_get_stride (image),
- pixman_image_get_data (image));
- if (!pPixmap)
- {
- FreePicture (pPicture, 0);
- return 0;
- }
-
- pGC = GetScratchGC (depth, pScreen);
- if (!pGC)
- {
- FreeScratchPixmapHeader (pPixmap);
- FreePicture (pPicture, 0);
- return 0;
- }
- ValidateGC (pPicture->pDrawable, pGC);
-
- (*pGC->ops->CopyArea) (&pPixmap->drawable, pPicture->pDrawable,
- pGC, 0, 0, width, height, 0, 0);
-
- FreeScratchGC (pGC);
- FreeScratchPixmapHeader (pPixmap);
-
- return pPicture;
+ PicturePtr pPicture;
+ PixmapPtr pPixmap;
+ GCPtr pGC;
+ int width, height, depth;
+ int error;
+
+ if (format == PICT_a1)
+ return uxa_picture_from_a1_pixman_image(pScreen, image);
+
+ width = pixman_image_get_width(image);
+ height = pixman_image_get_height(image);
+ depth = pixman_image_get_depth(image);
+
+ pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, depth,
+ UXA_CREATE_PIXMAP_FOR_MAP);
+ if (!pPixmap)
+ return 0;
+
+ pPicture = CreatePicture(0, &pPixmap->drawable,
+ PictureMatchFormat(pScreen, depth, format),
+ 0, 0, serverClient, &error);
+ (*pScreen->DestroyPixmap) (pPixmap);
+ if (!pPicture)
+ return 0;
+
+ ValidatePicture(pPicture);
+
+ pPixmap = GetScratchPixmapHeader(pScreen, width, height, depth,
+ BitsPerPixel(depth),
+ pixman_image_get_stride(image),
+ pixman_image_get_data(image));
+ if (!pPixmap) {
+ FreePicture(pPicture, 0);
+ return 0;
+ }
+
+ pGC = GetScratchGC(depth, pScreen);
+ if (!pGC) {
+ FreeScratchPixmapHeader(pPixmap);
+ FreePicture(pPicture, 0);
+ return 0;
+ }
+ ValidateGC(pPicture->pDrawable, pGC);
+
+ (*pGC->ops->CopyArea) (&pPixmap->drawable, pPicture->pDrawable,
+ pGC, 0, 0, width, height, 0, 0);
+
+ FreeScratchGC(pGC);
+ FreeScratchPixmapHeader(pPixmap);
+
+ return pPicture;
}
#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC (1,6,99,1,0)
@@ -444,153 +425,145 @@ uxa_picture_from_pixman_image (ScreenPtr pScreen,
#endif
static PicturePtr
-uxa_acquire_pattern (ScreenPtr pScreen,
- PicturePtr pPict,
- pixman_format_code_t format,
- INT16 x, INT16 y,
- CARD16 width, CARD16 height)
+uxa_acquire_pattern(ScreenPtr pScreen,
+ PicturePtr pPict,
+ pixman_format_code_t format,
+ INT16 x, INT16 y, CARD16 width, CARD16 height)
{
- pixman_image_t *source, *image;
-
- source = IMAGE_FROM_PICT (pPict);
- if (!source)
- return 0;
-
- image = pixman_image_create_bits (format, width, height, NULL, 0);
- if (!image) {
- pixman_image_unref (source);
- return 0;
- }
-
- pixman_image_composite (PIXMAN_OP_SRC,
- source, NULL, image,
- x, y,
- 0, 0,
- 0, 0,
- width, height);
- pixman_image_unref (source);
-
- pPict = uxa_picture_from_pixman_image (pScreen, image, format);
- pixman_image_unref (image);
-
- return pPict;
+ pixman_image_t *source, *image;
+
+ source = IMAGE_FROM_PICT(pPict);
+ if (!source)
+ return 0;
+
+ image = pixman_image_create_bits(format, width, height, NULL, 0);
+ if (!image) {
+ pixman_image_unref(source);
+ return 0;
+ }
+
+ pixman_image_composite(PIXMAN_OP_SRC,
+ source, NULL, image,
+ x, y, 0, 0, 0, 0, width, height);
+ pixman_image_unref(source);
+
+ pPict = uxa_picture_from_pixman_image(pScreen, image, format);
+ pixman_image_unref(image);
+
+ return pPict;
}
static PicturePtr
-uxa_acquire_source (ScreenPtr pScreen,
- PicturePtr pPict,
- INT16 x, INT16 y,
- CARD16 width, CARD16 height,
- INT16 *out_x, INT16 *out_y)
+uxa_acquire_source(ScreenPtr pScreen,
+ PicturePtr pPict,
+ INT16 x, INT16 y,
+ CARD16 width, CARD16 height, INT16 * out_x, INT16 * out_y)
{
- if (pPict->pDrawable) {
- *out_x = x + pPict->pDrawable->x;
- *out_y = y + pPict->pDrawable->y;
- return pPict;
- }
+ if (pPict->pDrawable) {
+ *out_x = x + pPict->pDrawable->x;
+ *out_y = y + pPict->pDrawable->y;
+ return pPict;
+ }
- *out_x = 0;
- *out_y = 0;
- return uxa_acquire_pattern (pScreen, pPict,
- PICT_a8r8g8b8, x, y, width, height);
+ *out_x = 0;
+ *out_y = 0;
+ return uxa_acquire_pattern(pScreen, pPict,
+ PICT_a8r8g8b8, x, y, width, height);
}
static PicturePtr
-uxa_acquire_mask (ScreenPtr pScreen,
- PicturePtr pPict,
- INT16 x, INT16 y,
- INT16 width, INT16 height,
- INT16 *out_x, INT16 *out_y)
+uxa_acquire_mask(ScreenPtr pScreen,
+ PicturePtr pPict,
+ INT16 x, INT16 y,
+ INT16 width, INT16 height, INT16 * out_x, INT16 * out_y)
{
- if (pPict->pDrawable) {
- *out_x = x + pPict->pDrawable->x;
- *out_y = y + pPict->pDrawable->y;
- return pPict;
- }
+ if (pPict->pDrawable) {
+ *out_x = x + pPict->pDrawable->x;
+ *out_y = y + pPict->pDrawable->y;
+ return pPict;
+ }
- *out_x = 0;
- *out_y = 0;
- return uxa_acquire_pattern (pScreen, pPict,
- PICT_a8, x, y, width, height);
+ *out_x = 0;
+ *out_y = 0;
+ return uxa_acquire_pattern(pScreen, pPict,
+ PICT_a8, x, y, width, height);
}
static int
-uxa_try_driver_composite_rects(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- int nrect,
- uxa_composite_rect_t *rects)
+uxa_try_driver_composite_rects(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ int nrect, uxa_composite_rect_t * rects)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pDst->pDrawable->pScreen);
- int src_off_x, src_off_y, dst_off_x, dst_off_y;
- PixmapPtr pSrcPix, pDstPix;
-
- if (!uxa_screen->info->prepare_composite || uxa_screen->swappedOut)
- return -1;
-
- if (uxa_screen->info->check_composite &&
- !(*uxa_screen->info->check_composite) (op, pSrc, NULL, pDst))
- {
- return -1;
- }
-
- pDstPix = uxa_get_offscreen_pixmap(pDst->pDrawable, &dst_off_x, &dst_off_y);
- if (!pDstPix)
- return 0;
-
- pSrcPix = uxa_get_offscreen_pixmap(pSrc->pDrawable, &src_off_x, &src_off_y);
- if (!pSrcPix)
- return 0;
-
- if (!(*uxa_screen->info->prepare_composite) (op, pSrc, NULL, pDst, pSrcPix,
- NULL, pDstPix))
- return -1;
-
- while (nrect--)
- {
- INT16 xDst = rects->xDst + pDst->pDrawable->x;
- INT16 yDst = rects->yDst + pDst->pDrawable->y;
- INT16 xSrc = rects->xSrc + pSrc->pDrawable->x;
- INT16 ySrc = rects->ySrc + pSrc->pDrawable->y;
-
- RegionRec region;
- BoxPtr pbox;
- int nbox;
-
- if (!miComputeCompositeRegion (&region, pSrc, NULL, pDst,
- xSrc, ySrc, 0, 0, xDst, yDst,
- rects->width, rects->height))
- goto next_rect;
-
- REGION_TRANSLATE(pScreen, &region, dst_off_x, dst_off_y);
-
- nbox = REGION_NUM_RECTS(&region);
- pbox = REGION_RECTS(&region);
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDst->pDrawable->pScreen);
+ int src_off_x, src_off_y, dst_off_x, dst_off_y;
+ PixmapPtr pSrcPix, pDstPix;
- xSrc = xSrc + src_off_x - xDst - dst_off_x;
- ySrc = ySrc + src_off_y - yDst - dst_off_y;
-
- while (nbox--)
- {
- (*uxa_screen->info->composite) (pDstPix,
- pbox->x1 + xSrc,
- pbox->y1 + ySrc,
- 0, 0,
- pbox->x1,
- pbox->y1,
- pbox->x2 - pbox->x1,
- pbox->y2 - pbox->y1);
- pbox++;
+ if (!uxa_screen->info->prepare_composite || uxa_screen->swappedOut)
+ return -1;
+
+ if (uxa_screen->info->check_composite &&
+ !(*uxa_screen->info->check_composite) (op, pSrc, NULL, pDst)) {
+ return -1;
}
- next_rect:
- REGION_UNINIT(pDst->pDrawable->pScreen, &region);
+ pDstPix =
+ uxa_get_offscreen_pixmap(pDst->pDrawable, &dst_off_x, &dst_off_y);
+ if (!pDstPix)
+ return 0;
+
+ pSrcPix =
+ uxa_get_offscreen_pixmap(pSrc->pDrawable, &src_off_x, &src_off_y);
+ if (!pSrcPix)
+ return 0;
+
+ if (!(*uxa_screen->info->prepare_composite)
+ (op, pSrc, NULL, pDst, pSrcPix, NULL, pDstPix))
+ return -1;
+
+ while (nrect--) {
+ INT16 xDst = rects->xDst + pDst->pDrawable->x;
+ INT16 yDst = rects->yDst + pDst->pDrawable->y;
+ INT16 xSrc = rects->xSrc + pSrc->pDrawable->x;
+ INT16 ySrc = rects->ySrc + pSrc->pDrawable->y;
+
+ RegionRec region;
+ BoxPtr pbox;
+ int nbox;
+
+ if (!miComputeCompositeRegion(&region, pSrc, NULL, pDst,
+ xSrc, ySrc, 0, 0, xDst, yDst,
+ rects->width, rects->height))
+ goto next_rect;
+
+ REGION_TRANSLATE(pScreen, &region, dst_off_x, dst_off_y);
+
+ nbox = REGION_NUM_RECTS(&region);
+ pbox = REGION_RECTS(&region);
+
+ xSrc = xSrc + src_off_x - xDst - dst_off_x;
+ ySrc = ySrc + src_off_y - yDst - dst_off_y;
+
+ while (nbox--) {
+ (*uxa_screen->info->composite) (pDstPix,
+ pbox->x1 + xSrc,
+ pbox->y1 + ySrc,
+ 0, 0,
+ pbox->x1,
+ pbox->y1,
+ pbox->x2 - pbox->x1,
+ pbox->y2 - pbox->y1);
+ pbox++;
+ }
- rects++;
- }
- (*uxa_screen->info->done_composite) (pDstPix);
-
- return 1;
+next_rect:
+ REGION_UNINIT(pDst->pDrawable->pScreen, &region);
+
+ rects++;
+ }
+ (*uxa_screen->info->done_composite) (pDstPix);
+
+ return 1;
}
/**
@@ -602,170 +575,163 @@ uxa_try_driver_composite_rects(CARD8 op,
* fallback straight to software.
*/
void
-uxa_composite_rects(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- int nrect,
- uxa_composite_rect_t *rects)
+uxa_composite_rects(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst, int nrect, uxa_composite_rect_t * rects)
{
- int n;
- uxa_composite_rect_t *r;
-
+ int n;
+ uxa_composite_rect_t *r;
+
/************************************************************/
-
- ValidatePicture (pSrc);
- ValidatePicture (pDst);
-
- if (uxa_try_driver_composite_rects(op, pSrc, pDst, nrect, rects) != 1) {
- n = nrect;
- r = rects;
- while (n--) {
- uxa_check_composite (op, pSrc, NULL, pDst,
- r->xSrc, r->ySrc,
- 0, 0,
- r->xDst, r->yDst,
- r->width, r->height);
- r++;
+
+ ValidatePicture(pSrc);
+ ValidatePicture(pDst);
+
+ if (uxa_try_driver_composite_rects(op, pSrc, pDst, nrect, rects) != 1) {
+ n = nrect;
+ r = rects;
+ while (n--) {
+ uxa_check_composite(op, pSrc, NULL, pDst,
+ r->xSrc, r->ySrc,
+ 0, 0,
+ r->xDst, r->yDst,
+ r->width, r->height);
+ r++;
+ }
}
- }
-
+
/************************************************************/
}
static int
-uxa_try_driver_composite(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height)
+uxa_try_driver_composite(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst, INT16 yDst, CARD16 width, CARD16 height)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pDst->pDrawable->pScreen);
- RegionRec region;
- BoxPtr pbox;
- int nbox;
- int src_off_x, src_off_y, mask_off_x, mask_off_y, dst_off_x, dst_off_y;
- PixmapPtr pSrcPix, pMaskPix = NULL, pDstPix;
- PicturePtr localSrc, localMask = NULL;
-
- xDst += pDst->pDrawable->x;
- yDst += pDst->pDrawable->y;
-
- localSrc = uxa_acquire_source (pDst->pDrawable->pScreen,
- pSrc, xSrc, ySrc, width, height,
- &xSrc, &ySrc);
- if (! localSrc)
- return 0;
-
- if (pMask) {
- localMask = uxa_acquire_mask (pDst->pDrawable->pScreen,
- pMask, xMask, yMask, width, height,
- &xMask, &yMask);
- if (! localMask) {
- if (localSrc != pSrc)
- FreePicture (localSrc, 0);
-
- return 0;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDst->pDrawable->pScreen);
+ RegionRec region;
+ BoxPtr pbox;
+ int nbox;
+ int src_off_x, src_off_y, mask_off_x, mask_off_y, dst_off_x, dst_off_y;
+ PixmapPtr pSrcPix, pMaskPix = NULL, pDstPix;
+ PicturePtr localSrc, localMask = NULL;
+
+ xDst += pDst->pDrawable->x;
+ yDst += pDst->pDrawable->y;
+
+ localSrc = uxa_acquire_source(pDst->pDrawable->pScreen,
+ pSrc, xSrc, ySrc, width, height,
+ &xSrc, &ySrc);
+ if (!localSrc)
+ return 0;
+
+ if (pMask) {
+ localMask = uxa_acquire_mask(pDst->pDrawable->pScreen,
+ pMask, xMask, yMask, width, height,
+ &xMask, &yMask);
+ if (!localMask) {
+ if (localSrc != pSrc)
+ FreePicture(localSrc, 0);
+
+ return 0;
+ }
}
- }
- if (uxa_screen->info->check_composite &&
- !(*uxa_screen->info->check_composite) (op, localSrc, localMask, pDst))
- {
- if (localSrc != pSrc)
- FreePicture (localSrc, 0);
- if (localMask && localMask != pMask)
- FreePicture (localMask, 0);
+ if (uxa_screen->info->check_composite &&
+ !(*uxa_screen->info->check_composite) (op, localSrc, localMask,
+ pDst)) {
+ if (localSrc != pSrc)
+ FreePicture(localSrc, 0);
+ if (localMask && localMask != pMask)
+ FreePicture(localMask, 0);
- return -1;
- }
+ return -1;
+ }
- if (!miComputeCompositeRegion (&region, localSrc, localMask, pDst,
- xSrc, ySrc, xMask, yMask, xDst, yDst,
- width, height))
- {
- if (localSrc != pSrc)
- FreePicture (localSrc, 0);
- if (localMask && localMask != pMask)
- FreePicture (localMask, 0);
+ if (!miComputeCompositeRegion(&region, localSrc, localMask, pDst,
+ xSrc, ySrc, xMask, yMask, xDst, yDst,
+ width, height)) {
+ if (localSrc != pSrc)
+ FreePicture(localSrc, 0);
+ if (localMask && localMask != pMask)
+ FreePicture(localMask, 0);
- return 1;
- }
+ return 1;
+ }
- pDstPix = uxa_get_offscreen_pixmap (pDst->pDrawable, &dst_off_x, &dst_off_y);
+ pDstPix =
+ uxa_get_offscreen_pixmap(pDst->pDrawable, &dst_off_x, &dst_off_y);
- pSrcPix = uxa_get_offscreen_pixmap (localSrc->pDrawable,
- &src_off_x, &src_off_y);
+ pSrcPix = uxa_get_offscreen_pixmap(localSrc->pDrawable,
+ &src_off_x, &src_off_y);
- if (localMask)
- pMaskPix = uxa_get_offscreen_pixmap (localMask->pDrawable,
- &mask_off_x, &mask_off_y);
+ if (localMask)
+ pMaskPix = uxa_get_offscreen_pixmap(localMask->pDrawable,
+ &mask_off_x, &mask_off_y);
- if (!pDstPix || !pSrcPix || (localMask && !pMaskPix)) {
- REGION_UNINIT(pDst->pDrawable->pScreen, &region);
+ if (!pDstPix || !pSrcPix || (localMask && !pMaskPix)) {
+ REGION_UNINIT(pDst->pDrawable->pScreen, &region);
- if (localSrc != pSrc)
- FreePicture (localSrc, 0);
- if (localMask && localMask != pMask)
- FreePicture (localMask, 0);
+ if (localSrc != pSrc)
+ FreePicture(localSrc, 0);
+ if (localMask && localMask != pMask)
+ FreePicture(localMask, 0);
+
+ return 0;
+ }
+
+ REGION_TRANSLATE(pScreen, &region, dst_off_x, dst_off_y);
- return 0;
- }
+ if (!(*uxa_screen->info->prepare_composite)
+ (op, localSrc, localMask, pDst, pSrcPix, pMaskPix, pDstPix)) {
+ REGION_UNINIT(pDst->pDrawable->pScreen, &region);
+
+ if (localSrc != pSrc)
+ FreePicture(localSrc, 0);
+ if (localMask && localMask != pMask)
+ FreePicture(localMask, 0);
+
+ return -1;
+ }
+
+ nbox = REGION_NUM_RECTS(&region);
+ pbox = REGION_RECTS(&region);
+
+ xMask = xMask + mask_off_x - xDst - dst_off_x;
+ yMask = yMask + mask_off_y - yDst - dst_off_y;
+
+ xSrc = xSrc + src_off_x - xDst - dst_off_x;
+ ySrc = ySrc + src_off_y - yDst - dst_off_y;
- REGION_TRANSLATE(pScreen, &region, dst_off_x, dst_off_y);
+ while (nbox--) {
+ (*uxa_screen->info->composite) (pDstPix,
+ pbox->x1 + xSrc,
+ pbox->y1 + ySrc,
+ pbox->x1 + xMask,
+ pbox->y1 + yMask,
+ pbox->x1,
+ pbox->y1,
+ pbox->x2 - pbox->x1,
+ pbox->y2 - pbox->y1);
+ pbox++;
+ }
+ (*uxa_screen->info->done_composite) (pDstPix);
- if (!(*uxa_screen->info->prepare_composite) (op, localSrc, localMask, pDst,
- pSrcPix, pMaskPix, pDstPix))
- {
REGION_UNINIT(pDst->pDrawable->pScreen, &region);
if (localSrc != pSrc)
- FreePicture (localSrc, 0);
+ FreePicture(localSrc, 0);
if (localMask && localMask != pMask)
- FreePicture (localMask, 0);
-
- return -1;
- }
-
- nbox = REGION_NUM_RECTS(&region);
- pbox = REGION_RECTS(&region);
-
- xMask = xMask + mask_off_x - xDst - dst_off_x;
- yMask = yMask + mask_off_y - yDst - dst_off_y;
-
- xSrc = xSrc + src_off_x - xDst - dst_off_x;
- ySrc = ySrc + src_off_y - yDst - dst_off_y;
-
- while (nbox--)
- {
- (*uxa_screen->info->composite) (pDstPix,
- pbox->x1 + xSrc,
- pbox->y1 + ySrc,
- pbox->x1 + xMask,
- pbox->y1 + yMask,
- pbox->x1,
- pbox->y1,
- pbox->x2 - pbox->x1,
- pbox->y2 - pbox->y1);
- pbox++;
- }
- (*uxa_screen->info->done_composite) (pDstPix);
-
- REGION_UNINIT(pDst->pDrawable->pScreen, &region);
-
- if (localSrc != pSrc)
- FreePicture (localSrc, 0);
- if (localMask && localMask != pMask)
- FreePicture (localMask, 0);
-
- return 1;
+ FreePicture(localMask, 0);
+
+ return 1;
}
/**
@@ -819,215 +785,227 @@ uxa_try_driver_composite(CARD8 op,
static int
uxa_try_magic_two_pass_composite_helper(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height)
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst, CARD16 width, CARD16 height)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pDst->pDrawable->pScreen);
-
- assert(op == PictOpOver);
-
- if (uxa_screen->info->check_composite &&
- (!(*uxa_screen->info->check_composite)(PictOpOutReverse, pSrc, pMask,
- pDst) ||
- !(*uxa_screen->info->check_composite)(PictOpAdd, pSrc, pMask, pDst)))
- {
- return -1;
- }
-
- /* Now, we think we should be able to accelerate this operation. First,
- * composite the destination to be the destination times the source alpha
- * factors.
- */
- uxa_composite(PictOpOutReverse, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask,
- xDst, yDst, width, height);
-
- /* Then, add in the source value times the destination alpha factors (1.0).
- */
- uxa_composite(PictOpAdd, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask,
- xDst, yDst, width, height);
-
- return 1;
-}
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDst->pDrawable->pScreen);
-void
-uxa_composite(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height)
-{
- uxa_screen_t *uxa_screen = uxa_get_screen(pDst->pDrawable->pScreen);
- int ret = -1;
- Bool saveSrcRepeat = pSrc->repeat;
- Bool saveMaskRepeat = pMask ? pMask->repeat : 0;
- RegionRec region;
-
- if (uxa_screen->swappedOut)
- goto fallback;
-
- if (pSrc->pDrawable == NULL || (pMask && pMask->pDrawable == NULL))
- goto composite;
-
- /* Remove repeat in source if useless */
- if (pSrc->repeat && !pSrc->transform && xSrc >= 0 &&
- (xSrc + width) <= pSrc->pDrawable->width && ySrc >= 0 &&
- (ySrc + height) <= pSrc->pDrawable->height)
- pSrc->repeat = 0;
-
- if (!pMask)
- {
- if ((op == PictOpSrc &&
- ((pSrc->format == pDst->format) ||
- (pSrc->format==PICT_a8r8g8b8 && pDst->format==PICT_x8r8g8b8) ||
- (pSrc->format==PICT_a8b8g8r8 && pDst->format==PICT_x8b8g8r8))) ||
- (op == PictOpOver && !pSrc->alphaMap && !pDst->alphaMap &&
- pSrc->format == pDst->format &&
- (pSrc->format==PICT_x8r8g8b8 || pSrc->format==PICT_x8b8g8r8)))
- {
- if (pSrc->pDrawable->width == 1 &&
- pSrc->pDrawable->height == 1 &&
- pSrc->repeat)
- {
- ret = uxa_try_driver_solid_fill(pSrc, pDst, xSrc, ySrc, xDst, yDst,
- width, height);
- if (ret == 1)
- goto done;
- }
- else if (pSrc->pDrawable != NULL &&
- !pSrc->repeat &&
- !pSrc->transform)
- {
- xDst += pDst->pDrawable->x;
- yDst += pDst->pDrawable->y;
- xSrc += pSrc->pDrawable->x;
- ySrc += pSrc->pDrawable->y;
-
- if (!miComputeCompositeRegion (&region, pSrc, pMask, pDst,
- xSrc, ySrc, xMask, yMask, xDst,
- yDst, width, height))
- goto done;
-
-
- uxa_copy_n_to_n (pSrc->pDrawable, pDst->pDrawable, NULL,
- REGION_RECTS(&region), REGION_NUM_RECTS(&region),
- xSrc - xDst, ySrc - yDst,
- FALSE, FALSE, 0, NULL);
- REGION_UNINIT(pDst->pDrawable->pScreen, &region);
- goto done;
- }
- else if (pSrc->pDrawable != NULL &&
- pSrc->pDrawable->type == DRAWABLE_PIXMAP &&
- !pSrc->transform &&
- pSrc->repeatType == RepeatNormal)
- {
- DDXPointRec patOrg;
-
- /* Let's see if the driver can do the repeat in one go */
- if (uxa_screen->info->prepare_composite && !pSrc->alphaMap &&
- !pDst->alphaMap)
- {
- ret = uxa_try_driver_composite(op, pSrc, pMask, pDst, xSrc,
- ySrc, xMask, yMask, xDst, yDst,
- width, height);
- if (ret == 1)
- goto done;
- }
+ assert(op == PictOpOver);
- /* Now see if we can use uxa_fill_region_tiled() */
- xDst += pDst->pDrawable->x;
- yDst += pDst->pDrawable->y;
- xSrc += pSrc->pDrawable->x;
- ySrc += pSrc->pDrawable->y;
+ if (uxa_screen->info->check_composite &&
+ (!(*uxa_screen->info->check_composite) (PictOpOutReverse, pSrc,
+ pMask, pDst)
+ || !(*uxa_screen->info->check_composite) (PictOpAdd, pSrc, pMask,
+ pDst))) {
+ return -1;
+ }
- if (!miComputeCompositeRegion (&region, pSrc, pMask, pDst, xSrc,
- ySrc, xMask, yMask, xDst, yDst,
- width, height))
- goto done;
+ /* Now, we think we should be able to accelerate this operation. First,
+ * composite the destination to be the destination times the source alpha
+ * factors.
+ */
+ uxa_composite(PictOpOutReverse, pSrc, pMask, pDst, xSrc, ySrc, xMask,
+ yMask, xDst, yDst, width, height);
- /* pattern origin is the point in the destination drawable
- * corresponding to (0,0) in the source */
- patOrg.x = xDst - xSrc;
- patOrg.y = yDst - ySrc;
+ /* Then, add in the source value times the destination alpha factors (1.0).
+ */
+ uxa_composite(PictOpAdd, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask,
+ xDst, yDst, width, height);
- ret = uxa_fill_region_tiled(pDst->pDrawable, &region,
- (PixmapPtr)pSrc->pDrawable,
- &patOrg, FB_ALLONES, GXcopy);
+ return 1;
+}
- REGION_UNINIT(pDst->pDrawable->pScreen, &region);
+void
+uxa_composite(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height)
+{
+ uxa_screen_t *uxa_screen = uxa_get_screen(pDst->pDrawable->pScreen);
+ int ret = -1;
+ Bool saveSrcRepeat = pSrc->repeat;
+ Bool saveMaskRepeat = pMask ? pMask->repeat : 0;
+ RegionRec region;
- if (ret)
- goto done;
- }
+ if (uxa_screen->swappedOut)
+ goto fallback;
+
+ if (pSrc->pDrawable == NULL || (pMask && pMask->pDrawable == NULL))
+ goto composite;
+
+ /* Remove repeat in source if useless */
+ if (pSrc->repeat && !pSrc->transform && xSrc >= 0 &&
+ (xSrc + width) <= pSrc->pDrawable->width && ySrc >= 0 &&
+ (ySrc + height) <= pSrc->pDrawable->height)
+ pSrc->repeat = 0;
+
+ if (!pMask) {
+ if ((op == PictOpSrc &&
+ ((pSrc->format == pDst->format) ||
+ (pSrc->format == PICT_a8r8g8b8
+ && pDst->format == PICT_x8r8g8b8)
+ || (pSrc->format == PICT_a8b8g8r8
+ && pDst->format == PICT_x8b8g8r8)))
+ || (op == PictOpOver && !pSrc->alphaMap && !pDst->alphaMap
+ && pSrc->format == pDst->format
+ && (pSrc->format == PICT_x8r8g8b8
+ || pSrc->format == PICT_x8b8g8r8))) {
+ if (pSrc->pDrawable->width == 1
+ && pSrc->pDrawable->height == 1 && pSrc->repeat) {
+ ret =
+ uxa_try_driver_solid_fill(pSrc, pDst, xSrc,
+ ySrc, xDst, yDst,
+ width, height);
+ if (ret == 1)
+ goto done;
+ } else if (pSrc->pDrawable != NULL &&
+ !pSrc->repeat && !pSrc->transform) {
+ xDst += pDst->pDrawable->x;
+ yDst += pDst->pDrawable->y;
+ xSrc += pSrc->pDrawable->x;
+ ySrc += pSrc->pDrawable->y;
+
+ if (!miComputeCompositeRegion
+ (&region, pSrc, pMask, pDst, xSrc, ySrc,
+ xMask, yMask, xDst, yDst, width, height))
+ goto done;
+
+ uxa_copy_n_to_n(pSrc->pDrawable,
+ pDst->pDrawable, NULL,
+ REGION_RECTS(&region),
+ REGION_NUM_RECTS(&region),
+ xSrc - xDst, ySrc - yDst, FALSE,
+ FALSE, 0, NULL);
+ REGION_UNINIT(pDst->pDrawable->pScreen,
+ &region);
+ goto done;
+ } else if (pSrc->pDrawable != NULL &&
+ pSrc->pDrawable->type == DRAWABLE_PIXMAP &&
+ !pSrc->transform &&
+ pSrc->repeatType == RepeatNormal) {
+ DDXPointRec patOrg;
+
+ /* Let's see if the driver can do the repeat
+ * in one go
+ */
+ if (uxa_screen->info->prepare_composite
+ && !pSrc->alphaMap && !pDst->alphaMap) {
+ ret =
+ uxa_try_driver_composite(op, pSrc,
+ pMask,
+ pDst, xSrc,
+ ySrc,
+ xMask,
+ yMask,
+ xDst, yDst,
+ width,
+ height);
+ if (ret == 1)
+ goto done;
+ }
+
+ /* Now see if we can use
+ * uxa_fill_region_tiled()
+ */
+ xDst += pDst->pDrawable->x;
+ yDst += pDst->pDrawable->y;
+ xSrc += pSrc->pDrawable->x;
+ ySrc += pSrc->pDrawable->y;
+
+ if (!miComputeCompositeRegion
+ (&region, pSrc, pMask, pDst, xSrc, ySrc,
+ xMask, yMask, xDst, yDst, width, height))
+ goto done;
+
+ /* pattern origin is the point in the
+ * destination drawable
+ * corresponding to (0,0) in the source */
+ patOrg.x = xDst - xSrc;
+ patOrg.y = yDst - ySrc;
+
+ ret =
+ uxa_fill_region_tiled(pDst->pDrawable,
+ &region,
+ (PixmapPtr) pSrc->
+ pDrawable, &patOrg,
+ FB_ALLONES, GXcopy);
+
+ REGION_UNINIT(pDst->pDrawable->pScreen,
+ &region);
+
+ if (ret)
+ goto done;
+ }
+ }
}
- }
composite:
- /* Remove repeat in mask if useless */
- if (pMask && pMask->repeat && !pMask->transform && pMask->pDrawable &&
- xMask >= 0 && (xMask + width) <= pMask->pDrawable->width &&
- yMask >= 0 && (yMask + height) <= pMask->pDrawable->height)
- pMask->repeat = 0;
-
- if (uxa_screen->info->prepare_composite &&
- !pSrc->alphaMap && (!pMask || !pMask->alphaMap) && !pDst->alphaMap)
- {
- Bool isSrcSolid;
-
- ret = uxa_try_driver_composite(op, pSrc, pMask, pDst, xSrc, ySrc, xMask,
- yMask, xDst, yDst, width, height);
- if (ret == 1)
- goto done;
-
- /* For generic masks and solid src pictures, mach64 can do Over in two
- * passes, similar to the component-alpha case.
- */
- isSrcSolid = pSrc->pDrawable &&
- pSrc->pDrawable->width == 1 &&
- pSrc->pDrawable->height == 1 &&
- pSrc->repeat;
-
- /* If we couldn't do the Composite in a single pass, and it was a
- * component-alpha Over, see if we can do it in two passes with
- * an OutReverse and then an Add.
- */
- if (ret == -1 && op == PictOpOver && pMask &&
- (pMask->componentAlpha || isSrcSolid)) {
- ret = uxa_try_magic_two_pass_composite_helper(op, pSrc, pMask, pDst,
- xSrc, ySrc,
- xMask, yMask, xDst, yDst,
- width, height);
- if (ret == 1)
- goto done;
+ /* Remove repeat in mask if useless */
+ if (pMask && pMask->repeat && !pMask->transform && pMask->pDrawable &&
+ xMask >= 0 && (xMask + width) <= pMask->pDrawable->width &&
+ yMask >= 0 && (yMask + height) <= pMask->pDrawable->height)
+ pMask->repeat = 0;
+
+ if (uxa_screen->info->prepare_composite &&
+ !pSrc->alphaMap && (!pMask || !pMask->alphaMap) && !pDst->alphaMap)
+ {
+ Bool isSrcSolid;
+
+ ret =
+ uxa_try_driver_composite(op, pSrc, pMask, pDst, xSrc, ySrc,
+ xMask, yMask, xDst, yDst, width,
+ height);
+ if (ret == 1)
+ goto done;
+
+ /* For generic masks and solid src pictures, mach64 can do
+ * Over in two passes, similar to the component-alpha case.
+ */
+ isSrcSolid = pSrc->pDrawable &&
+ pSrc->pDrawable->width == 1 &&
+ pSrc->pDrawable->height == 1 && pSrc->repeat;
+
+ /* If we couldn't do the Composite in a single pass, and it
+ * was a component-alpha Over, see if we can do it in two
+ * passes with an OutReverse and then an Add.
+ */
+ if (ret == -1 && op == PictOpOver && pMask &&
+ (pMask->componentAlpha || isSrcSolid)) {
+ ret =
+ uxa_try_magic_two_pass_composite_helper(op, pSrc,
+ pMask, pDst,
+ xSrc, ySrc,
+ xMask,
+ yMask, xDst,
+ yDst, width,
+ height);
+ if (ret == 1)
+ goto done;
+ }
}
- }
fallback:
- if (uxa_screen->fallback_debug)
- uxa_print_composite_fallback (op, pSrc, pMask, pDst);
+ if (uxa_screen->fallback_debug)
+ uxa_print_composite_fallback(op, pSrc, pMask, pDst);
- uxa_check_composite (op, pSrc, pMask, pDst, xSrc, ySrc,
- xMask, yMask, xDst, yDst, width, height);
+ uxa_check_composite(op, pSrc, pMask, pDst, xSrc, ySrc,
+ xMask, yMask, xDst, yDst, width, height);
done:
- pSrc->repeat = saveSrcRepeat;
- if (pMask)
- pMask->repeat = saveMaskRepeat;
+ pSrc->repeat = saveSrcRepeat;
+ if (pMask)
+ pMask->repeat = saveMaskRepeat;
}
#endif
@@ -1039,38 +1017,35 @@ done:
* See the comments about uxa_trapezoids and uxa_triangles.
*/
static PicturePtr
-uxa_create_alpha_picture (ScreenPtr pScreen,
- PicturePtr pDst,
- PictFormatPtr pPictFormat,
- CARD16 width,
- CARD16 height)
+uxa_create_alpha_picture(ScreenPtr pScreen,
+ PicturePtr pDst,
+ PictFormatPtr pPictFormat, CARD16 width, CARD16 height)
{
- PixmapPtr pPixmap;
- PicturePtr pPicture;
- int error;
-
- if (width > 32767 || height > 32767)
- return 0;
-
- if (!pPictFormat)
- {
- if (pDst->polyEdge == PolyEdgeSharp)
- pPictFormat = PictureMatchFormat (pScreen, 1, PICT_a1);
- else
- pPictFormat = PictureMatchFormat (pScreen, 8, PICT_a8);
- if (!pPictFormat)
- return 0;
- }
-
- pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
- pPictFormat->depth,
- UXA_CREATE_PIXMAP_FOR_MAP);
- if (!pPixmap)
- return 0;
- pPicture = CreatePicture (0, &pPixmap->drawable, pPictFormat,
- 0, 0, serverClient, &error);
- (*pScreen->DestroyPixmap) (pPixmap);
- return pPicture;
+ PixmapPtr pPixmap;
+ PicturePtr pPicture;
+ int error;
+
+ if (width > 32767 || height > 32767)
+ return 0;
+
+ if (!pPictFormat) {
+ if (pDst->polyEdge == PolyEdgeSharp)
+ pPictFormat = PictureMatchFormat(pScreen, 1, PICT_a1);
+ else
+ pPictFormat = PictureMatchFormat(pScreen, 8, PICT_a8);
+ if (!pPictFormat)
+ return 0;
+ }
+
+ pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
+ pPictFormat->depth,
+ UXA_CREATE_PIXMAP_FOR_MAP);
+ if (!pPixmap)
+ return 0;
+ pPicture = CreatePicture(0, &pPixmap->drawable, pPictFormat,
+ 0, 0, serverClient, &error);
+ (*pScreen->DestroyPixmap) (pPixmap);
+ return pPicture;
}
/**
@@ -1083,93 +1058,92 @@ uxa_create_alpha_picture (ScreenPtr pScreen,
* call to RasterizeTrapezoid won't be accelerated however, which
* forces the pixmap to be moved out again.
*
- * uxa_create_alpha_picture avoids this roundtrip by using uxa_check_poly_fill_rect
- * to initialize the contents.
+ * uxa_create_alpha_picture avoids this roundtrip by using
+ * uxa_check_poly_fill_rect to initialize the contents.
*/
void
-uxa_trapezoids (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
- PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
- int ntrap, xTrapezoid *traps)
+uxa_trapezoids(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
+ PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
+ int ntrap, xTrapezoid * traps)
{
- ScreenPtr pScreen = pDst->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- BoxRec bounds;
- Bool direct = op == PictOpAdd && miIsSolidAlpha (pSrc);
+ ScreenPtr pScreen = pDst->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ BoxRec bounds;
+ Bool direct = op == PictOpAdd && miIsSolidAlpha(pSrc);
- if (maskFormat || direct) {
- miTrapezoidBounds (ntrap, traps, &bounds);
+ if (maskFormat || direct) {
+ miTrapezoidBounds(ntrap, traps, &bounds);
- if (bounds.y1 >= bounds.y2 || bounds.x1 >= bounds.x2)
- return;
- }
+ if (bounds.y1 >= bounds.y2 || bounds.x1 >= bounds.x2)
+ return;
+ }
- /*
- * Check for solid alpha add
- */
- if (direct)
- {
- DrawablePtr pDraw = pDst->pDrawable;
- PixmapPtr pixmap = uxa_get_drawable_pixmap (pDraw);
- int xoff, yoff;
+ /*
+ * Check for solid alpha add
+ */
+ if (direct) {
+ DrawablePtr pDraw = pDst->pDrawable;
+ PixmapPtr pixmap = uxa_get_drawable_pixmap(pDraw);
+ int xoff, yoff;
- uxa_get_drawable_deltas(pDraw, pixmap, &xoff, &yoff);
+ uxa_get_drawable_deltas(pDraw, pixmap, &xoff, &yoff);
- xoff += pDraw->x;
- yoff += pDraw->y;
+ xoff += pDraw->x;
+ yoff += pDraw->y;
- if (uxa_prepare_access(pDraw, UXA_ACCESS_RW))
- {
- for (; ntrap; ntrap--, traps++)
- (*ps->RasterizeTrapezoid) (pDst, traps, 0, 0);
- uxa_finish_access(pDraw);
+ if (uxa_prepare_access(pDraw, UXA_ACCESS_RW)) {
+ for (; ntrap; ntrap--, traps++)
+ (*ps->RasterizeTrapezoid) (pDst, traps, 0, 0);
+ uxa_finish_access(pDraw);
+ }
+ } else if (maskFormat) {
+ PicturePtr pPicture;
+ INT16 xDst, yDst;
+ INT16 xRel, yRel;
+ int width, height;
+ pixman_image_t *image;
+ pixman_format_code_t format;
+
+ xDst = traps[0].left.p1.x >> 16;
+ yDst = traps[0].left.p1.y >> 16;
+
+ width = bounds.x2 - bounds.x1;
+ height = bounds.y2 - bounds.y1;
+
+ format =
+ maskFormat->
+ format | (BitsPerPixel(maskFormat->depth) << 24);
+ image =
+ pixman_image_create_bits(format, width, height, NULL, 0);
+ if (!image)
+ return;
+
+ for (; ntrap; ntrap--, traps++)
+ pixman_rasterize_trapezoid(image,
+ (pixman_trapezoid_t *) traps,
+ -bounds.x1, -bounds.y1);
+
+ pPicture =
+ uxa_picture_from_pixman_image(pScreen, image, format);
+ pixman_image_unref(image);
+ if (!pPicture)
+ return;
+
+ xRel = bounds.x1 + xSrc - xDst;
+ yRel = bounds.y1 + ySrc - yDst;
+ CompositePicture(op, pSrc, pPicture, pDst,
+ xRel, yRel, 0, 0, bounds.x1, bounds.y1,
+ bounds.x2 - bounds.x1, bounds.y2 - bounds.y1);
+ FreePicture(pPicture, 0);
+ } else {
+ if (pDst->polyEdge == PolyEdgeSharp)
+ maskFormat = PictureMatchFormat(pScreen, 1, PICT_a1);
+ else
+ maskFormat = PictureMatchFormat(pScreen, 8, PICT_a8);
+ for (; ntrap; ntrap--, traps++)
+ uxa_trapezoids(op, pSrc, pDst, maskFormat, xSrc, ySrc,
+ 1, traps);
}
- }
- else if (maskFormat)
- {
- PicturePtr pPicture;
- INT16 xDst, yDst;
- INT16 xRel, yRel;
- int width, height;
- pixman_image_t *image;
- pixman_format_code_t format;
-
- xDst = traps[0].left.p1.x >> 16;
- yDst = traps[0].left.p1.y >> 16;
-
- width = bounds.x2 - bounds.x1;
- height = bounds.y2 - bounds.y1;
-
- format = maskFormat->format | (BitsPerPixel (maskFormat->depth) << 24);
- image = pixman_image_create_bits (format, width, height, NULL, 0);
- if (!image)
- return;
-
- for (; ntrap; ntrap--, traps++)
- pixman_rasterize_trapezoid (image, (pixman_trapezoid_t *) traps,
- -bounds.x1, -bounds.y1);
-
- pPicture = uxa_picture_from_pixman_image (pScreen, image, format);
- pixman_image_unref (image);
- if (!pPicture)
- return;
-
- xRel = bounds.x1 + xSrc - xDst;
- yRel = bounds.y1 + ySrc - yDst;
- CompositePicture (op, pSrc, pPicture, pDst,
- xRel, yRel, 0, 0, bounds.x1, bounds.y1,
- bounds.x2 - bounds.x1,
- bounds.y2 - bounds.y1);
- FreePicture (pPicture, 0);
- }
- else
- {
- if (pDst->polyEdge == PolyEdgeSharp)
- maskFormat = PictureMatchFormat (pScreen, 1, PICT_a1);
- else
- maskFormat = PictureMatchFormat (pScreen, 8, PICT_a8);
- for (; ntrap; ntrap--, traps++)
- uxa_trapezoids (op, pSrc, pDst, maskFormat, xSrc, ySrc, 1, traps);
- }
}
/**
@@ -1182,89 +1156,86 @@ uxa_trapezoids (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
* call to AddTriangles won't be accelerated however, which forces the pixmap
* to be moved out again.
*
- * uxa_create_alpha_picture avoids this roundtrip by using uxa_check_poly_fill_rect
- * to initialize the contents.
+ * uxa_create_alpha_picture avoids this roundtrip by using
+ * uxa_check_poly_fill_rect to initialize the contents.
*/
void
-uxa_triangles (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
+uxa_triangles(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
- int ntri, xTriangle *tris)
+ int ntri, xTriangle * tris)
{
- ScreenPtr pScreen = pDst->pDrawable->pScreen;
- PictureScreenPtr ps = GetPictureScreen(pScreen);
- BoxRec bounds;
- Bool direct = op == PictOpAdd && miIsSolidAlpha (pSrc);
-
- if (maskFormat || direct) {
- miTriangleBounds (ntri, tris, &bounds);
-
- if (bounds.y1 >= bounds.y2 || bounds.x1 >= bounds.x2)
- return;
- }
-
- /*
- * Check for solid alpha add
- */
- if (direct)
- {
- DrawablePtr pDraw = pDst->pDrawable;
- if (uxa_prepare_access(pDraw, UXA_ACCESS_RW)) {
- (*ps->AddTriangles) (pDst, 0, 0, ntri, tris);
- uxa_finish_access(pDraw);
- }
- }
- else if (maskFormat)
- {
- PicturePtr pPicture;
- INT16 xDst, yDst;
- INT16 xRel, yRel;
- int width = bounds.x2 - bounds.x1;
- int height = bounds.y2 - bounds.y1;
- GCPtr pGC;
- xRectangle rect;
-
- xDst = tris[0].p1.x >> 16;
- yDst = tris[0].p1.y >> 16;
+ ScreenPtr pScreen = pDst->pDrawable->pScreen;
+ PictureScreenPtr ps = GetPictureScreen(pScreen);
+ BoxRec bounds;
+ Bool direct = op == PictOpAdd && miIsSolidAlpha(pSrc);
- pPicture = uxa_create_alpha_picture (pScreen, pDst, maskFormat,
- width, height);
- if (!pPicture)
- return;
+ if (maskFormat || direct) {
+ miTriangleBounds(ntri, tris, &bounds);
- /* Clear the alpha picture to 0. */
- pGC = GetScratchGC (pPicture->pDrawable->depth, pScreen);
- if (!pGC) {
- FreePicture (pPicture, 0);
- return;
+ if (bounds.y1 >= bounds.y2 || bounds.x1 >= bounds.x2)
+ return;
}
- ValidateGC (pPicture->pDrawable, pGC);
- rect.x = 0;
- rect.y = 0;
- rect.width = width;
- rect.height = height;
- uxa_check_poly_fill_rect (pPicture->pDrawable, pGC, 1, &rect);
- FreeScratchGC (pGC);
-
- if (uxa_prepare_access(pPicture->pDrawable, UXA_ACCESS_RW)) {
- (*ps->AddTriangles) (pPicture, -bounds.x1, -bounds.y1, ntri, tris);
- uxa_finish_access(pPicture->pDrawable);
+
+ /*
+ * Check for solid alpha add
+ */
+ if (direct) {
+ DrawablePtr pDraw = pDst->pDrawable;
+ if (uxa_prepare_access(pDraw, UXA_ACCESS_RW)) {
+ (*ps->AddTriangles) (pDst, 0, 0, ntri, tris);
+ uxa_finish_access(pDraw);
+ }
+ } else if (maskFormat) {
+ PicturePtr pPicture;
+ INT16 xDst, yDst;
+ INT16 xRel, yRel;
+ int width = bounds.x2 - bounds.x1;
+ int height = bounds.y2 - bounds.y1;
+ GCPtr pGC;
+ xRectangle rect;
+
+ xDst = tris[0].p1.x >> 16;
+ yDst = tris[0].p1.y >> 16;
+
+ pPicture = uxa_create_alpha_picture(pScreen, pDst, maskFormat,
+ width, height);
+ if (!pPicture)
+ return;
+
+ /* Clear the alpha picture to 0. */
+ pGC = GetScratchGC(pPicture->pDrawable->depth, pScreen);
+ if (!pGC) {
+ FreePicture(pPicture, 0);
+ return;
+ }
+ ValidateGC(pPicture->pDrawable, pGC);
+ rect.x = 0;
+ rect.y = 0;
+ rect.width = width;
+ rect.height = height;
+ uxa_check_poly_fill_rect(pPicture->pDrawable, pGC, 1, &rect);
+ FreeScratchGC(pGC);
+
+ if (uxa_prepare_access(pPicture->pDrawable, UXA_ACCESS_RW)) {
+ (*ps->AddTriangles) (pPicture, -bounds.x1, -bounds.y1,
+ ntri, tris);
+ uxa_finish_access(pPicture->pDrawable);
+ }
+
+ xRel = bounds.x1 + xSrc - xDst;
+ yRel = bounds.y1 + ySrc - yDst;
+ CompositePicture(op, pSrc, pPicture, pDst,
+ xRel, yRel, 0, 0, bounds.x1, bounds.y1,
+ bounds.x2 - bounds.x1, bounds.y2 - bounds.y1);
+ FreePicture(pPicture, 0);
+ } else {
+ if (pDst->polyEdge == PolyEdgeSharp)
+ maskFormat = PictureMatchFormat(pScreen, 1, PICT_a1);
+ else
+ maskFormat = PictureMatchFormat(pScreen, 8, PICT_a8);
+
+ for (; ntri; ntri--, tris++)
+ uxa_triangles(op, pSrc, pDst, maskFormat, xSrc, ySrc, 1,
+ tris);
}
-
- xRel = bounds.x1 + xSrc - xDst;
- yRel = bounds.y1 + ySrc - yDst;
- CompositePicture (op, pSrc, pPicture, pDst,
- xRel, yRel, 0, 0, bounds.x1, bounds.y1,
- bounds.x2 - bounds.x1, bounds.y2 - bounds.y1);
- FreePicture (pPicture, 0);
- }
- else
- {
- if (pDst->polyEdge == PolyEdgeSharp)
- maskFormat = PictureMatchFormat (pScreen, 1, PICT_a1);
- else
- maskFormat = PictureMatchFormat (pScreen, 8, PICT_a8);
-
- for (; ntri; ntri--, tris++)
- uxa_triangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, 1, tris);
- }
}
diff --git a/uxa/uxa-unaccel.c b/uxa/uxa-unaccel.c
index 8f864688..90d49506 100644
--- a/uxa/uxa-unaccel.c
+++ b/uxa/uxa-unaccel.c
@@ -41,365 +41,364 @@
* 1bpp and never in fb, so we don't worry about them.
* We should worry about them for completeness sake and going forward.
*/
-Bool
-uxa_prepare_access_gc(GCPtr pGC)
+Bool uxa_prepare_access_gc(GCPtr pGC)
{
- if (pGC->stipple)
- if (!uxa_prepare_access(&pGC->stipple->drawable, UXA_ACCESS_RO))
- return FALSE;
- if (pGC->fillStyle == FillTiled)
- if (!uxa_prepare_access(&pGC->tile.pixmap->drawable, UXA_ACCESS_RO)) {
- if (pGC->stipple)
- uxa_finish_access(&pGC->stipple->drawable);
- return FALSE;
- }
- return TRUE;
+ if (pGC->stipple)
+ if (!uxa_prepare_access(&pGC->stipple->drawable, UXA_ACCESS_RO))
+ return FALSE;
+ if (pGC->fillStyle == FillTiled)
+ if (!uxa_prepare_access
+ (&pGC->tile.pixmap->drawable, UXA_ACCESS_RO)) {
+ if (pGC->stipple)
+ uxa_finish_access(&pGC->stipple->drawable);
+ return FALSE;
+ }
+ return TRUE;
}
/**
* Finishes access to the tile in the GC, if used.
*/
-void
-uxa_finish_access_gc(GCPtr pGC)
+void uxa_finish_access_gc(GCPtr pGC)
{
- if (pGC->fillStyle == FillTiled)
- uxa_finish_access(&pGC->tile.pixmap->drawable);
- if (pGC->stipple)
- uxa_finish_access(&pGC->stipple->drawable);
+ if (pGC->fillStyle == FillTiled)
+ uxa_finish_access(&pGC->tile.pixmap->drawable);
+ if (pGC->stipple)
+ uxa_finish_access(&pGC->stipple->drawable);
}
-char
-uxa_drawable_location(DrawablePtr pDrawable)
+char uxa_drawable_location(DrawablePtr pDrawable)
{
- return uxa_drawable_is_offscreen(pDrawable) ? 's' : 'm';
+ return uxa_drawable_is_offscreen(pDrawable) ? 's' : 'm';
}
void
-uxa_check_fill_spans (DrawablePtr pDrawable, GCPtr pGC, int nspans,
- DDXPointPtr ppt, int *pwidth, int fSorted)
+uxa_check_fill_spans(DrawablePtr pDrawable, GCPtr pGC, int nspans,
+ DDXPointPtr ppt, int *pwidth, int fSorted)
{
- ScreenPtr screen = pDrawable->pScreen;
-
- UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
- if (uxa_prepare_access_gc (pGC)) {
- fbFillSpans (pDrawable, pGC, nspans, ppt, pwidth, fSorted);
- uxa_finish_access_gc (pGC);
+ ScreenPtr screen = pDrawable->pScreen;
+
+ UXA_FALLBACK(("to %p (%c)\n", pDrawable,
+ uxa_drawable_location(pDrawable)));
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
+ if (uxa_prepare_access_gc(pGC)) {
+ fbFillSpans(pDrawable, pGC, nspans, ppt, pwidth,
+ fSorted);
+ uxa_finish_access_gc(pGC);
+ }
+ uxa_finish_access(pDrawable);
}
- uxa_finish_access (pDrawable);
- }
}
void
-uxa_check_set_spans (DrawablePtr pDrawable, GCPtr pGC, char *psrc,
- DDXPointPtr ppt, int *pwidth, int nspans, int fSorted)
+uxa_check_set_spans(DrawablePtr pDrawable, GCPtr pGC, char *psrc,
+ DDXPointPtr ppt, int *pwidth, int nspans, int fSorted)
{
- ScreenPtr screen = pDrawable->pScreen;
+ ScreenPtr screen = pDrawable->pScreen;
- UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
- fbSetSpans (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);
- uxa_finish_access (pDrawable);
- }
+ UXA_FALLBACK(("to %p (%c)\n", pDrawable,
+ uxa_drawable_location(pDrawable)));
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
+ fbSetSpans(pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);
+ uxa_finish_access(pDrawable);
+ }
}
void
-uxa_check_put_image (DrawablePtr pDrawable, GCPtr pGC, int depth,
- int x, int y, int w, int h, int leftPad, int format,
- char *bits)
+uxa_check_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth,
+ int x, int y, int w, int h, int leftPad, int format,
+ char *bits)
{
- ScreenPtr screen = pDrawable->pScreen;
-
- UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
- fbPutImage (pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits);
- uxa_finish_access (pDrawable);
- }
+ ScreenPtr screen = pDrawable->pScreen;
+
+ UXA_FALLBACK(("to %p (%c)\n", pDrawable,
+ uxa_drawable_location(pDrawable)));
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
+ fbPutImage(pDrawable, pGC, depth, x, y, w, h, leftPad, format,
+ bits);
+ uxa_finish_access(pDrawable);
+ }
}
RegionPtr
-uxa_check_copy_area (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty)
+uxa_check_copy_area(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ int srcx, int srcy, int w, int h, int dstx, int dsty)
{
- ScreenPtr screen = pSrc->pScreen;
- RegionPtr ret = NULL;
-
- UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
- uxa_drawable_location(pSrc), uxa_drawable_location(pDst)));
- if (uxa_prepare_access (pDst, UXA_ACCESS_RW)) {
- if (uxa_prepare_access (pSrc, UXA_ACCESS_RO)) {
- ret = fbCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty);
- uxa_finish_access (pSrc);
+ ScreenPtr screen = pSrc->pScreen;
+ RegionPtr ret = NULL;
+
+ UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
+ uxa_drawable_location(pSrc),
+ uxa_drawable_location(pDst)));
+ if (uxa_prepare_access(pDst, UXA_ACCESS_RW)) {
+ if (uxa_prepare_access(pSrc, UXA_ACCESS_RO)) {
+ ret =
+ fbCopyArea(pSrc, pDst, pGC, srcx, srcy, w, h, dstx,
+ dsty);
+ uxa_finish_access(pSrc);
+ }
+ uxa_finish_access(pDst);
}
- uxa_finish_access (pDst);
- }
- return ret;
+ return ret;
}
RegionPtr
-uxa_check_copy_plane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty,
- unsigned long bitPlane)
+uxa_check_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ int srcx, int srcy, int w, int h, int dstx, int dsty,
+ unsigned long bitPlane)
{
- ScreenPtr screen = pSrc->pScreen;
- RegionPtr ret = NULL;
-
- UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
- uxa_drawable_location(pSrc), uxa_drawable_location(pDst)));
- if (uxa_prepare_access (pDst, UXA_ACCESS_RW)) {
- if (uxa_prepare_access (pSrc, UXA_ACCESS_RO)) {
- ret = fbCopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty,
- bitPlane);
- uxa_finish_access (pSrc);
+ ScreenPtr screen = pSrc->pScreen;
+ RegionPtr ret = NULL;
+
+ UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
+ uxa_drawable_location(pSrc),
+ uxa_drawable_location(pDst)));
+ if (uxa_prepare_access(pDst, UXA_ACCESS_RW)) {
+ if (uxa_prepare_access(pSrc, UXA_ACCESS_RO)) {
+ ret =
+ fbCopyPlane(pSrc, pDst, pGC, srcx, srcy, w, h, dstx,
+ dsty, bitPlane);
+ uxa_finish_access(pSrc);
+ }
+ uxa_finish_access(pDst);
}
- uxa_finish_access (pDst);
- }
- return ret;
+ return ret;
}
void
-uxa_check_poly_point (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
- DDXPointPtr pptInit)
+uxa_check_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
+ DDXPointPtr pptInit)
{
- ScreenPtr screen = pDrawable->pScreen;
+ ScreenPtr screen = pDrawable->pScreen;
- UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
- fbPolyPoint (pDrawable, pGC, mode, npt, pptInit);
- uxa_finish_access (pDrawable);
- }
+ UXA_FALLBACK(("to %p (%c)\n", pDrawable,
+ uxa_drawable_location(pDrawable)));
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
+ fbPolyPoint(pDrawable, pGC, mode, npt, pptInit);
+ uxa_finish_access(pDrawable);
+ }
}
void
-uxa_check_poly_lines (DrawablePtr pDrawable, GCPtr pGC,
- int mode, int npt, DDXPointPtr ppt)
+uxa_check_poly_lines(DrawablePtr pDrawable, GCPtr pGC,
+ int mode, int npt, DDXPointPtr ppt)
{
- ScreenPtr screen = pDrawable->pScreen;
-
- UXA_FALLBACK(("to %p (%c), width %d, mode %d, count %d\n",
- pDrawable, uxa_drawable_location(pDrawable),
- pGC->lineWidth, mode, npt));
-
- if (pGC->lineWidth == 0) {
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
- if (uxa_prepare_access_gc (pGC)) {
- fbPolyLine (pDrawable, pGC, mode, npt, ppt);
- uxa_finish_access_gc (pGC);
- }
- uxa_finish_access (pDrawable);
+ ScreenPtr screen = pDrawable->pScreen;
+
+ UXA_FALLBACK(("to %p (%c), width %d, mode %d, count %d\n",
+ pDrawable, uxa_drawable_location(pDrawable),
+ pGC->lineWidth, mode, npt));
+
+ if (pGC->lineWidth == 0) {
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
+ if (uxa_prepare_access_gc(pGC)) {
+ fbPolyLine(pDrawable, pGC, mode, npt, ppt);
+ uxa_finish_access_gc(pGC);
+ }
+ uxa_finish_access(pDrawable);
+ }
+ return;
}
- return;
- }
- /* fb calls mi functions in the lineWidth != 0 case. */
- fbPolyLine (pDrawable, pGC, mode, npt, ppt);
+ /* fb calls mi functions in the lineWidth != 0 case. */
+ fbPolyLine(pDrawable, pGC, mode, npt, ppt);
}
void
-uxa_check_poly_segment (DrawablePtr pDrawable, GCPtr pGC,
- int nsegInit, xSegment *pSegInit)
+uxa_check_poly_segment(DrawablePtr pDrawable, GCPtr pGC,
+ int nsegInit, xSegment * pSegInit)
{
- ScreenPtr screen = pDrawable->pScreen;
-
- UXA_FALLBACK(("to %p (%c) width %d, count %d\n", pDrawable,
- uxa_drawable_location(pDrawable), pGC->lineWidth, nsegInit));
- if (pGC->lineWidth == 0) {
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
- if (uxa_prepare_access_gc (pGC)) {
- fbPolySegment (pDrawable, pGC, nsegInit, pSegInit);
- uxa_finish_access_gc (pGC);
- }
- uxa_finish_access (pDrawable);
+ ScreenPtr screen = pDrawable->pScreen;
+
+ UXA_FALLBACK(("to %p (%c) width %d, count %d\n", pDrawable,
+ uxa_drawable_location(pDrawable), pGC->lineWidth,
+ nsegInit));
+ if (pGC->lineWidth == 0) {
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
+ if (uxa_prepare_access_gc(pGC)) {
+ fbPolySegment(pDrawable, pGC, nsegInit,
+ pSegInit);
+ uxa_finish_access_gc(pGC);
+ }
+ uxa_finish_access(pDrawable);
+ }
+ return;
}
- return;
- }
- /* fb calls mi functions in the lineWidth != 0 case. */
- fbPolySegment (pDrawable, pGC, nsegInit, pSegInit);
+ /* fb calls mi functions in the lineWidth != 0 case. */
+ fbPolySegment(pDrawable, pGC, nsegInit, pSegInit);
}
void
-uxa_check_poly_arc (DrawablePtr pDrawable, GCPtr pGC,
- int narcs, xArc *pArcs)
+uxa_check_poly_arc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc * pArcs)
{
- ScreenPtr screen = pDrawable->pScreen;
+ ScreenPtr screen = pDrawable->pScreen;
- UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
+ UXA_FALLBACK(("to %p (%c)\n", pDrawable,
+ uxa_drawable_location(pDrawable)));
- /* Disable this as fbPolyArc can call miZeroPolyArc which in turn
- * can call accelerated functions, that as yet, haven't been notified
- * with uxa_finish_access().
- */
+ /* Disable this as fbPolyArc can call miZeroPolyArc which in turn
+ * can call accelerated functions, that as yet, haven't been notified
+ * with uxa_finish_access().
+ */
#if 0
- if (pGC->lineWidth == 0)
- {
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
- if (uxa_prepare_access_gc (pGC)) {
- fbPolyArc (pDrawable, pGC, narcs, pArcs);
- uxa_finish_access_gc (pGC);
- }
- uxa_finish_access (pDrawable);
+ if (pGC->lineWidth == 0) {
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
+ if (uxa_prepare_access_gc(pGC)) {
+ fbPolyArc(pDrawable, pGC, narcs, pArcs);
+ uxa_finish_access_gc(pGC);
+ }
+ uxa_finish_access(pDrawable);
+ }
+ return;
}
- return;
- }
#endif
- miPolyArc (pDrawable, pGC, narcs, pArcs);
+ miPolyArc(pDrawable, pGC, narcs, pArcs);
}
void
-uxa_check_poly_fill_rect (DrawablePtr pDrawable, GCPtr pGC,
- int nrect, xRectangle *prect)
+uxa_check_poly_fill_rect(DrawablePtr pDrawable, GCPtr pGC,
+ int nrect, xRectangle * prect)
{
- ScreenPtr screen = pDrawable->pScreen;
+ ScreenPtr screen = pDrawable->pScreen;
- UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
+ UXA_FALLBACK(("to %p (%c)\n", pDrawable,
+ uxa_drawable_location(pDrawable)));
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
- if (uxa_prepare_access_gc (pGC)) {
- fbPolyFillRect (pDrawable, pGC, nrect, prect);
- uxa_finish_access_gc (pGC);
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
+ if (uxa_prepare_access_gc(pGC)) {
+ fbPolyFillRect(pDrawable, pGC, nrect, prect);
+ uxa_finish_access_gc(pGC);
+ }
+ uxa_finish_access(pDrawable);
}
- uxa_finish_access (pDrawable);
- }
}
void
-uxa_check_image_glyph_blt (DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr *ppci, pointer pglyphBase)
+uxa_check_image_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr * ppci, pointer pglyphBase)
{
- ScreenPtr screen = pDrawable->pScreen;
-
- UXA_FALLBACK(("to %p (%c)\n", pDrawable,
- uxa_drawable_location(pDrawable)));
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
- if (uxa_prepare_access_gc (pGC)) {
- fbImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
- uxa_finish_access_gc (pGC);
+ ScreenPtr screen = pDrawable->pScreen;
+
+ UXA_FALLBACK(("to %p (%c)\n", pDrawable,
+ uxa_drawable_location(pDrawable)));
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
+ if (uxa_prepare_access_gc(pGC)) {
+ fbImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci,
+ pglyphBase);
+ uxa_finish_access_gc(pGC);
+ }
+ uxa_finish_access(pDrawable);
}
- uxa_finish_access (pDrawable);
- }
}
void
-uxa_check_poly_glyph_blt (DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr *ppci, pointer pglyphBase)
+uxa_check_poly_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr * ppci, pointer pglyphBase)
{
- ScreenPtr screen = pDrawable->pScreen;
-
- UXA_FALLBACK(("to %p (%c), style %d alu %d\n", pDrawable,
- uxa_drawable_location(pDrawable), pGC->fillStyle, pGC->alu));
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
- if (uxa_prepare_access_gc (pGC)) {
- fbPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
- uxa_finish_access_gc (pGC);
+ ScreenPtr screen = pDrawable->pScreen;
+
+ UXA_FALLBACK(("to %p (%c), style %d alu %d\n", pDrawable,
+ uxa_drawable_location(pDrawable), pGC->fillStyle,
+ pGC->alu));
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
+ if (uxa_prepare_access_gc(pGC)) {
+ fbPolyGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci,
+ pglyphBase);
+ uxa_finish_access_gc(pGC);
+ }
+ uxa_finish_access(pDrawable);
}
- uxa_finish_access (pDrawable);
- }
}
void
-uxa_check_push_pixels (GCPtr pGC, PixmapPtr pBitmap,
- DrawablePtr pDrawable,
- int w, int h, int x, int y)
+uxa_check_push_pixels(GCPtr pGC, PixmapPtr pBitmap,
+ DrawablePtr pDrawable, int w, int h, int x, int y)
{
- ScreenPtr screen = pDrawable->pScreen;
-
- UXA_FALLBACK(("from %p to %p (%c,%c)\n", pBitmap, pDrawable,
- uxa_drawable_location(&pBitmap->drawable),
- uxa_drawable_location(pDrawable)));
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
- if (uxa_prepare_access (&pBitmap->drawable, UXA_ACCESS_RO)) {
- if (uxa_prepare_access_gc (pGC)) {
- fbPushPixels (pGC, pBitmap, pDrawable, w, h, x, y);
- uxa_finish_access_gc (pGC);
- }
- uxa_finish_access (&pBitmap->drawable);
+ ScreenPtr screen = pDrawable->pScreen;
+
+ UXA_FALLBACK(("from %p to %p (%c,%c)\n", pBitmap, pDrawable,
+ uxa_drawable_location(&pBitmap->drawable),
+ uxa_drawable_location(pDrawable)));
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
+ if (uxa_prepare_access(&pBitmap->drawable, UXA_ACCESS_RO)) {
+ if (uxa_prepare_access_gc(pGC)) {
+ fbPushPixels(pGC, pBitmap, pDrawable, w, h, x,
+ y);
+ uxa_finish_access_gc(pGC);
+ }
+ uxa_finish_access(&pBitmap->drawable);
+ }
+ uxa_finish_access(pDrawable);
}
- uxa_finish_access (pDrawable);
- }
}
void
-uxa_check_get_spans (DrawablePtr pDrawable,
- int wMax,
- DDXPointPtr ppt,
- int *pwidth,
- int nspans,
- char *pdstStart)
+uxa_check_get_spans(DrawablePtr pDrawable,
+ int wMax,
+ DDXPointPtr ppt, int *pwidth, int nspans, char *pdstStart)
{
- ScreenPtr screen = pDrawable->pScreen;
+ ScreenPtr screen = pDrawable->pScreen;
- UXA_FALLBACK(("from %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
- if (uxa_prepare_access (pDrawable, UXA_ACCESS_RO)) {
- fbGetSpans (pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
- uxa_finish_access (pDrawable);
- }
+ UXA_FALLBACK(("from %p (%c)\n", pDrawable,
+ uxa_drawable_location(pDrawable)));
+ if (uxa_prepare_access(pDrawable, UXA_ACCESS_RO)) {
+ fbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
+ uxa_finish_access(pDrawable);
+ }
}
void
-uxa_check_composite (CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst,
- INT16 yDst,
- CARD16 width,
- CARD16 height)
+uxa_check_composite(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst, INT16 yDst, CARD16 width, CARD16 height)
{
- ScreenPtr screen = pDst->pDrawable->pScreen;
-
- UXA_FALLBACK(("from picts %p/%p to pict %p\n",
- pSrc, pMask, pDst));
-
- if (uxa_prepare_access (pDst->pDrawable, UXA_ACCESS_RW))
- {
- if (pSrc->pDrawable == NULL ||
- uxa_prepare_access (pSrc->pDrawable, UXA_ACCESS_RO))
- {
- if (!pMask || pMask->pDrawable == NULL ||
- uxa_prepare_access (pMask->pDrawable, UXA_ACCESS_RO))
- {
- fbComposite (op,
- pSrc,
- pMask,
- pDst,
- xSrc,
- ySrc,
- xMask,
- yMask,
- xDst,
- yDst,
- width,
- height);
- if (pMask && pMask->pDrawable != NULL)
- uxa_finish_access (pMask->pDrawable);
- }
- if (pSrc->pDrawable != NULL)
- uxa_finish_access (pSrc->pDrawable);
+ ScreenPtr screen = pDst->pDrawable->pScreen;
+
+ UXA_FALLBACK(("from picts %p/%p to pict %p\n", pSrc, pMask, pDst));
+
+ if (uxa_prepare_access(pDst->pDrawable, UXA_ACCESS_RW)) {
+ if (pSrc->pDrawable == NULL ||
+ uxa_prepare_access(pSrc->pDrawable, UXA_ACCESS_RO)) {
+ if (!pMask || pMask->pDrawable == NULL ||
+ uxa_prepare_access(pMask->pDrawable, UXA_ACCESS_RO))
+ {
+ fbComposite(op,
+ pSrc,
+ pMask,
+ pDst,
+ xSrc,
+ ySrc,
+ xMask,
+ yMask, xDst, yDst, width, height);
+ if (pMask && pMask->pDrawable != NULL)
+ uxa_finish_access(pMask->pDrawable);
+ }
+ if (pSrc->pDrawable != NULL)
+ uxa_finish_access(pSrc->pDrawable);
+ }
+ uxa_finish_access(pDst->pDrawable);
}
- uxa_finish_access (pDst->pDrawable);
- }
}
void
-uxa_check_add_traps (PicturePtr pPicture,
- INT16 x_off,
- INT16 y_off,
- int ntrap,
- xTrap *traps)
+uxa_check_add_traps(PicturePtr pPicture,
+ INT16 x_off, INT16 y_off, int ntrap, xTrap * traps)
{
- ScreenPtr screen = pPicture->pDrawable->pScreen;
-
- UXA_FALLBACK(("to pict %p (%c)\n", pPicture,
- uxa_drawable_location(pPicture->pDrawable)));
- if (uxa_prepare_access(pPicture->pDrawable, UXA_ACCESS_RW)) {
- fbAddTraps (pPicture, x_off, y_off, ntrap, traps);
- uxa_finish_access(pPicture->pDrawable);
- }
+ ScreenPtr screen = pPicture->pDrawable->pScreen;
+
+ UXA_FALLBACK(("to pict %p (%c)\n", pPicture,
+ uxa_drawable_location(pPicture->pDrawable)));
+ if (uxa_prepare_access(pPicture->pDrawable, UXA_ACCESS_RW)) {
+ fbAddTraps(pPicture, x_off, y_off, ntrap, traps);
+ uxa_finish_access(pPicture->pDrawable);
+ }
}
/**
@@ -408,29 +407,28 @@ uxa_check_add_traps (PicturePtr pPicture,
*
* XXX This really belongs in fb, so it can be aware of tiling and etc.
*/
-CARD32
-uxa_get_pixmap_first_pixel (PixmapPtr pPixmap)
+CARD32 uxa_get_pixmap_first_pixel(PixmapPtr pPixmap)
{
- CARD32 pixel;
- void *fb;
-
- if (!uxa_prepare_access (&pPixmap->drawable, UXA_ACCESS_RO))
- return 0;
-
- fb = pPixmap->devPrivate.ptr;
-
- switch (pPixmap->drawable.bitsPerPixel) {
- case 32:
- pixel = *(CARD32 *)fb;
- break;
- case 16:
- pixel = *(CARD16 *)fb;
- break;
- default:
- pixel = *(CARD8 *)fb;
- break;
- }
- uxa_finish_access(&pPixmap->drawable);
-
- return pixel;
+ CARD32 pixel;
+ void *fb;
+
+ if (!uxa_prepare_access(&pPixmap->drawable, UXA_ACCESS_RO))
+ return 0;
+
+ fb = pPixmap->devPrivate.ptr;
+
+ switch (pPixmap->drawable.bitsPerPixel) {
+ case 32:
+ pixel = *(CARD32 *) fb;
+ break;
+ case 16:
+ pixel = *(CARD16 *) fb;
+ break;
+ default:
+ pixel = *(CARD8 *) fb;
+ break;
+ }
+ uxa_finish_access(&pPixmap->drawable);
+
+ return pixel;
}
diff --git a/uxa/uxa.c b/uxa/uxa.c
index 22c7c405..4bf8c774 100644
--- a/uxa/uxa.c
+++ b/uxa/uxa.c
@@ -52,14 +52,14 @@ int uxa_screen_index;
* redirected window, and the translation coordinates are provided by calling
* uxa_get_drawable_pixmap() on the drawable.
*/
-PixmapPtr
-uxa_get_drawable_pixmap(DrawablePtr pDrawable)
+PixmapPtr uxa_get_drawable_pixmap(DrawablePtr pDrawable)
{
- if (pDrawable->type == DRAWABLE_WINDOW)
- return pDrawable->pScreen->GetWindowPixmap ((WindowPtr) pDrawable);
- else
- return (PixmapPtr) pDrawable;
-}
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ return pDrawable->pScreen->
+ GetWindowPixmap((WindowPtr) pDrawable);
+ else
+ return (PixmapPtr) pDrawable;
+}
/**
* Sets the offsets to add to coordinates to make them address the same bits in
@@ -67,19 +67,19 @@ uxa_get_drawable_pixmap(DrawablePtr pDrawable)
* windows.
*/
void
-uxa_get_drawable_deltas (DrawablePtr pDrawable, PixmapPtr pPixmap,
- int *xp, int *yp)
+uxa_get_drawable_deltas(DrawablePtr pDrawable, PixmapPtr pPixmap,
+ int *xp, int *yp)
{
#ifdef COMPOSITE
- if (pDrawable->type == DRAWABLE_WINDOW) {
- *xp = -pPixmap->screen_x;
- *yp = -pPixmap->screen_y;
- return;
- }
+ if (pDrawable->type == DRAWABLE_WINDOW) {
+ *xp = -pPixmap->screen_x;
+ *yp = -pPixmap->screen_y;
+ return;
+ }
#endif
- *xp = 0;
- *yp = 0;
+ *xp = 0;
+ *yp = 0;
}
/**
@@ -94,66 +94,61 @@ uxa_get_drawable_deltas (DrawablePtr pDrawable, PixmapPtr pPixmap,
*
* @return TRUE if the given drawable is in framebuffer memory.
*/
-Bool
-uxa_pixmap_is_offscreen(PixmapPtr p)
+Bool uxa_pixmap_is_offscreen(PixmapPtr p)
{
- ScreenPtr pScreen = p->drawable.pScreen;
- uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
+ ScreenPtr pScreen = p->drawable.pScreen;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
- if (uxa_screen->info->pixmap_is_offscreen)
- return uxa_screen->info->pixmap_is_offscreen(p);
+ if (uxa_screen->info->pixmap_is_offscreen)
+ return uxa_screen->info->pixmap_is_offscreen(p);
- return FALSE;
+ return FALSE;
}
/**
- * uxa_drawable_is_offscreen() is a convenience wrapper for uxa_pixmap_is_offscreen().
+ * uxa_drawable_is_offscreen() is a convenience wrapper for
+ * uxa_pixmap_is_offscreen().
*/
-Bool
-uxa_drawable_is_offscreen (DrawablePtr pDrawable)
+Bool uxa_drawable_is_offscreen(DrawablePtr pDrawable)
{
- return uxa_pixmap_is_offscreen (uxa_get_drawable_pixmap (pDrawable));
+ return uxa_pixmap_is_offscreen(uxa_get_drawable_pixmap(pDrawable));
}
/**
* Returns the pixmap which backs a drawable, and the offsets to add to
* coordinates to make them address the same bits in the backing drawable.
*/
-PixmapPtr
-uxa_get_offscreen_pixmap (DrawablePtr drawable, int *xp, int *yp)
+PixmapPtr uxa_get_offscreen_pixmap(DrawablePtr drawable, int *xp, int *yp)
{
- PixmapPtr pixmap = uxa_get_drawable_pixmap (drawable);
+ PixmapPtr pixmap = uxa_get_drawable_pixmap(drawable);
- uxa_get_drawable_deltas (drawable, pixmap, xp, yp);
+ uxa_get_drawable_deltas(drawable, pixmap, xp, yp);
- if (uxa_pixmap_is_offscreen (pixmap))
- return pixmap;
- else
- return NULL;
+ if (uxa_pixmap_is_offscreen(pixmap))
+ return pixmap;
+ else
+ return NULL;
}
-
-
/**
* uxa_prepare_access() is UXA's wrapper for the driver's PrepareAccess() handler.
*
* It deals with waiting for synchronization with the card, determining if
* PrepareAccess() is necessary, and working around PrepareAccess() failure.
*/
-Bool
-uxa_prepare_access(DrawablePtr pDrawable, uxa_access_t access)
+Bool uxa_prepare_access(DrawablePtr pDrawable, uxa_access_t access)
{
- ScreenPtr pScreen = pDrawable->pScreen;
- uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
- PixmapPtr pPixmap = uxa_get_drawable_pixmap (pDrawable);
- Bool offscreen = uxa_pixmap_is_offscreen(pPixmap);
+ ScreenPtr pScreen = pDrawable->pScreen;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
+ PixmapPtr pPixmap = uxa_get_drawable_pixmap(pDrawable);
+ Bool offscreen = uxa_pixmap_is_offscreen(pPixmap);
- if (!offscreen)
- return TRUE;
+ if (!offscreen)
+ return TRUE;
- if (uxa_screen->info->prepare_access)
- return (*uxa_screen->info->prepare_access) (pPixmap, access);
- return TRUE;
+ if (uxa_screen->info->prepare_access)
+ return (*uxa_screen->info->prepare_access) (pPixmap, access);
+ return TRUE;
}
/**
@@ -161,20 +156,19 @@ uxa_prepare_access(DrawablePtr pDrawable, uxa_access_t access)
*
* It deals with calling the driver's finish_access() only if necessary.
*/
-void
-uxa_finish_access(DrawablePtr pDrawable)
+void uxa_finish_access(DrawablePtr pDrawable)
{
- ScreenPtr pScreen = pDrawable->pScreen;
- uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
- PixmapPtr pPixmap = uxa_get_drawable_pixmap (pDrawable);
+ ScreenPtr pScreen = pDrawable->pScreen;
+ uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
+ PixmapPtr pPixmap = uxa_get_drawable_pixmap(pDrawable);
- if (uxa_screen->info->finish_access == NULL)
- return;
+ if (uxa_screen->info->finish_access == NULL)
+ return;
- if (!uxa_pixmap_is_offscreen (pPixmap))
- return;
+ if (!uxa_pixmap_is_offscreen(pPixmap))
+ return;
- (*uxa_screen->info->finish_access) (pPixmap);
+ (*uxa_screen->info->finish_access) (pPixmap);
}
/**
@@ -182,217 +176,218 @@ uxa_finish_access(DrawablePtr pDrawable)
* accelerated or may sync the card and fall back to fb.
*/
static void
-uxa_validate_gc (GCPtr pGC, unsigned long changes, DrawablePtr pDrawable)
+uxa_validate_gc(GCPtr pGC, unsigned long changes, DrawablePtr pDrawable)
{
- /* fbValidateGC will do direct access to pixmaps if the tiling has changed.
- * Preempt fbValidateGC by doing its work and masking the change out, so
- * that we can do the Prepare/finish_access.
- */
+ /* fbValidateGC will do direct access to pixmaps if the tiling has
+ * changed.
+ * Preempt fbValidateGC by doing its work and masking the change out, so
+ * that we can do the Prepare/finish_access.
+ */
#ifdef FB_24_32BIT
- if ((changes & GCTile) && fbGetRotatedPixmap(pGC)) {
- (*pGC->pScreen->DestroyPixmap) (fbGetRotatedPixmap(pGC));
- fbGetRotatedPixmap(pGC) = 0;
- }
-
- if (pGC->fillStyle == FillTiled) {
- PixmapPtr pOldTile, pNewTile;
-
- pOldTile = pGC->tile.pixmap;
- if (pOldTile->drawable.bitsPerPixel != pDrawable->bitsPerPixel)
- {
- pNewTile = fbGetRotatedPixmap(pGC);
- if (!pNewTile ||
- pNewTile ->drawable.bitsPerPixel != pDrawable->bitsPerPixel)
- {
- if (pNewTile)
- (*pGC->pScreen->DestroyPixmap) (pNewTile);
- /* fb24_32ReformatTile will do direct access of a newly-
- * allocated pixmap. This isn't a problem yet, since we don't
- * put pixmaps in FB until at least one accelerated UXA op.
- */
- if (uxa_prepare_access(&pOldTile->drawable, UXA_ACCESS_RO)) {
- pNewTile = fb24_32ReformatTile (pOldTile,
- pDrawable->bitsPerPixel);
- uxa_finish_access(&pOldTile->drawable);
+ if ((changes & GCTile) && fbGetRotatedPixmap(pGC)) {
+ (*pGC->pScreen->DestroyPixmap) (fbGetRotatedPixmap(pGC));
+ fbGetRotatedPixmap(pGC) = 0;
+ }
+
+ if (pGC->fillStyle == FillTiled) {
+ PixmapPtr pOldTile, pNewTile;
+
+ pOldTile = pGC->tile.pixmap;
+ if (pOldTile->drawable.bitsPerPixel != pDrawable->bitsPerPixel) {
+ pNewTile = fbGetRotatedPixmap(pGC);
+ if (!pNewTile ||
+ pNewTile->drawable.bitsPerPixel !=
+ pDrawable->bitsPerPixel) {
+ if (pNewTile)
+ (*pGC->pScreen->
+ DestroyPixmap) (pNewTile);
+ /* fb24_32ReformatTile will do direct access
+ * of a newly-allocated pixmap. This isn't a
+ * problem yet, since we don't put pixmaps in
+ * FB until at least one accelerated UXA op.
+ */
+ if (uxa_prepare_access
+ (&pOldTile->drawable, UXA_ACCESS_RO)) {
+ pNewTile =
+ fb24_32ReformatTile(pOldTile,
+ pDrawable->
+ bitsPerPixel);
+ uxa_finish_access(&pOldTile->drawable);
+ }
+ }
+ if (pNewTile) {
+ fbGetRotatedPixmap(pGC) = pOldTile;
+ pGC->tile.pixmap = pNewTile;
+ changes |= GCTile;
+ }
}
- }
- if (pNewTile)
- {
- fbGetRotatedPixmap(pGC) = pOldTile;
- pGC->tile.pixmap = pNewTile;
- changes |= GCTile;
- }
}
- }
#endif
- if (changes & GCTile) {
- if (!pGC->tileIsPixel && FbEvenTile (pGC->tile.pixmap->drawable.width *
- pDrawable->bitsPerPixel))
- {
- if (uxa_prepare_access(&pGC->tile.pixmap->drawable, UXA_ACCESS_RW)) {
- fbPadPixmap (pGC->tile.pixmap);
- uxa_finish_access(&pGC->tile.pixmap->drawable);
- }
+ if (changes & GCTile) {
+ if (!pGC->tileIsPixel
+ && FbEvenTile(pGC->tile.pixmap->drawable.width *
+ pDrawable->bitsPerPixel)) {
+ if (uxa_prepare_access
+ (&pGC->tile.pixmap->drawable, UXA_ACCESS_RW)) {
+ fbPadPixmap(pGC->tile.pixmap);
+ uxa_finish_access(&pGC->tile.pixmap->drawable);
+ }
+ }
+ /* Mask out the GCTile change notification, now that we've
+ * done FB's job for it.
+ */
+ changes &= ~GCTile;
}
- /* Mask out the GCTile change notification, now that we've done FB's
- * job for it.
- */
- changes &= ~GCTile;
- }
- if (changes & GCStipple && pGC->stipple) {
- /* We can't inline stipple handling like we do for GCTile because it sets
- * fbgc privates.
- */
- if (uxa_prepare_access(&pGC->stipple->drawable, UXA_ACCESS_RW)) {
- fbValidateGC (pGC, changes, pDrawable);
- uxa_finish_access(&pGC->stipple->drawable);
+ if (changes & GCStipple && pGC->stipple) {
+ /* We can't inline stipple handling like we do for GCTile
+ * because it sets fbgc privates.
+ */
+ if (uxa_prepare_access(&pGC->stipple->drawable, UXA_ACCESS_RW)) {
+ fbValidateGC(pGC, changes, pDrawable);
+ uxa_finish_access(&pGC->stipple->drawable);
+ }
+ } else {
+ fbValidateGC(pGC, changes, pDrawable);
}
- } else {
- fbValidateGC (pGC, changes, pDrawable);
- }
- pGC->ops = (GCOps *) &uxa_ops;
+ pGC->ops = (GCOps *) & uxa_ops;
}
-static GCFuncs uxaGCFuncs = {
- uxa_validate_gc,
- miChangeGC,
- miCopyGC,
- miDestroyGC,
- miChangeClip,
- miDestroyClip,
- miCopyClip
+static GCFuncs uxaGCFuncs = {
+ uxa_validate_gc,
+ miChangeGC,
+ miCopyGC,
+ miDestroyGC,
+ miChangeClip,
+ miDestroyClip,
+ miCopyClip
};
/**
* uxa_create_gc makes a new GC and hooks up its funcs handler, so that
* uxa_validate_gc() will get called.
*/
-static int
-uxa_create_gc (GCPtr pGC)
+static int uxa_create_gc(GCPtr pGC)
{
- if (!fbCreateGC (pGC))
- return FALSE;
+ if (!fbCreateGC(pGC))
+ return FALSE;
- pGC->funcs = &uxaGCFuncs;
+ pGC->funcs = &uxaGCFuncs;
- return TRUE;
+ return TRUE;
}
-Bool
-uxa_prepare_access_window(WindowPtr pWin)
+Bool uxa_prepare_access_window(WindowPtr pWin)
{
- if (pWin->backgroundState == BackgroundPixmap) {
- if (!uxa_prepare_access(&pWin->background.pixmap->drawable, UXA_ACCESS_RO))
- return FALSE;
- }
-
- if (pWin->borderIsPixel == FALSE) {
- if (!uxa_prepare_access(&pWin->border.pixmap->drawable, UXA_ACCESS_RO)) {
- if (pWin->backgroundState == BackgroundPixmap)
- uxa_finish_access(&pWin->background.pixmap->drawable);
- return FALSE;
+ if (pWin->backgroundState == BackgroundPixmap) {
+ if (!uxa_prepare_access
+ (&pWin->background.pixmap->drawable, UXA_ACCESS_RO))
+ return FALSE;
+ }
+
+ if (pWin->borderIsPixel == FALSE) {
+ if (!uxa_prepare_access
+ (&pWin->border.pixmap->drawable, UXA_ACCESS_RO)) {
+ if (pWin->backgroundState == BackgroundPixmap)
+ uxa_finish_access(&pWin->background.pixmap->
+ drawable);
+ return FALSE;
+ }
}
- }
- return TRUE;
+ return TRUE;
}
-void
-uxa_finish_access_window(WindowPtr pWin)
+void uxa_finish_access_window(WindowPtr pWin)
{
- if (pWin->backgroundState == BackgroundPixmap)
- uxa_finish_access(&pWin->background.pixmap->drawable);
+ if (pWin->backgroundState == BackgroundPixmap)
+ uxa_finish_access(&pWin->background.pixmap->drawable);
- if (pWin->borderIsPixel == FALSE)
- uxa_finish_access(&pWin->border.pixmap->drawable);
+ if (pWin->borderIsPixel == FALSE)
+ uxa_finish_access(&pWin->border.pixmap->drawable);
}
-static Bool
-uxa_change_window_attributes(WindowPtr pWin, unsigned long mask)
+static Bool uxa_change_window_attributes(WindowPtr pWin, unsigned long mask)
{
- Bool ret;
+ Bool ret;
- if (!uxa_prepare_access_window(pWin))
- return FALSE;
- ret = fbChangeWindowAttributes(pWin, mask);
- uxa_finish_access_window(pWin);
- return ret;
+ if (!uxa_prepare_access_window(pWin))
+ return FALSE;
+ ret = fbChangeWindowAttributes(pWin, mask);
+ uxa_finish_access_window(pWin);
+ return ret;
}
-static RegionPtr
-uxa_bitmap_to_region(PixmapPtr pPix)
+static RegionPtr uxa_bitmap_to_region(PixmapPtr pPix)
{
- RegionPtr ret;
- if (!uxa_prepare_access(&pPix->drawable, UXA_ACCESS_RO))
- return NULL;
- ret = fbPixmapToRegion(pPix);
- uxa_finish_access(&pPix->drawable);
- return ret;
+ RegionPtr ret;
+ if (!uxa_prepare_access(&pPix->drawable, UXA_ACCESS_RO))
+ return NULL;
+ ret = fbPixmapToRegion(pPix);
+ uxa_finish_access(&pPix->drawable);
+ return ret;
}
-static void
-uxa_xorg_enable_disable_fb_access (int index, Bool enable)
+static void uxa_xorg_enable_disable_fb_access(int index, Bool enable)
{
- ScreenPtr screen = screenInfo.screens[index];
- uxa_screen_t *uxa_screen = uxa_get_screen(screen);
+ ScreenPtr screen = screenInfo.screens[index];
+ uxa_screen_t *uxa_screen = uxa_get_screen(screen);
- if (!enable && uxa_screen->disableFbCount++ == 0)
- uxa_screen->swappedOut = TRUE;
+ if (!enable && uxa_screen->disableFbCount++ == 0)
+ uxa_screen->swappedOut = TRUE;
- if (enable && --uxa_screen->disableFbCount == 0)
- uxa_screen->swappedOut = FALSE;
+ if (enable && --uxa_screen->disableFbCount == 0)
+ uxa_screen->swappedOut = FALSE;
- if (uxa_screen->SavedEnableDisableFBAccess)
- uxa_screen->SavedEnableDisableFBAccess(index, enable);
+ if (uxa_screen->SavedEnableDisableFBAccess)
+ uxa_screen->SavedEnableDisableFBAccess(index, enable);
}
-void
-uxa_set_fallback_debug (ScreenPtr screen, Bool enable)
+void uxa_set_fallback_debug(ScreenPtr screen, Bool enable)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(screen);
+ uxa_screen_t *uxa_screen = uxa_get_screen(screen);
- uxa_screen->fallback_debug = enable;
+ uxa_screen->fallback_debug = enable;
}
/**
* uxa_close_screen() unwraps its wrapped screen functions and tears down UXA's
* screen private, before calling down to the next CloseSccreen.
*/
-static Bool
-uxa_close_screen(int i, ScreenPtr pScreen)
+static Bool uxa_close_screen(int i, ScreenPtr pScreen)
{
- uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
- ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
+ uxa_screen_t *uxa_screen = uxa_get_screen(pScreen);
+ ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
#ifdef RENDER
- PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
+ PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif
- uxa_glyphs_fini(pScreen);
-
- pScreen->CreateGC = uxa_screen->SavedCreateGC;
- pScreen->CloseScreen = uxa_screen->SavedCloseScreen;
- pScreen->GetImage = uxa_screen->SavedGetImage;
- pScreen->GetSpans = uxa_screen->SavedGetSpans;
- pScreen->CreatePixmap = uxa_screen->SavedCreatePixmap;
- pScreen->DestroyPixmap = uxa_screen->SavedDestroyPixmap;
- pScreen->CopyWindow = uxa_screen->SavedCopyWindow;
- pScreen->ChangeWindowAttributes = uxa_screen->SavedChangeWindowAttributes;
- pScreen->BitmapToRegion = uxa_screen->SavedBitmapToRegion;
- scrn->EnableDisableFBAccess = uxa_screen->SavedEnableDisableFBAccess;
+ uxa_glyphs_fini(pScreen);
+
+ pScreen->CreateGC = uxa_screen->SavedCreateGC;
+ pScreen->CloseScreen = uxa_screen->SavedCloseScreen;
+ pScreen->GetImage = uxa_screen->SavedGetImage;
+ pScreen->GetSpans = uxa_screen->SavedGetSpans;
+ pScreen->CreatePixmap = uxa_screen->SavedCreatePixmap;
+ pScreen->DestroyPixmap = uxa_screen->SavedDestroyPixmap;
+ pScreen->CopyWindow = uxa_screen->SavedCopyWindow;
+ pScreen->ChangeWindowAttributes =
+ uxa_screen->SavedChangeWindowAttributes;
+ pScreen->BitmapToRegion = uxa_screen->SavedBitmapToRegion;
+ scrn->EnableDisableFBAccess = uxa_screen->SavedEnableDisableFBAccess;
#ifdef RENDER
- if (ps) {
- ps->Composite = uxa_screen->SavedComposite;
- ps->Glyphs = uxa_screen->SavedGlyphs;
- ps->Trapezoids = uxa_screen->SavedTrapezoids;
- ps->AddTraps = uxa_screen->SavedAddTraps;
- ps->Triangles = uxa_screen->SavedTriangles;
- }
+ if (ps) {
+ ps->Composite = uxa_screen->SavedComposite;
+ ps->Glyphs = uxa_screen->SavedGlyphs;
+ ps->Trapezoids = uxa_screen->SavedTrapezoids;
+ ps->AddTraps = uxa_screen->SavedAddTraps;
+ ps->Triangles = uxa_screen->SavedTriangles;
+ }
#endif
- xfree (uxa_screen);
+ xfree(uxa_screen);
- return (*pScreen->CloseScreen) (i, pScreen);
+ return (*pScreen->CloseScreen) (i, pScreen);
}
/**
@@ -405,10 +400,9 @@ uxa_close_screen(int i, ScreenPtr pScreen)
*
* @return a newly allocated, zero-filled driver structure
*/
-uxa_driver_t *
-uxa_driver_alloc(void)
+uxa_driver_t *uxa_driver_alloc(void)
{
- return xcalloc(1, sizeof(uxa_driver_t));
+ return xcalloc(1, sizeof(uxa_driver_t));
}
/**
@@ -421,132 +415,135 @@ uxa_driver_alloc(void)
*
* @return TRUE if UXA was successfully initialized.
*/
-Bool
-uxa_driver_init(ScreenPtr screen, uxa_driver_t *uxa_driver)
+Bool uxa_driver_init(ScreenPtr screen, uxa_driver_t * uxa_driver)
{
- uxa_screen_t *uxa_screen;
- ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ uxa_screen_t *uxa_screen;
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
#ifdef RENDER
- PictureScreenPtr ps;
+ PictureScreenPtr ps;
#endif
- if (!uxa_driver)
- return FALSE;
-
- if (uxa_driver->uxa_major != UXA_VERSION_MAJOR ||
- uxa_driver->uxa_minor > UXA_VERSION_MINOR)
- {
- LogMessage(X_ERROR, "UXA(%d): driver's UXA version requirements "
- "(%d.%d) are incompatible with UXA version (%d.%d)\n",
- screen->myNum,
- uxa_driver->uxa_major, uxa_driver->uxa_minor,
- UXA_VERSION_MAJOR, UXA_VERSION_MINOR);
- return FALSE;
- }
-
- if (!uxa_driver->prepare_solid) {
- LogMessage(X_ERROR, "UXA(%d): uxa_driver_t::prepare_solid must be "
- "non-NULL\n", screen->myNum);
- return FALSE;
- }
+ if (!uxa_driver)
+ return FALSE;
+
+ if (uxa_driver->uxa_major != UXA_VERSION_MAJOR ||
+ uxa_driver->uxa_minor > UXA_VERSION_MINOR) {
+ LogMessage(X_ERROR,
+ "UXA(%d): driver's UXA version requirements "
+ "(%d.%d) are incompatible with UXA version (%d.%d)\n",
+ screen->myNum, uxa_driver->uxa_major,
+ uxa_driver->uxa_minor, UXA_VERSION_MAJOR,
+ UXA_VERSION_MINOR);
+ return FALSE;
+ }
- if (!uxa_driver->prepare_copy) {
- LogMessage(X_ERROR, "UXA(%d): uxa_driver_t::prepare_copy must be "
- "non-NULL\n", screen->myNum);
- return FALSE;
- }
+ if (!uxa_driver->prepare_solid) {
+ LogMessage(X_ERROR,
+ "UXA(%d): uxa_driver_t::prepare_solid must be "
+ "non-NULL\n", screen->myNum);
+ return FALSE;
+ }
+ if (!uxa_driver->prepare_copy) {
+ LogMessage(X_ERROR,
+ "UXA(%d): uxa_driver_t::prepare_copy must be "
+ "non-NULL\n", screen->myNum);
+ return FALSE;
+ }
#ifdef RENDER
- ps = GetPictureScreenIfSet(screen);
+ ps = GetPictureScreenIfSet(screen);
#endif
- uxa_screen = xcalloc (sizeof (uxa_screen_t), 1);
+ uxa_screen = xcalloc(sizeof(uxa_screen_t), 1);
- if (!uxa_screen) {
- LogMessage(X_WARNING, "UXA(%d): Failed to allocate screen private\n",
- screen->myNum);
- return FALSE;
- }
+ if (!uxa_screen) {
+ LogMessage(X_WARNING,
+ "UXA(%d): Failed to allocate screen private\n",
+ screen->myNum);
+ return FALSE;
+ }
- uxa_screen->info = uxa_driver;
+ uxa_screen->info = uxa_driver;
- dixSetPrivate(&screen->devPrivates, &uxa_screen_index, uxa_screen);
+ dixSetPrivate(&screen->devPrivates, &uxa_screen_index, uxa_screen);
// exaDDXDriverInit(screen);
- /*
- * Replace various fb screen functions
- */
- uxa_screen->SavedCloseScreen = screen->CloseScreen;
- screen->CloseScreen = uxa_close_screen;
+ /*
+ * Replace various fb screen functions
+ */
+ uxa_screen->SavedCloseScreen = screen->CloseScreen;
+ screen->CloseScreen = uxa_close_screen;
- uxa_screen->SavedCreateGC = screen->CreateGC;
- screen->CreateGC = uxa_create_gc;
+ uxa_screen->SavedCreateGC = screen->CreateGC;
+ screen->CreateGC = uxa_create_gc;
- uxa_screen->SavedGetImage = screen->GetImage;
- screen->GetImage = uxa_get_image;
+ uxa_screen->SavedGetImage = screen->GetImage;
+ screen->GetImage = uxa_get_image;
- uxa_screen->SavedGetSpans = screen->GetSpans;
- screen->GetSpans = uxa_check_get_spans;
+ uxa_screen->SavedGetSpans = screen->GetSpans;
+ screen->GetSpans = uxa_check_get_spans;
- uxa_screen->SavedCopyWindow = screen->CopyWindow;
- screen->CopyWindow = uxa_copy_window;
+ uxa_screen->SavedCopyWindow = screen->CopyWindow;
+ screen->CopyWindow = uxa_copy_window;
- uxa_screen->SavedChangeWindowAttributes = screen->ChangeWindowAttributes;
- screen->ChangeWindowAttributes = uxa_change_window_attributes;
+ uxa_screen->SavedChangeWindowAttributes =
+ screen->ChangeWindowAttributes;
+ screen->ChangeWindowAttributes = uxa_change_window_attributes;
- uxa_screen->SavedBitmapToRegion = screen->BitmapToRegion;
- screen->BitmapToRegion = uxa_bitmap_to_region;
+ uxa_screen->SavedBitmapToRegion = screen->BitmapToRegion;
+ screen->BitmapToRegion = uxa_bitmap_to_region;
- uxa_screen->SavedEnableDisableFBAccess = scrn->EnableDisableFBAccess;
- scrn->EnableDisableFBAccess = uxa_xorg_enable_disable_fb_access;
+ uxa_screen->SavedEnableDisableFBAccess = scrn->EnableDisableFBAccess;
+ scrn->EnableDisableFBAccess = uxa_xorg_enable_disable_fb_access;
#ifdef RENDER
- if (ps) {
- uxa_screen->SavedComposite = ps->Composite;
- ps->Composite = uxa_composite;
+ if (ps) {
+ uxa_screen->SavedComposite = ps->Composite;
+ ps->Composite = uxa_composite;
- uxa_screen->SavedGlyphs = ps->Glyphs;
- ps->Glyphs = uxa_glyphs;
+ uxa_screen->SavedGlyphs = ps->Glyphs;
+ ps->Glyphs = uxa_glyphs;
- uxa_screen->SavedTriangles = ps->Triangles;
- ps->Triangles = uxa_triangles;
+ uxa_screen->SavedTriangles = ps->Triangles;
+ ps->Triangles = uxa_triangles;
- uxa_screen->SavedTrapezoids = ps->Trapezoids;
- ps->Trapezoids = uxa_trapezoids;
+ uxa_screen->SavedTrapezoids = ps->Trapezoids;
+ ps->Trapezoids = uxa_trapezoids;
- uxa_screen->SavedAddTraps = ps->AddTraps;
- ps->AddTraps = uxa_check_add_traps;
- }
+ uxa_screen->SavedAddTraps = ps->AddTraps;
+ ps->AddTraps = uxa_check_add_traps;
+ }
#endif
#ifdef MITSHM
- /* Re-register with the MI funcs, which don't allow shared pixmaps.
- * Shared pixmaps are almost always a performance loss for us, but this
- * still allows for SHM PutImage.
- */
- ShmRegisterFuncs(screen, &uxa_shm_funcs);
+ /* Re-register with the MI funcs, which don't allow shared pixmaps.
+ * Shared pixmaps are almost always a performance loss for us, but this
+ * still allows for SHM PutImage.
+ */
+ ShmRegisterFuncs(screen, &uxa_shm_funcs);
#endif
- uxa_glyphs_init(screen);
-
- LogMessage(X_INFO, "UXA(%d): Driver registered support for the following"
- " operations:\n", screen->myNum);
- assert(uxa_driver->prepare_solid != NULL);
- LogMessage(X_INFO, " solid\n");
- assert(uxa_driver->prepare_copy != NULL);
- LogMessage(X_INFO, " copy\n");
- if (uxa_driver->prepare_composite != NULL) {
- LogMessage(X_INFO, " composite (RENDER acceleration)\n");
- }
- if (uxa_driver->put_image != NULL) {
- LogMessage(X_INFO, " put_image\n");
- }
- if (uxa_driver->get_image != NULL) {
- LogMessage(X_INFO, " get_image\n");
- }
-
- return TRUE;
+ uxa_glyphs_init(screen);
+
+ LogMessage(X_INFO,
+ "UXA(%d): Driver registered support for the following"
+ " operations:\n", screen->myNum);
+ assert(uxa_driver->prepare_solid != NULL);
+ LogMessage(X_INFO, " solid\n");
+ assert(uxa_driver->prepare_copy != NULL);
+ LogMessage(X_INFO, " copy\n");
+ if (uxa_driver->prepare_composite != NULL) {
+ LogMessage(X_INFO, " composite (RENDER acceleration)\n");
+ }
+ if (uxa_driver->put_image != NULL) {
+ LogMessage(X_INFO, " put_image\n");
+ }
+ if (uxa_driver->get_image != NULL) {
+ LogMessage(X_INFO, " get_image\n");
+ }
+
+ return TRUE;
}
/**
@@ -554,8 +551,7 @@ uxa_driver_init(ScreenPtr screen, uxa_driver_t *uxa_driver)
*
* @param pScreen screen being torn down.
*/
-void
-uxa_driver_fini (ScreenPtr pScreen)
+void uxa_driver_fini(ScreenPtr pScreen)
{
- /*right now does nothing*/
+ /*right now does nothing */
}
diff --git a/uxa/uxa.h b/uxa/uxa.h
index d5f5b9c4..b1f3737a 100644
--- a/uxa/uxa.h
+++ b/uxa/uxa.h
@@ -53,444 +53,442 @@ typedef enum {
* fllled in by drivers.
*/
typedef struct _UxaDriver {
- /**
- * uxa_major and uxa_minor should be set by the driver to the version of
- * UXA which the driver was compiled for (or configures itself at runtime
- * to support). This allows UXA to extend the structure for new features
- * without breaking ABI for drivers compiled against older versions.
- */
- int uxa_major, uxa_minor;
-
- /**
- * The flags field is bitfield of boolean values controlling UXA's behavior.
- *
- * The flags include UXA_TWO_BITBLT_DIRECTIONS.
- */
- int flags;
-
- /** @name solid
- * @{
- */
- /**
- * prepare_solid() sets up the driver for doing a solid fill.
- * @param pPixmap Destination pixmap
- * @param alu raster operation
- * @param planemask write mask for the fill
- * @param fg "foreground" color for the fill
- *
- * This call should set up the driver for doing a series of solid fills
- * through the solid() call. The alu raster op is one of the GX*
- * graphics functions listed in X.h, and typically maps to a similar
- * single-byte "ROP" setting in all hardware. The planemask controls
- * which bits of the destination should be affected, and will only represent
- * the bits up to the depth of pPixmap. The fg is the pixel value of the
- * foreground color referred to in ROP descriptions.
- *
- * Note that many drivers will need to store some of the data in the driver
- * private record, for sending to the hardware with each drawing command.
- *
- * The prepare_solid() call is required of all drivers, but it may fail for any
- * reason. Failure results in a fallback to software rendering.
- */
- Bool (*prepare_solid) (PixmapPtr pPixmap,
- int alu,
- Pixel planemask,
- Pixel fg);
-
- /**
- * solid() performs a solid fill set up in the last prepare_solid() call.
- *
- * @param pPixmap destination pixmap
- * @param x1 left coordinate
- * @param y1 top coordinate
- * @param x2 right coordinate
- * @param y2 bottom coordinate
- *
- * Performs the fill set up by the last prepare_solid() call, covering the
- * area from (x1,y1) to (x2,y2) in pPixmap. Note that the coordinates are
- * in the coordinate space of the destination pixmap, so the driver will
- * need to set up the hardware's offset and pitch for the destination
- * coordinates according to the pixmap's offset and pitch within
- * framebuffer.
- *
- * This call is required if prepare_solid() ever succeeds.
- */
- void (*solid) (PixmapPtr pPixmap, int x1, int y1, int x2, int y2);
-
- /**
- * done_solid() finishes a set of solid fills.
- *
- * @param pPixmap destination pixmap.
- *
- * The done_solid() call is called at the end of a series of consecutive
- * solid() calls following a successful prepare_solid(). This allows drivers
- * to finish up emitting drawing commands that were buffered, or clean up
- * state from prepare_solid().
- *
- * This call is required if prepare_solid() ever succeeds.
- */
- void (*done_solid) (PixmapPtr pPixmap);
- /** @} */
-
- /** @name copy
- * @{
- */
- /**
- * prepare_copy() sets up the driver for doing a copy within video
- * memory.
- *
- * @param pSrcPixmap source pixmap
- * @param pDstPixmap destination pixmap
- * @param dx X copy direction
- * @param dy Y copy direction
- * @param alu raster operation
- * @param planemask write mask for the fill
- *
- * This call should set up the driver for doing a series of copies from the
- * the pSrcPixmap to the pDstPixmap. The dx flag will be positive if the
- * hardware should do the copy from the left to the right, and dy will be
- * positive if the copy should be done from the top to the bottom. This
- * is to deal with self-overlapping copies when pSrcPixmap == pDstPixmap.
- * If your hardware can only support blits that are (left to right, top to
- * bottom) or (right to left, bottom to top), then you should set
- * #UXA_TWO_BITBLT_DIRECTIONS, and UXA will break down copy operations to
- * ones that meet those requirements. The alu raster op is one of the GX*
- * graphics functions listed in X.h, and typically maps to a similar
- * single-byte "ROP" setting in all hardware. The planemask controls which
- * bits of the destination should be affected, and will only represent the
- * bits up to the depth of pPixmap.
- *
- * Note that many drivers will need to store some of the data in the driver
- * private record, for sending to the hardware with each drawing command.
- *
- * The prepare_copy() call is required of all drivers, but it may fail for any
- * reason. Failure results in a fallback to software rendering.
- */
- Bool (*prepare_copy) (PixmapPtr pSrcPixmap,
- PixmapPtr pDstPixmap,
- int dx,
- int dy,
- int alu,
- Pixel planemask);
-
- /**
- * copy() performs a copy set up in the last prepare_copy call.
- *
- * @param pDstPixmap destination pixmap
- * @param srcX source X coordinate
- * @param srcY source Y coordinate
- * @param dstX destination X coordinate
- * @param dstY destination Y coordinate
- * @param width width of the rectangle to be copied
- * @param height height of the rectangle to be copied.
- *
- * Performs the copy set up by the last prepare_copy() call, copying the
- * rectangle from (srcX, srcY) to (srcX + width, srcY + width) in the source
- * pixmap to the same-sized rectangle at (dstX, dstY) in the destination
- * pixmap. Those rectangles may overlap in memory, if
- * pSrcPixmap == pDstPixmap. Note that this call does not receive the
- * pSrcPixmap as an argument -- if it's needed in this function, it should
- * be stored in the driver private during prepare_copy(). As with solid(),
- * the coordinates are in the coordinate space of each pixmap, so the driver
- * will need to set up source and destination pitches and offsets from those
- * pixmaps, probably using uxaGetPixmapOffset() and uxa_get_pixmap_pitch().
- *
- * This call is required if prepare_copy ever succeeds.
- */
- void (*copy) (PixmapPtr pDstPixmap,
- int srcX,
- int srcY,
- int dstX,
- int dstY,
- int width,
- int height);
-
- /**
- * done_copy() finishes a set of copies.
- *
- * @param pPixmap destination pixmap.
- *
- * The done_copy() call is called at the end of a series of consecutive
- * copy() calls following a successful prepare_copy(). This allows drivers
- * to finish up emitting drawing commands that were buffered, or clean up
- * state from prepare_copy().
- *
- * This call is required if prepare_copy() ever succeeds.
- */
- void (*done_copy) (PixmapPtr pDstPixmap);
- /** @} */
-
- /** @name composite
- * @{
- */
- /**
- * check_composite() checks to see if a composite operation could be
- * accelerated.
- *
- * @param op Render operation
- * @param pSrcPicture source Picture
- * @param pMaskPicture mask picture
- * @param pDstPicture destination Picture
- *
- * The check_composite() call checks if the driver could handle acceleration
- * of op with the given source, mask, and destination pictures. This allows
- * drivers to check source and destination formats, supported operations,
- * transformations, and component alpha state, and send operations it can't
- * support to software rendering early on.
- *
- * See prepare_composite() for more details on likely issues that drivers
- * will have in accelerating composite operations.
- *
- * The check_composite() call is recommended if prepare_composite() is
- * implemented, but is not required.
- */
- Bool (*check_composite) (int op,
- PicturePtr pSrcPicture,
- PicturePtr pMaskPicture,
- PicturePtr pDstPicture);
-
- /**
- * prepare_composite() sets up the driver for doing a composite operation
- * described in the Render extension protocol spec.
- *
- * @param op Render operation
- * @param pSrcPicture source Picture
- * @param pMaskPicture mask picture
- * @param pDstPicture destination Picture
- * @param pSrc source pixmap
- * @param pMask mask pixmap
- * @param pDst destination pixmap
- *
- * This call should set up the driver for doing a series of composite
- * operations, as described in the Render protocol spec, with the given
- * pSrcPicture, pMaskPicture, and pDstPicture. The pSrc, pMask, and
- * pDst are the pixmaps containing the pixel data, and should be used for
- * setting the offset and pitch used for the coordinate spaces for each of
- * the Pictures.
- *
- * Notes on interpreting Picture structures:
- * - The Picture structures will always have a valid pDrawable.
- * - The Picture structures will never have alphaMap set.
- * - The mask Picture (and therefore pMask) may be NULL, in which case the
- * operation is simply src OP dst instead of src IN mask OP dst, and
- * mask coordinates should be ignored.
- * - pMarkPicture may have componentAlpha set, which greatly changes
- * the behavior of the composite operation. componentAlpha has no effect
- * when set on pSrcPicture or pDstPicture.
- * - The source and mask Pictures may have a transformation set
- * (Picture->transform != NULL), which means that the source coordinates
- * should be transformed by that transformation, resulting in scaling,
- * rotation, etc. The PictureTransformPoint() call can transform
- * coordinates for you. Transforms have no effect on Pictures when used
- * as a destination.
- * - The source and mask pictures may have a filter set. PictFilterNearest
- * and PictFilterBilinear are defined in the Render protocol, but others
- * may be encountered, and must be handled correctly (usually by
- * prepare_composite failing, and falling back to software). Filters have
- * no effect on Pictures when used as a destination.
- * - The source and mask Pictures may have repeating set, which must be
- * respected. Many chipsets will be unable to support repeating on
- * pixmaps that have a width or height that is not a power of two.
- *
- * If your hardware can't support source pictures (textures) with
- * non-power-of-two pitches, you should set #UXA_OFFSCREEN_ALIGN_POT.
- *
- * Note that many drivers will need to store some of the data in the driver
- * private record, for sending to the hardware with each drawing command.
- *
- * The prepare_composite() call is not required. However, it is highly
- * recommended for performance of antialiased font rendering and performance
- * of cairo applications. Failure results in a fallback to software
- * rendering.
- */
- Bool (*prepare_composite) (int op,
- PicturePtr pSrcPicture,
- PicturePtr pMaskPicture,
- PicturePtr pDstPicture,
- PixmapPtr pSrc,
- PixmapPtr pMask,
- PixmapPtr pDst);
-
- /**
- * composite() performs a composite operation set up in the last
- * prepare_composite() call.
- *
- * @param pDstPixmap destination pixmap
- * @param srcX source X coordinate
- * @param srcY source Y coordinate
- * @param maskX source X coordinate
- * @param maskY source Y coordinate
- * @param dstX destination X coordinate
- * @param dstY destination Y coordinate
- * @param width destination rectangle width
- * @param height destination rectangle height
- *
- * Performs the composite operation set up by the last prepare_composite()
- * call, to the rectangle from (dstX, dstY) to (dstX + width, dstY + height)
- * in the destination Pixmap. Note that if a transformation was set on
- * the source or mask Pictures, the source rectangles may not be the same
- * size as the destination rectangles and filtering. Getting the coordinate
- * transformation right at the subpixel level can be tricky, and rendercheck
- * can test this for you.
- *
- * This call is required if prepare_composite() ever succeeds.
- */
- void (*composite) (PixmapPtr pDst,
- int srcX,
- int srcY,
- int maskX,
- int maskY,
- int dstX,
- int dstY,
- int width,
- int height);
-
- /**
- * done_composite() finishes a set of composite operations.
- *
- * @param pPixmap destination pixmap.
- *
- * The done_composite() call is called at the end of a series of consecutive
- * composite() calls following a successful prepare_composite(). This allows
- * drivers to finish up emitting drawing commands that were buffered, or
- * clean up state from prepare_composite().
- *
- * This call is required if prepare_composite() ever succeeds.
- */
- void (*done_composite) (PixmapPtr pDst);
- /** @} */
-
- /**
- * put_image() loads a rectangle of data from src into pDst.
- *
- * @param pDst destination pixmap
- * @param x destination X coordinate.
- * @param y destination Y coordinate
- * @param width width of the rectangle to be copied
- * @param height height of the rectangle to be copied
- * @param src pointer to the beginning of the source data
- * @param src_pitch pitch (in bytes) of the lines of source data.
- *
- * put_image() copies data in system memory beginning at src (with
- * pitch src_pitch) into the destination pixmap from (x, y) to
- * (x + width, y + height). This is typically done with hostdata uploads,
- * where the CPU sets up a blit command on the hardware with instructions
- * that the blit data will be fed through some sort of aperture on the card.
- *
- * put_image() is most important for the performance of uxa_glyphs()
- * (antialiased font drawing) by allowing pipelining of data uploads,
- * avoiding a sync of the card after each glyph.
- *
- * @return TRUE if the driver successfully uploaded the data. FALSE
- * indicates that UXA should fall back to doing the upload in software.
- *
- * put_image() is not required, but is recommended if composite
- * acceleration is supported.
- */
- Bool (*put_image) (PixmapPtr pDst,
- int x,
- int y,
- int w,
- int h,
- char *src,
- int src_pitch);
-
- /**
- * get_image() loads a rectangle of data from pSrc into dst
- *
- * @param pSrc source pixmap
- * @param x source X coordinate.
- * @param y source Y coordinate
- * @param width width of the rectangle to be copied
- * @param height height of the rectangle to be copied
- * @param dst pointer to the beginning of the destination data
- * @param dst_pitch pitch (in bytes) of the lines of destination data.
- *
- * get_image() copies data from offscreen memory in pSrc from
- * (x, y) to (x + width, y + height), to system memory starting at
- * dst (with pitch dst_pitch). This would usually be done
- * using scatter-gather DMA, supported by a DRM call, or by blitting to AGP
- * and then synchronously reading from AGP. Because the implementation
- * might be synchronous, UXA leaves it up to the driver to call
- * uxa_mark_sync() if get_image() was asynchronous. This is in
- * contrast to most other acceleration calls in UXA.
- *
- * @return TRUE if the driver successfully downloaded the data. FALSE
- * indicates that UXA should fall back to doing the download in software.
- *
- * get_image() is not required, but is highly recommended.
- */
- Bool (*get_image)(PixmapPtr pSrc,
- int x, int y,
- int w, int h,
- char *dst, int dst_pitch);
-
- /** @{ */
- /**
- * prepare_access() is called before CPU access to an offscreen pixmap.
- *
- * @param pPix the pixmap being accessed
- * @param index the index of the pixmap being accessed.
- *
- * prepare_access() will be called before CPU access to an offscreen pixmap.
- * This can be used to set up hardware surfaces for byteswapping or
- * untiling, or to adjust the pixmap's devPrivate.ptr for the purpose of
- * making CPU access use a different aperture.
- *
- * The index is one of #UXA_PREPARE_DEST, #UXA_PREPARE_SRC, or
- * #UXA_PREPARE_MASK, indicating which pixmap is in question. Since only up
- * to three pixmaps will have prepare_access() called on them per operation,
- * drivers can have a small, statically-allocated space to maintain state
- * for prepare_access() and finish_access() in. Note that the same pixmap may
- * have prepare_access() called on it more than once, for uxample when doing
- * a copy within the same pixmap (so it gets prepare_access as()
- * #UXA_PREPARE_DEST and then as #UXA_PREPARE_SRC).
- *
- * prepare_access() may fail. An uxample might be the case of hardware that
- * can set up 1 or 2 surfaces for CPU access, but not 3. If prepare_access()
- * fails, UXA will migrate the pixmap to system memory.
- * get_image() must be implemented and must not fail if a driver
- * wishes to fail in prepare_access(). prepare_access() must not fail when
- * pPix is the visible screen, because the visible screen can not be
- * migrated.
- *
- * @return TRUE if prepare_access() successfully prepared the pixmap for CPU
- * drawing.
- * @return FALSE if prepare_access() is unsuccessful and UXA should use
- * get_image() to migate the pixmap out.
- */
- Bool (*prepare_access)(PixmapPtr pPix, uxa_access_t access);
-
- /**
- * finish_access() is called after CPU access to an offscreen pixmap.
- *
- * @param pPix the pixmap being accessed
- * @param index the index of the pixmap being accessed.
- *
- * finish_access() will be called after finishing CPU access of an offscreen
- * pixmap set up by prepare_access(). Note that the finish_access() will not be
- * called if prepare_access() failed.
- */
- void (*finish_access)(PixmapPtr pPix);
-
- /**
- * PixmapIsOffscreen() is an optional driver replacement to
- * uxa_pixmap_is_offscreen(). Set to NULL if you want the standard behaviour
- * of uxa_pixmap_is_offscreen().
- *
- * @param pPix the pixmap
- * @return TRUE if the given drawable is in framebuffer memory.
- *
- * uxa_pixmap_is_offscreen() is used to determine if a pixmap is in offscreen
- * memory, meaning that acceleration could probably be done to it, and that it
- * will need to be wrapped by prepare_access()/finish_access() when accessing it
- * with the CPU.
- *
- *
- */
- Bool (*pixmap_is_offscreen)(PixmapPtr pPix);
-
- /** @} */
+ /**
+ * uxa_major and uxa_minor should be set by the driver to the version of
+ * UXA which the driver was compiled for (or configures itself at
+ * runtime to support). This allows UXA to extend the structure for
+ * new features without breaking ABI for drivers compiled against
+ * older versions.
+ */
+ int uxa_major, uxa_minor;
+
+ /**
+ * The flags field is bitfield of boolean values controlling UXA's
+ * behavior.
+ *
+ * The flags include UXA_TWO_BITBLT_DIRECTIONS.
+ */
+ int flags;
+
+ /** @name solid
+ * @{
+ */
+ /**
+ * prepare_solid() sets up the driver for doing a solid fill.
+ * @param pPixmap Destination pixmap
+ * @param alu raster operation
+ * @param planemask write mask for the fill
+ * @param fg "foreground" color for the fill
+ *
+ * This call should set up the driver for doing a series of solid fills
+ * through the solid() call. The alu raster op is one of the GX*
+ * graphics functions listed in X.h, and typically maps to a similar
+ * single-byte "ROP" setting in all hardware. The planemask controls
+ * which bits of the destination should be affected, and will only
+ * represent the bits up to the depth of pPixmap. The fg is the pixel
+ * value of the foreground color referred to in ROP descriptions.
+ *
+ * Note that many drivers will need to store some of the data in the
+ * driver private record, for sending to the hardware with each
+ * drawing command.
+ *
+ * The prepare_solid() call is required of all drivers, but it may fail
+ * for any reason. Failure results in a fallback to software rendering.
+ */
+ Bool(*prepare_solid) (PixmapPtr pPixmap,
+ int alu, Pixel planemask, Pixel fg);
+
+ /**
+ * solid() performs a solid fill set up in the last prepare_solid()
+ * call.
+ *
+ * @param pPixmap destination pixmap
+ * @param x1 left coordinate
+ * @param y1 top coordinate
+ * @param x2 right coordinate
+ * @param y2 bottom coordinate
+ *
+ * Performs the fill set up by the last prepare_solid() call,
+ * covering the area from (x1,y1) to (x2,y2) in pPixmap. Note that
+ * the coordinates are in the coordinate space of the destination
+ * pixmap, so the driver will need to set up the hardware's offset
+ * and pitch for the destination coordinates according to the pixmap's
+ * offset and pitch within framebuffer.
+ *
+ * This call is required if prepare_solid() ever succeeds.
+ */
+ void (*solid) (PixmapPtr pPixmap, int x1, int y1, int x2, int y2);
+
+ /**
+ * done_solid() finishes a set of solid fills.
+ *
+ * @param pPixmap destination pixmap.
+ *
+ * The done_solid() call is called at the end of a series of consecutive
+ * solid() calls following a successful prepare_solid(). This allows
+ * drivers to finish up emitting drawing commands that were buffered, or
+ * clean up state from prepare_solid().
+ *
+ * This call is required if prepare_solid() ever succeeds.
+ */
+ void (*done_solid) (PixmapPtr pPixmap);
+ /** @} */
+
+ /** @name copy
+ * @{
+ */
+ /**
+ * prepare_copy() sets up the driver for doing a copy within video
+ * memory.
+ - *
+ * @param pSrcPixmap source pixmap
+ * @param pDstPixmap destination pixmap
+ * @param dx X copy direction
+ * @param dy Y copy direction
+ * @param alu raster operation
+ * @param planemask write mask for the fill
+ *
+ * This call should set up the driver for doing a series of copies
+ * from the pSrcPixmap to the pDstPixmap. The dx flag will be
+ * positive if the
+ * hardware should do the copy from the left to the right, and dy will
+ * be positive if the copy should be done from the top to the bottom.
+ * This is to deal with self-overlapping copies when
+ * pSrcPixmap == pDstPixmap.
+ *
+ * If your hardware can only support blits that are (left to right,
+ * top to bottom) or (right to left, bottom to top), then you should
+ * set #UXA_TWO_BITBLT_DIRECTIONS, and UXA will break down copy
+ * operations to ones that meet those requirements. The alu raster
+ * op is one of the GX* graphics functions listed in X.h, and
+ * typically maps to a similar single-byte "ROP" setting in all
+ * hardware. The planemask controls which bits of the destination
+ * should be affected, and will only represent the bits up to the
+ * depth of pPixmap.
+ *
+ * Note that many drivers will need to store some of the data in the
+ * driver private record, for sending to the hardware with each
+ * drawing command.
+ *
+ * The prepare_copy() call is required of all drivers, but it may fail
+ * for any reason. Failure results in a fallback to software rendering.
+ */
+ Bool(*prepare_copy) (PixmapPtr pSrcPixmap,
+ PixmapPtr pDstPixmap,
+ int dx, int dy, int alu, Pixel planemask);
+
+ /**
+ * copy() performs a copy set up in the last prepare_copy call.
+ *
+ * @param pDstPixmap destination pixmap
+ * @param srcX source X coordinate
+ * @param srcY source Y coordinate
+ * @param dstX destination X coordinate
+ * @param dstY destination Y coordinate
+ * @param width width of the rectangle to be copied
+ * @param height height of the rectangle to be copied.
+ *
+ * Performs the copy set up by the last prepare_copy() call, copying the
+ * rectangle from (srcX, srcY) to (srcX + width, srcY + width) in the
+ * source pixmap to the same-sized rectangle at (dstX, dstY) in the
+ * destination pixmap. Those rectangles may overlap in memory, if
+ * pSrcPixmap == pDstPixmap. Note that this call does not receive the
+ * pSrcPixmap as an argument -- if it's needed in this function, it
+ * should be stored in the driver private during prepare_copy(). As
+ * with solid(), the coordinates are in the coordinate space of each
+ * pixmap, so the driver will need to set up source and destination
+ * pitches and offsets from those pixmaps, probably using
+ * uxaGetPixmapOffset() and uxa_get_pixmap_pitch().
+ *
+ * This call is required if prepare_copy ever succeeds.
+ */
+ void (*copy) (PixmapPtr pDstPixmap,
+ int srcX,
+ int srcY, int dstX, int dstY, int width, int height);
+
+ /**
+ * done_copy() finishes a set of copies.
+ *
+ * @param pPixmap destination pixmap.
+ *
+ * The done_copy() call is called at the end of a series of consecutive
+ * copy() calls following a successful prepare_copy(). This allows
+ * drivers to finish up emitting drawing commands that were buffered,
+ * or clean up state from prepare_copy().
+ *
+ * This call is required if prepare_copy() ever succeeds.
+ */
+ void (*done_copy) (PixmapPtr pDstPixmap);
+ /** @} */
+
+ /** @name composite
+ * @{
+ */
+ /**
+ * check_composite() checks to see if a composite operation could be
+ * accelerated.
+ *
+ * @param op Render operation
+ * @param pSrcPicture source Picture
+ * @param pMaskPicture mask picture
+ * @param pDstPicture destination Picture
+ *
+ * The check_composite() call checks if the driver could handle
+ * acceleration of op with the given source, mask, and destination
+ * pictures. This allows drivers to check source and destination
+ * formats, supported operations, transformations, and component
+ * alpha state, and send operations it can't support to software
+ * rendering early on.
+ *
+ * See prepare_composite() for more details on likely issues that
+ * drivers will have in accelerating composite operations.
+ *
+ * The check_composite() call is recommended if prepare_composite() is
+ * implemented, but is not required.
+ */
+ Bool(*check_composite) (int op,
+ PicturePtr pSrcPicture,
+ PicturePtr pMaskPicture,
+ PicturePtr pDstPicture);
+
+ /**
+ * prepare_composite() sets up the driver for doing a composite
+ * operation described in the Render extension protocol spec.
+ *
+ * @param op Render operation
+ * @param pSrcPicture source Picture
+ * @param pMaskPicture mask picture
+ * @param pDstPicture destination Picture
+ * @param pSrc source pixmap
+ * @param pMask mask pixmap
+ * @param pDst destination pixmap
+ *
+ * This call should set up the driver for doing a series of composite
+ * operations, as described in the Render protocol spec, with the given
+ * pSrcPicture, pMaskPicture, and pDstPicture. The pSrc, pMask, and
+ * pDst are the pixmaps containing the pixel data, and should be used
+ * for setting the offset and pitch used for the coordinate spaces for
+ * each of the Pictures.
+ *
+ * Notes on interpreting Picture structures:
+ * - The Picture structures will always have a valid pDrawable.
+ * - The Picture structures will never have alphaMap set.
+ * - The mask Picture (and therefore pMask) may be NULL, in which case
+ * the operation is simply src OP dst instead of src IN mask OP dst,
+ * and mask coordinates should be ignored.
+ * - pMarkPicture may have componentAlpha set, which greatly changes
+ * the behavior of the composite operation. componentAlpha has no
+ * effect when set on pSrcPicture or pDstPicture.
+ * - The source and mask Pictures may have a transformation set
+ * (Picture->transform != NULL), which means that the source
+ * coordinates should be transformed by that transformation,
+ * resulting in scaling, rotation, etc. The PictureTransformPoint()
+ * call can transform coordinates for you. Transforms have no
+ * effect on Pictures when used as a destination.
+ * - The source and mask pictures may have a filter set.
+ * PictFilterNearest and PictFilterBilinear are defined in the
+ * Render protocol, but others may be encountered, and must be
+ * handled correctly (usually by prepare_composite failing, and
+ * falling back to software). Filters have
+ * no effect on Pictures when used as a destination.
+ * - The source and mask Pictures may have repeating set, which must be
+ * respected. Many chipsets will be unable to support repeating on
+ * pixmaps that have a width or height that is not a power of two.
+ *
+ * If your hardware can't support source pictures (textures) with
+ * non-power-of-two pitches, you should set #UXA_OFFSCREEN_ALIGN_POT.
+ *
+ * Note that many drivers will need to store some of the data in the
+ * driver private record, for sending to the hardware with each
+ * drawing command.
+ *
+ * The prepare_composite() call is not required. However, it is highly
+ * recommended for performance of antialiased font rendering and
+ * performance of cairo applications. Failure results in a fallback
+ * to software rendering.
+ */
+ Bool(*prepare_composite) (int op,
+ PicturePtr pSrcPicture,
+ PicturePtr pMaskPicture,
+ PicturePtr pDstPicture,
+ PixmapPtr pSrc,
+ PixmapPtr pMask, PixmapPtr pDst);
+
+ /**
+ * composite() performs a composite operation set up in the last
+ * prepare_composite() call.
+ *
+ * @param pDstPixmap destination pixmap
+ * @param srcX source X coordinate
+ * @param srcY source Y coordinate
+ * @param maskX source X coordinate
+ * @param maskY source Y coordinate
+ * @param dstX destination X coordinate
+ * @param dstY destination Y coordinate
+ * @param width destination rectangle width
+ * @param height destination rectangle height
+ *
+ * Performs the composite operation set up by the last
+ * prepare_composite() call, to the rectangle from (dstX, dstY) to
+ * (dstX + width, dstY + height) in the destination Pixmap. Note that
+ * if a transformation was set on the source or mask Pictures, the
+ * source rectangles may not be the same size as the destination
+ * rectangles and filtering. Getting the coordinate transformation
+ * right at the subpixel level can be tricky, and rendercheck
+ * can test this for you.
+ *
+ * This call is required if prepare_composite() ever succeeds.
+ */
+ void (*composite) (PixmapPtr pDst,
+ int srcX,
+ int srcY,
+ int maskX,
+ int maskY,
+ int dstX, int dstY, int width, int height);
+
+ /**
+ * done_composite() finishes a set of composite operations.
+ *
+ * @param pPixmap destination pixmap.
+ *
+ * The done_composite() call is called at the end of a series of
+ * consecutive composite() calls following a successful
+ * prepare_composite(). This allows drivers to finish up emitting
+ * drawing commands that were buffered, or clean up state from
+ * prepare_composite().
+ *
+ * This call is required if prepare_composite() ever succeeds.
+ */
+ void (*done_composite) (PixmapPtr pDst);
+ /** @} */
+
+ /**
+ * put_image() loads a rectangle of data from src into pDst.
+ *
+ * @param pDst destination pixmap
+ * @param x destination X coordinate.
+ * @param y destination Y coordinate
+ * @param width width of the rectangle to be copied
+ * @param height height of the rectangle to be copied
+ * @param src pointer to the beginning of the source data
+ * @param src_pitch pitch (in bytes) of the lines of source data.
+ *
+ * put_image() copies data in system memory beginning at src (with
+ * pitch src_pitch) into the destination pixmap from (x, y) to
+ * (x + width, y + height). This is typically done with hostdata
+ * uploads, where the CPU sets up a blit command on the hardware with
+ * instructions that the blit data will be fed through some sort of
+ * aperture on the card.
+ *
+ * put_image() is most important for the performance of uxa_glyphs()
+ * (antialiased font drawing) by allowing pipelining of data uploads,
+ * avoiding a sync of the card after each glyph.
+ *
+ * @return TRUE if the driver successfully uploaded the data. FALSE
+ * indicates that UXA should fall back to doing the upload in software.
+ *
+ * put_image() is not required, but is recommended if composite
+ * acceleration is supported.
+ */
+ Bool(*put_image) (PixmapPtr pDst,
+ int x,
+ int y, int w, int h, char *src, int src_pitch);
+
+ /**
+ * get_image() loads a rectangle of data from pSrc into dst
+ *
+ * @param pSrc source pixmap
+ * @param x source X coordinate.
+ * @param y source Y coordinate
+ * @param width width of the rectangle to be copied
+ * @param height height of the rectangle to be copied
+ * @param dst pointer to the beginning of the destination data
+ * @param dst_pitch pitch (in bytes) of the lines of destination data.
+ *
+ * get_image() copies data from offscreen memory in pSrc from
+ * (x, y) to (x + width, y + height), to system memory starting at
+ * dst (with pitch dst_pitch). This would usually be done
+ * using scatter-gather DMA, supported by a DRM call, or by blitting
+ * to AGP and then synchronously reading from AGP.
+ *
+ * @return TRUE if the driver successfully downloaded the data. FALSE
+ * indicates that UXA should fall back to doing the download in
+ * software.
+ *
+ * get_image() is not required, but is highly recommended.
+ */
+ Bool(*get_image) (PixmapPtr pSrc,
+ int x, int y,
+ int w, int h, char *dst, int dst_pitch);
+
+ /** @{ */
+ /**
+ * prepare_access() is called before CPU access to an offscreen pixmap.
+ *
+ * @param pPix the pixmap being accessed
+ * @param index the index of the pixmap being accessed.
+ *
+ * prepare_access() will be called before CPU access to an offscreen
+ * pixmap.
+ *
+ * This can be used to set up hardware surfaces for byteswapping or
+ * untiling, or to adjust the pixmap's devPrivate.ptr for the purpose of
+ * making CPU access use a different aperture.
+ *
+ * The index is one of #UXA_PREPARE_DEST, #UXA_PREPARE_SRC, or
+ * #UXA_PREPARE_MASK, indicating which pixmap is in question. Since
+ * only up to three pixmaps will have prepare_access() called on them
+ * per operation, drivers can have a small, statically-allocated space
+ * to maintain state for prepare_access() and finish_access() in.
+ * Note that the same pixmap may have prepare_access() called on it
+ * more than once, for uxample when doing a copy within the same
+ * pixmap (so it gets prepare_access as
+ * #UXA_PREPARE_DEST and then as #UXA_PREPARE_SRC).
+ *
+ * prepare_access() may fail. An example might be the case of
+ * hardware that can set up 1 or 2 surfaces for CPU access, but not
+ * 3. If prepare_access()
+ * fails, UXA will migrate the pixmap to system memory.
+ * get_image() must be implemented and must not fail if a driver
+ * wishes to fail in prepare_access(). prepare_access() must not
+ * fail when pPix is the visible screen, because the visible screen
+ * can not be migrated.
+ *
+ * @return TRUE if prepare_access() successfully prepared the pixmap
+ * for CPU drawing.
+ * @return FALSE if prepare_access() is unsuccessful and UXA should use
+ * get_image() to migate the pixmap out.
+ */
+ Bool(*prepare_access) (PixmapPtr pPix, uxa_access_t access);
+
+ /**
+ * finish_access() is called after CPU access to an offscreen pixmap.
+ *
+ * @param pPix the pixmap being accessed
+ * @param index the index of the pixmap being accessed.
+ *
+ * finish_access() will be called after finishing CPU access of an
+ * offscreen pixmap set up by prepare_access(). Note that the
+ * finish_access() will not be called if prepare_access() failed.
+ */
+ void (*finish_access) (PixmapPtr pPix);
+
+ /**
+ * PixmapIsOffscreen() is an optional driver replacement to
+ * uxa_pixmap_is_offscreen(). Set to NULL if you want the standard
+ * behaviour of uxa_pixmap_is_offscreen().
+ *
+ * @param pPix the pixmap
+ * @return TRUE if the given drawable is in framebuffer memory.
+ *
+ * uxa_pixmap_is_offscreen() is used to determine if a pixmap is in
+ * offscreen memory, meaning that acceleration could probably be done
+ * to it, and that it will need to be wrapped by
+ * prepare_access()/finish_access() when accessing it with the CPU.
+ */
+ Bool(*pixmap_is_offscreen) (PixmapPtr pPix);
+
+ /** @} */
} uxa_driver_t;
/** @name UXA driver flags
@@ -515,20 +513,15 @@ typedef struct _UxaDriver {
#define UXA_CREATE_PIXMAP_FOR_MAP 0x20000000
/** @} */
-uxa_driver_t *
-uxa_driver_alloc(void);
+uxa_driver_t *uxa_driver_alloc(void);
-Bool
-uxa_driver_init(ScreenPtr screen, uxa_driver_t *uxa_driver);
+Bool uxa_driver_init(ScreenPtr screen, uxa_driver_t * uxa_driver);
-void
-uxa_driver_fini(ScreenPtr pScreen);
+void uxa_driver_fini(ScreenPtr pScreen);
-CARD32
-uxa_get_pixmap_first_pixel (PixmapPtr pPixmap);
+CARD32 uxa_get_pixmap_first_pixel(PixmapPtr pPixmap);
-void
-uxa_set_fallback_debug (ScreenPtr screen, Bool enable);
+void uxa_set_fallback_debug(ScreenPtr screen, Bool enable);
/**
* Returns TRUE if the given planemask covers all the significant bits in the