summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Fonseca <jfonseca@vmware.com>2010-02-18 18:11:50 +0000
committerJosé Fonseca <jfonseca@vmware.com>2010-02-18 18:22:30 +0000
commit770945cff48bef2d0552aba39ee0fd7b8740dc14 (patch)
tree0a9127425853562fd613e416edc5745ad264e61d
parenteaa4066bfc4b6f5c1cbfb2f894ec0d6525695035 (diff)
svga: Temporarily create a sw vertex buf when failed to create a hw buf.
Many apps don't check the return of map buffer so it is better not to fail.
-rw-r--r--src/gallium/drivers/svga/svga_screen_buffer.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/gallium/drivers/svga/svga_screen_buffer.c b/src/gallium/drivers/svga/svga_screen_buffer.c
index cb4de42f508..a4db1d91acc 100644
--- a/src/gallium/drivers/svga/svga_screen_buffer.c
+++ b/src/gallium/drivers/svga/svga_screen_buffer.c
@@ -409,18 +409,31 @@ svga_buffer_map_range( struct pipe_screen *screen,
struct svga_buffer *sbuf = svga_buffer( buf );
void *map;
- if(sbuf->swbuf) {
+ if (!sbuf->swbuf && !sbuf->hw.buf) {
+ if (svga_buffer_create_hw_storage(ss, sbuf) != PIPE_OK) {
+ /*
+ * We can't create a hardware buffer big enough, so create a malloc
+ * buffer instead.
+ */
+
+ debug_printf("%s: failed to allocate %u KB of DMA, splitting DMA transfers\n",
+ __FUNCTION__,
+ (sbuf->base.size + 1023)/1024);
+
+ sbuf->swbuf = align_malloc(sbuf->base.size, sbuf->base.alignment);
+ }
+ }
+
+ if (sbuf->swbuf) {
/* User/malloc buffer */
map = sbuf->swbuf;
}
- else {
- if(!sbuf->hw.buf) {
- if(svga_buffer_create_hw_storage(ss, sbuf) != PIPE_OK)
- return NULL;
- }
-
+ else if (sbuf->hw.buf) {
map = sws->buffer_map(sws, sbuf->hw.buf, usage);
}
+ else {
+ map = NULL;
+ }
if(map) {
pipe_mutex_lock(ss->swc_mutex);