Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / gallium / drivers / svga / svga_screen.c
1 /**********************************************************
2  * Copyright 2008-2009 VMware, Inc.  All rights reserved.
3  *
4  * Permission is hereby granted, free of charge, to any person
5  * obtaining a copy of this software and associated documentation
6  * files (the "Software"), to deal in the Software without
7  * restriction, including without limitation the rights to use, copy,
8  * modify, merge, publish, distribute, sublicense, and/or sell copies
9  * of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  *
24  **********************************************************/
25
26 #include "util/u_memory.h"
27 #include "util/u_inlines.h"
28 #include "util/u_string.h"
29 #include "util/u_math.h"
30
31 #include "svga_winsys.h"
32 #include "svga_public.h"
33 #include "svga_context.h"
34 #include "svga_screen.h"
35 #include "svga_resource_texture.h"
36 #include "svga_resource.h"
37 #include "svga_debug.h"
38
39 #include "svga3d_shaderdefs.h"
40
41
42 #ifdef DEBUG
43 int SVGA_DEBUG = 0;
44
45 static const struct debug_named_value svga_debug_flags[] = {
46    { "dma",      DEBUG_DMA, NULL },
47    { "tgsi",     DEBUG_TGSI, NULL },
48    { "pipe",     DEBUG_PIPE, NULL },
49    { "state",    DEBUG_STATE, NULL },
50    { "screen",   DEBUG_SCREEN, NULL },
51    { "tex",      DEBUG_TEX, NULL },
52    { "swtnl",    DEBUG_SWTNL, NULL },
53    { "const",    DEBUG_CONSTS, NULL },
54    { "viewport", DEBUG_VIEWPORT, NULL },
55    { "views",    DEBUG_VIEWS, NULL },
56    { "perf",     DEBUG_PERF, NULL },
57    { "flush",    DEBUG_FLUSH, NULL },
58    { "sync",     DEBUG_SYNC, NULL },
59    { "cache",    DEBUG_CACHE, NULL },
60    DEBUG_NAMED_VALUE_END
61 };
62 #endif
63
64 static const char *
65 svga_get_vendor( struct pipe_screen *pscreen )
66 {
67    return "VMware, Inc.";
68 }
69
70
71 static const char *
72 svga_get_name( struct pipe_screen *pscreen )
73 {
74 #ifdef DEBUG
75    /* Only return internal details in the DEBUG version:
76     */
77    return "SVGA3D; build: DEBUG; mutex: " PIPE_ATOMIC;
78 #else
79    return "SVGA3D; build: RELEASE; ";
80 #endif
81 }
82
83
84
85
86 static float
87 svga_get_paramf(struct pipe_screen *screen, enum pipe_cap param)
88 {
89    struct svga_screen *svgascreen = svga_screen(screen);
90    struct svga_winsys_screen *sws = svgascreen->sws;
91    SVGA3dDevCapResult result;
92
93    switch (param) {
94    case PIPE_CAP_MAX_LINE_WIDTH:
95       /* fall-through */
96    case PIPE_CAP_MAX_LINE_WIDTH_AA:
97       return 7.0;
98
99    case PIPE_CAP_MAX_POINT_WIDTH:
100       /* fall-through */
101    case PIPE_CAP_MAX_POINT_WIDTH_AA:
102       /* Keep this to a reasonable size to avoid failures in
103        * conform/pntaa.c:
104        */
105       return SVGA_MAX_POINTSIZE;
106
107    case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
108       if(!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_ANISOTROPY, &result))
109          return 4.0;
110       return result.u;
111
112    case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
113       return 16.0;
114
115    case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
116       return 16;
117    case PIPE_CAP_MAX_COMBINED_SAMPLERS:
118       return 16;
119    case PIPE_CAP_NPOT_TEXTURES:
120       return 1;
121    case PIPE_CAP_TWO_SIDED_STENCIL:
122       return 1;
123    case PIPE_CAP_GLSL:
124       return svgascreen->use_ps30 && svgascreen->use_vs30;
125    case PIPE_CAP_ANISOTROPIC_FILTER:
126       return 1;
127    case PIPE_CAP_POINT_SPRITE:
128       return 1;
129    case PIPE_CAP_MAX_RENDER_TARGETS:
130       if(!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_RENDER_TARGETS, &result))
131          return 1;
132       if(!result.u)
133          return 1;
134       return MIN2(result.u, PIPE_MAX_COLOR_BUFS);
135    case PIPE_CAP_OCCLUSION_QUERY:
136       return 1;
137    case PIPE_CAP_TIMER_QUERY:
138       return 0;
139    case PIPE_CAP_TEXTURE_SHADOW_MAP:
140       return 1;
141
142    case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
143       {
144          unsigned levels = SVGA_MAX_TEXTURE_LEVELS;
145          if (sws->get_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_WIDTH, &result))
146             levels = MIN2(util_logbase2(result.u) + 1, levels);
147          else
148             levels = 12 /* 2048x2048 */;
149          if (sws->get_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_HEIGHT, &result))
150             levels = MIN2(util_logbase2(result.u) + 1, levels);
151          else
152             levels = 12 /* 2048x2048 */;
153          return levels;
154       }
155
156    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
157       if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_VOLUME_EXTENT, &result))
158          return 8;  /* max 128x128x128 */
159       return MIN2(util_logbase2(result.u) + 1, SVGA_MAX_TEXTURE_LEVELS);
160
161    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
162       /*
163        * No mechanism to query the host, and at least limited to 2048x2048 on
164        * certain hardware.
165        */
166       return MIN2(screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
167                   12.0 /* 2048x2048 */);
168
169    case PIPE_CAP_TEXTURE_MIRROR_REPEAT: /* req. for GL 1.4 */
170       return 1;
171
172    case PIPE_CAP_BLEND_EQUATION_SEPARATE: /* req. for GL 1.5 */
173       return 1;
174
175    case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
176    case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
177       return 1;
178    case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
179    case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
180       return 0;
181
182    case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE:
183       return 1;
184    case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
185       return 0;
186
187    default:
188       return 0;
189    }
190 }
191
192
193 /* This is a fairly pointless interface
194  */
195 static int
196 svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
197 {
198    return (int) svga_get_paramf( screen, param );
199 }
200
201 static int svga_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param)
202 {
203    struct svga_screen *svgascreen = svga_screen(screen);
204    struct svga_winsys_screen *sws = svgascreen->sws;
205    SVGA3dDevCapResult result;
206
207    switch (shader)
208    {
209    case PIPE_SHADER_FRAGMENT:
210       switch (param)
211       {
212       case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
213       case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
214       case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
215       case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
216          return svgascreen->use_ps30 ? 512 : 96;
217       case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
218          return SVGA3D_MAX_NESTING_LEVEL;
219       case PIPE_SHADER_CAP_MAX_INPUTS:
220          return 10;
221       case PIPE_SHADER_CAP_MAX_CONSTS:
222          return svgascreen->use_ps30 ? 224 : 16;
223       case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
224          return 1;
225       case PIPE_SHADER_CAP_MAX_TEMPS:
226          if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_FRAGMENT_SHADER_TEMPS, &result))
227             return svgascreen->use_ps30 ? 32 : 12;
228          return result.u;
229       case PIPE_SHADER_CAP_MAX_ADDRS:
230       case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
231          /* 
232           * Although PS 3.0 has some addressing abilities it can only represent
233           * loops that can be statically determined and unrolled. Given we can
234           * only handle a subset of the cases that the state tracker already
235           * does it is better to defer loop unrolling to the state tracker.
236           */
237          return 0;
238       case PIPE_SHADER_CAP_MAX_PREDS:
239          return svgascreen->use_ps30 ? 1 : 0;
240       case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
241          return 1;
242       case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
243       case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
244       case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
245          return 0;
246       case PIPE_SHADER_CAP_SUBROUTINES:
247          return 0;
248       }
249       break;
250    case PIPE_SHADER_VERTEX:
251       switch (param)
252       {
253       case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
254       case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
255          if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_INSTRUCTIONS, &result))
256             return svgascreen->use_vs30 ? 512 : 256;
257          return result.u;
258       case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
259       case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
260          /* XXX: until we have vertex texture support */
261          return 0;
262       case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
263          return SVGA3D_MAX_NESTING_LEVEL;
264       case PIPE_SHADER_CAP_MAX_INPUTS:
265          return 16;
266       case PIPE_SHADER_CAP_MAX_CONSTS:
267          return 256;
268       case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
269          return 1;
270       case PIPE_SHADER_CAP_MAX_TEMPS:
271          if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_TEMPS, &result))
272             return svgascreen->use_vs30 ? 32 : 12;
273          return result.u;
274       case PIPE_SHADER_CAP_MAX_ADDRS:
275          return svgascreen->use_vs30 ? 1 : 0;
276       case PIPE_SHADER_CAP_MAX_PREDS:
277          return svgascreen->use_vs30 ? 1 : 0;
278       case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
279          return 1;
280       case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
281       case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
282          return svgascreen->use_vs30 ? 1 : 0;
283       case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
284          return 0;
285       case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
286          return 1;
287       case PIPE_SHADER_CAP_SUBROUTINES:
288          return 0;
289       default:
290          break;
291       }
292       break;
293    default:
294       break;
295    }
296    return 0;
297 }
298
299 static INLINE SVGA3dDevCapIndex
300 svga_translate_format_cap(enum pipe_format format)
301 {
302    switch(format) {
303    
304    case PIPE_FORMAT_B8G8R8A8_UNORM:
305       return SVGA3D_DEVCAP_SURFACEFMT_A8R8G8B8;
306    case PIPE_FORMAT_B8G8R8X8_UNORM:
307       return SVGA3D_DEVCAP_SURFACEFMT_X8R8G8B8;
308
309    case PIPE_FORMAT_B5G6R5_UNORM:
310       return SVGA3D_DEVCAP_SURFACEFMT_R5G6B5;
311    case PIPE_FORMAT_B5G5R5A1_UNORM:
312       return SVGA3D_DEVCAP_SURFACEFMT_A1R5G5B5;
313    case PIPE_FORMAT_B4G4R4A4_UNORM:
314       return SVGA3D_DEVCAP_SURFACEFMT_A4R4G4B4;
315
316    case PIPE_FORMAT_Z16_UNORM:
317       return SVGA3D_DEVCAP_SURFACEFMT_Z_D16;
318    case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
319       return SVGA3D_DEVCAP_SURFACEFMT_Z_D24S8;
320    case PIPE_FORMAT_X8Z24_UNORM:
321       return SVGA3D_DEVCAP_SURFACEFMT_Z_D24X8;
322
323    case PIPE_FORMAT_A8_UNORM:
324       return SVGA3D_DEVCAP_SURFACEFMT_ALPHA8;
325    case PIPE_FORMAT_L8_UNORM:
326       return SVGA3D_DEVCAP_SURFACEFMT_LUMINANCE8;
327
328    case PIPE_FORMAT_DXT1_RGB:
329    case PIPE_FORMAT_DXT1_RGBA:
330       return SVGA3D_DEVCAP_SURFACEFMT_DXT1;
331    case PIPE_FORMAT_DXT3_RGBA:
332       return SVGA3D_DEVCAP_SURFACEFMT_DXT3;
333    case PIPE_FORMAT_DXT5_RGBA:
334       return SVGA3D_DEVCAP_SURFACEFMT_DXT5;
335
336    default:
337       return SVGA3D_DEVCAP_MAX;
338    }
339 }
340
341
342 static boolean
343 svga_is_format_supported( struct pipe_screen *screen,
344                           enum pipe_format format,
345                           enum pipe_texture_target target,
346                           unsigned sample_count,
347                           unsigned tex_usage)
348 {
349    struct svga_winsys_screen *sws = svga_screen(screen)->sws;
350    SVGA3dDevCapIndex index;
351    SVGA3dDevCapResult result;
352
353    assert(tex_usage);
354
355    if (sample_count > 1)
356       return FALSE;
357
358    /* Override host capabilities */
359    if (tex_usage & PIPE_BIND_RENDER_TARGET) {
360       switch(format) { 
361
362       /* Often unsupported/problematic. This means we end up with the same
363        * visuals for all virtual hardware implementations.
364        */
365       case PIPE_FORMAT_B4G4R4A4_UNORM:
366       case PIPE_FORMAT_B5G5R5A1_UNORM:
367          return FALSE;
368          
369       default:
370          break;
371       }
372    }
373    
374    /* Try to query the host */
375    index = svga_translate_format_cap(format);
376    if( index < SVGA3D_DEVCAP_MAX && 
377        sws->get_cap(sws, index, &result) )
378    {
379       SVGA3dSurfaceFormatCaps mask;
380       
381       mask.value = 0;
382       if (tex_usage & PIPE_BIND_RENDER_TARGET)
383          mask.offscreenRenderTarget = 1;
384       if (tex_usage & PIPE_BIND_DEPTH_STENCIL)
385          mask.zStencil = 1;
386       if (tex_usage & PIPE_BIND_SAMPLER_VIEW)
387          mask.texture = 1;
388
389       if ((result.u & mask.value) == mask.value)
390          return TRUE;
391       else
392          return FALSE;
393    }
394
395    /* Use our translate functions directly rather than relying on a
396     * duplicated list of supported formats which is prone to getting
397     * out of sync:
398     */
399    if(tex_usage & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_DEPTH_STENCIL))
400       return svga_translate_format_render(format) != SVGA3D_FORMAT_INVALID;
401    else
402       return svga_translate_format(format) != SVGA3D_FORMAT_INVALID;
403 }
404
405
406 static void
407 svga_fence_reference(struct pipe_screen *screen,
408                      struct pipe_fence_handle **ptr,
409                      struct pipe_fence_handle *fence)
410 {
411    struct svga_winsys_screen *sws = svga_screen(screen)->sws;
412    sws->fence_reference(sws, ptr, fence);
413 }
414
415
416 static boolean
417 svga_fence_signalled(struct pipe_screen *screen,
418                      struct pipe_fence_handle *fence)
419 {
420    struct svga_winsys_screen *sws = svga_screen(screen)->sws;
421    return sws->fence_signalled(sws, fence, 0) == 0;
422 }
423
424
425 static boolean
426 svga_fence_finish(struct pipe_screen *screen,
427                   struct pipe_fence_handle *fence,
428                   uint64_t timeout)
429 {
430    struct svga_winsys_screen *sws = svga_screen(screen)->sws;
431
432    SVGA_DBG(DEBUG_DMA|DEBUG_PERF, "%s fence_ptr %p\n",
433             __FUNCTION__, fence);
434
435    return sws->fence_finish(sws, fence, 0) == 0;
436 }
437
438
439 static void
440 svga_destroy_screen( struct pipe_screen *screen )
441 {
442    struct svga_screen *svgascreen = svga_screen(screen);
443    
444    svga_screen_cache_cleanup(svgascreen);
445
446    pipe_mutex_destroy(svgascreen->swc_mutex);
447    pipe_mutex_destroy(svgascreen->tex_mutex);
448
449    svgascreen->sws->destroy(svgascreen->sws);
450    
451    FREE(svgascreen);
452 }
453
454
455 /**
456  * Create a new svga_screen object
457  */
458 struct pipe_screen *
459 svga_screen_create(struct svga_winsys_screen *sws)
460 {
461    struct svga_screen *svgascreen;
462    struct pipe_screen *screen;
463    SVGA3dDevCapResult result;
464
465 #ifdef DEBUG
466    SVGA_DEBUG = debug_get_flags_option("SVGA_DEBUG", svga_debug_flags, 0 );
467 #endif
468
469    svgascreen = CALLOC_STRUCT(svga_screen);
470    if (!svgascreen)
471       goto error1;
472
473    svgascreen->debug.force_level_surface_view =
474       debug_get_bool_option("SVGA_FORCE_LEVEL_SURFACE_VIEW", FALSE);
475    svgascreen->debug.force_surface_view =
476       debug_get_bool_option("SVGA_FORCE_SURFACE_VIEW", FALSE);
477    svgascreen->debug.force_sampler_view =
478       debug_get_bool_option("SVGA_FORCE_SAMPLER_VIEW", FALSE);
479    svgascreen->debug.no_surface_view =
480       debug_get_bool_option("SVGA_NO_SURFACE_VIEW", FALSE);
481    svgascreen->debug.no_sampler_view =
482       debug_get_bool_option("SVGA_NO_SAMPLER_VIEW", FALSE);
483
484    screen = &svgascreen->screen;
485
486    screen->destroy = svga_destroy_screen;
487    screen->get_name = svga_get_name;
488    screen->get_vendor = svga_get_vendor;
489    screen->get_param = svga_get_param;
490    screen->get_shader_param = svga_get_shader_param;
491    screen->get_paramf = svga_get_paramf;
492    screen->is_format_supported = svga_is_format_supported;
493    screen->context_create = svga_context_create;
494    screen->fence_reference = svga_fence_reference;
495    screen->fence_signalled = svga_fence_signalled;
496    screen->fence_finish = svga_fence_finish;
497    svgascreen->sws = sws;
498
499    svga_init_screen_resource_functions(svgascreen);
500
501    if (sws->get_hw_version) {
502       svgascreen->hw_version = sws->get_hw_version(sws);
503    } else {
504       svgascreen->hw_version = SVGA3D_HWVERSION_WS65_B1;
505    }
506
507    svgascreen->use_ps30 =
508       sws->get_cap(sws, SVGA3D_DEVCAP_FRAGMENT_SHADER_VERSION, &result) &&
509       result.u >= SVGA3DPSVERSION_30 ? TRUE : FALSE;
510
511    svgascreen->use_vs30 =
512       sws->get_cap(sws, SVGA3D_DEVCAP_VERTEX_SHADER_VERSION, &result) &&
513       result.u >= SVGA3DVSVERSION_30 ? TRUE : FALSE;
514
515 #if 1
516    /* Shader model 2.0 is unsupported at the moment. */
517    if(!svgascreen->use_ps30 || !svgascreen->use_vs30)
518       goto error2;
519 #else
520    if(debug_get_bool_option("SVGA_NO_SM30", FALSE))
521       svgascreen->use_vs30 = svgascreen->use_ps30 = FALSE;
522 #endif
523
524    pipe_mutex_init(svgascreen->tex_mutex);
525    pipe_mutex_init(svgascreen->swc_mutex);
526
527    svga_screen_cache_init(svgascreen);
528
529    return screen;
530 error2:
531    FREE(svgascreen);
532 error1:
533    return NULL;
534 }
535
536 struct svga_winsys_screen *
537 svga_winsys_screen(struct pipe_screen *screen)
538 {
539    return svga_screen(screen)->sws;
540 }
541
542 #ifdef DEBUG
543 struct svga_screen *
544 svga_screen(struct pipe_screen *screen)
545 {
546    assert(screen);
547    assert(screen->destroy == svga_destroy_screen);
548    return (struct svga_screen *)screen;
549 }
550 #endif