Changeset 32897 in vbox for trunk/src/VBox/Devices/Graphics
- Timestamp:
- Oct 5, 2010 9:37:12 AM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 66380
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA.cpp
r32877 r32897 828 828 } 829 829 830 #define VBE_PITCH_ALIGN 8 /* Align pitch to 64 bits. */ 831 832 /* Calculate scanline pitch based on bit depth and width in pixels. */ 833 static uint32_t calc_line_pitch(uint16_t bpp, uint16_t width) 834 { 835 uint32_t pitch, aligned_pitch; 836 837 if (bpp <= 4) 838 pitch = width >> 1; 839 else 840 pitch = width * ((bpp + 7) >> 3); 841 842 /* Align the pitch to some sensible value. */ 843 aligned_pitch = (pitch + (VBE_PITCH_ALIGN - 1)) & ~(VBE_PITCH_ALIGN - 1); 844 if (aligned_pitch != pitch) 845 Log(("VBE: Line pitch %d aligned to %d bytes\n", pitch, aligned_pitch)); 846 847 return aligned_pitch; 848 } 849 850 /* Calculate line width in pixels based on bit depth and pitch. */ 851 static uint32_t calc_line_width(uint16_t bpp, uint32_t pitch) 852 { 853 uint32_t width; 854 855 if (bpp <= 4) 856 width = pitch << 1; 857 else 858 width = pitch / ((bpp + 7) >> 3); 859 860 return width; 861 } 862 830 863 static void vbe_ioport_write_index(void *opaque, uint32_t addr, uint32_t val) 831 864 { … … 864 897 break; 865 898 case VBE_DISPI_INDEX_XRES: 866 if ( (val <= VBE_DISPI_MAX_XRES) && ((val & 7) == 0)) {899 if (val <= VBE_DISPI_MAX_XRES) { 867 900 s->vbe_regs[s->vbe_index] = val; 868 901 #ifdef KEEP_SCAN_LINE_LENGTH 869 if (s->vbe_regs[VBE_DISPI_INDEX_BPP] == 4) 870 s->vbe_line_offset = val >> 1; 871 else 872 s->vbe_line_offset = val * ((s->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3); 902 s->vbe_line_offset = calc_line_pitch(s->vbe_regs[VBE_DISPI_INDEX_BPP], val); 873 903 /* XXX: support weird bochs semantics ? */ 874 s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = val;904 s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = calc_line_width(s->vbe_regs[VBE_DISPI_INDEX_BPP], s->vbe_line_offset); 875 905 s->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] = 0; 876 906 s->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] = 0; … … 897 927 s->vbe_regs[s->vbe_index] = val; 898 928 #ifdef KEEP_SCAN_LINE_LENGTH 899 if (val == 4) 900 s->vbe_line_offset = s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 1; 901 else 902 s->vbe_line_offset = s->vbe_regs[VBE_DISPI_INDEX_XRES] * ((val + 7) >> 3); 929 s->vbe_line_offset = calc_line_pitch(val, s->vbe_regs[VBE_DISPI_INDEX_XRES]); 903 930 /* XXX: support weird bochs semantics ? */ 904 s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = val;931 s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = calc_line_width(val, s->vbe_line_offset); 905 932 s->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] = 0; 906 933 s->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] = 0; … … 973 1000 s->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] = 0; 974 1001 975 if (s->vbe_regs[VBE_DISPI_INDEX_BPP] == 4) 976 s->vbe_line_offset = s->vbe_regs[VBE_DISPI_INDEX_XRES] >> 1; 977 else 978 s->vbe_line_offset = s->vbe_regs[VBE_DISPI_INDEX_XRES] * 979 ((s->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3); 1002 s->vbe_line_offset = calc_line_pitch(s->vbe_regs[VBE_DISPI_INDEX_BPP], 1003 s->vbe_regs[VBE_DISPI_INDEX_XRES]); 980 1004 s->vbe_start_addr = 0; 981 1005 #endif /* KEEP_SCAN_LINE_LENGTH not defined */ … … 1065 1089 return VINF_SUCCESS; 1066 1090 w = val; 1067 if (s->vbe_regs[VBE_DISPI_INDEX_BPP] == 4) 1068 line_offset = w >> 1; 1069 else 1070 line_offset = w * ((s->vbe_regs[VBE_DISPI_INDEX_BPP] + 7) >> 3); 1091 line_offset = calc_line_pitch(s->vbe_regs[VBE_DISPI_INDEX_BPP], w); 1071 1092 h = s->vram_size / line_offset; 1072 1093 /* XXX: support weird bochs semantics ? */ … … 6121 6142 uint32_t cCustomModes; 6122 6143 uint32_t cyReduction; 6144 uint32_t cbPitch; 6145 int nPages; 6123 6146 PVBEHEADER pVBEDataHdr; 6124 6147 ModeInfoListItem *pCurMode; … … 6589 6612 return VERR_VGA_INVALID_CUSTOM_MODE; 6590 6613 } 6591 /* Round up the X resolution to a multiple of eight. */ 6592 cx = (cx + 7) & ~7; 6614 cbPitch = calc_line_pitch(cBits, cx); 6593 6615 # ifdef VRAM_SIZE_FIX 6594 if (c x * cy * cBits / 8>= pThis->vram_size)6616 if (cy * cbPitch >= pThis->vram_size) 6595 6617 { 6596 6618 AssertMsgFailed(("Configuration error: custom video mode %dx%dx%dbits is too large for the virtual video memory of %dMb. Please increase the video memory size.\n", … … 6630 6652 6631 6653 /* adjust defaults */ 6654 /* The "number of image pages" is really the max page index... */ 6655 nPages = pThis->vram_size / (cy * cbPitch) - 1; 6656 Assert(nPages); 6657 if (nPages > 255) 6658 nPages = 255; /* 8-bit value. */ 6632 6659 pCurMode->info.XResolution = cx; 6633 6660 pCurMode->info.YResolution = cy; 6634 6635 switch (cBits) 6636 { 6637 case 16: 6638 pCurMode->info.BytesPerScanLine = cx * 2; 6639 pCurMode->info.LinBytesPerScanLine = cx * 2; 6640 break; 6641 6642 case 24: 6643 pCurMode->info.BytesPerScanLine = cx * 3; 6644 pCurMode->info.LinBytesPerScanLine = cx * 3; 6645 break; 6646 6647 case 32: 6648 pCurMode->info.BytesPerScanLine = cx * 4; 6649 pCurMode->info.LinBytesPerScanLine = cx * 4; 6650 break; 6651 } 6661 pCurMode->info.BytesPerScanLine = cbPitch; 6662 pCurMode->info.LinBytesPerScanLine = cbPitch; 6663 pCurMode->info.NumberOfImagePages = nPages; 6664 pCurMode->info.LinNumberOfPages = nPages; 6652 6665 6653 6666 /* commit it */
Note:
See TracChangeset
for help on using the changeset viewer.