llvmpipe: Move the determination of the number of threads to the screen.
authorJosé Fonseca <jfonseca@vmware.com>
Sat, 24 Apr 2010 12:20:39 +0000 (13:20 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 24 Apr 2010 12:20:39 +0000 (13:20 +0100)
src/gallium/drivers/llvmpipe/lp_limits.h
src/gallium/drivers/llvmpipe/lp_rast.c
src/gallium/drivers/llvmpipe/lp_rast.h
src/gallium/drivers/llvmpipe/lp_rast_priv.h
src/gallium/drivers/llvmpipe/lp_screen.c
src/gallium/drivers/llvmpipe/lp_screen.h
src/gallium/drivers/llvmpipe/lp_setup.c
src/gallium/drivers/llvmpipe/lp_setup_context.h

index 9ab1b4b36e31ea62fd99789b8d85e9559d68b6d2..c7c5a1eca870adb5fcce90d9f04163e798a612de 100644 (file)
@@ -58,4 +58,7 @@
 #define LP_MAX_WIDTH  (1 << (LP_MAX_TEXTURE_LEVELS - 1))
 
 
+#define LP_MAX_THREADS 8
+
+
 #endif /* LP_LIMITS_H */
index 0a41b6406bd372aeba5a6647ac0d01d1e466a982..c3e186b2a0636a6002b263dcdd30406e4f2aa06b 100644 (file)
@@ -869,20 +869,6 @@ create_rast_threads(struct lp_rasterizer *rast)
 {
    unsigned i;
 
-#ifdef PIPE_OS_WINDOWS
-   /* Multithreading not supported on windows until conditions and barriers are
-    * properly implemented. */
-   rast->num_threads = 0;
-#else
-#ifdef PIPE_OS_EMBEDDED
-   rast->num_threads = 0;
-#else
-   rast->num_threads = util_cpu_caps.nr_cpus;
-#endif
-   rast->num_threads = debug_get_num_option("LP_NUM_THREADS", rast->num_threads);
-   rast->num_threads = MIN2(rast->num_threads, MAX_THREADS);
-#endif
-
    /* NOTE: if num_threads is zero, we won't use any threads */
    for (i = 0; i < rast->num_threads; i++) {
       pipe_semaphore_init(&rast->tasks[i].work_ready, 0);
@@ -900,7 +886,7 @@ create_rast_threads(struct lp_rasterizer *rast)
  *               processing them.
  */
 struct lp_rasterizer *
-lp_rast_create( void )
+lp_rast_create( unsigned num_threads )
 {
    struct lp_rasterizer *rast;
    unsigned i;
@@ -917,6 +903,8 @@ lp_rast_create( void )
       task->thread_index = i;
    }
 
+   rast->num_threads = num_threads;
+
    create_rast_threads(rast);
 
    /* for synchronizing rasterization threads */
index a0ecb2fc47f3b6db186bf5ccef5a632556502d42..e2f6f926779e9a3a54b94941384414c77eab1540 100644 (file)
@@ -134,7 +134,7 @@ struct lp_rast_triangle {
 
 
 struct lp_rasterizer *
-lp_rast_create( void );
+lp_rast_create( unsigned num_threads );
 
 void
 lp_rast_destroy( struct lp_rasterizer * );
index 8bf2b92a6abe93874a54a656e884f203c7dbd96c..18457ff4ce2ffcfa67d419fed1b0fa01e77f257c 100644 (file)
@@ -35,9 +35,7 @@
 #include "lp_scene.h"
 #include "lp_texture.h"
 #include "lp_tile_soa.h"
-
-
-#define MAX_THREADS 8  /* XXX probably temporary here */
+#include "lp_limits.h"
 
 
 struct lp_rasterizer;
@@ -113,10 +111,10 @@ struct lp_rasterizer
    struct lp_scene *curr_scene;
 
    /** A task object for each rasterization thread */
-   struct lp_rasterizer_task tasks[MAX_THREADS];
+   struct lp_rasterizer_task tasks[LP_MAX_THREADS];
 
    unsigned num_threads;
-   pipe_thread threads[MAX_THREADS];
+   pipe_thread threads[LP_MAX_THREADS];
 
    /** For synchronizing the rasterization threads */
    pipe_barrier barrier;
index 7d2cd0c7679274dd47eebb90e56bd8e60a18702d..88c0604c5415c35f1ebfb97472c886b062d7ef17 100644 (file)
@@ -27,6 +27,8 @@
 
 
 #include "util/u_memory.h"
+#include "util/u_math.h"
+#include "util/u_cpu_detect.h"
 #include "util/u_format.h"
 #include "util/u_format_s3tc.h"
 #include "pipe/p_defines.h"
@@ -39,6 +41,7 @@
 #include "lp_context.h"
 #include "lp_debug.h"
 #include "lp_public.h"
+#include "lp_limits.h"
 
 #include "state_tracker/sw_winsys.h"
 
@@ -284,12 +287,26 @@ llvmpipe_create_screen(struct sw_winsys *winsys)
    screen->base.context_create = llvmpipe_create_context;
    screen->base.flush_frontbuffer = llvmpipe_flush_frontbuffer;
 
-   util_format_s3tc_init();
-
    llvmpipe_init_screen_resource_funcs(&screen->base);
    llvmpipe_init_screen_fence_funcs(&screen->base);
 
    lp_jit_screen_init(screen);
 
+#ifdef PIPE_OS_WINDOWS
+   /* Multithreading not supported on windows until conditions and barriers are
+    * properly implemented. */
+   screen->num_threads = 0;
+#else
+#ifdef PIPE_OS_EMBEDDED
+   screen->num_threads = 0;
+#else
+   screen->num_threads = util_cpu_caps.nr_cpus;
+#endif
+   screen->num_threads = debug_get_num_option("LP_NUM_THREADS", screen->num_threads);
+   screen->num_threads = MIN2(screen->num_threads, LP_MAX_THREADS);
+#endif
+
+   util_format_s3tc_init();
+
    return &screen->base;
 }
index af25e043cc97d386cbcc949ca5d69bc88a351545..4f394326103f20ae788b53a64346fd18bf1e6cb4 100644 (file)
@@ -58,6 +58,8 @@ struct llvmpipe_screen
 
    LLVMTypeRef context_ptr_type;
 
+   unsigned num_threads;
+
    /* Increments whenever textures are modified.  Contexts can track
     * this.
     */
index 210c7b8a908899bb489573cc9a6fc059fbe9478d..0dad4c259ecdb616b2604e2fd2c897805b2492cb 100644 (file)
@@ -765,8 +765,9 @@ struct lp_setup_context *
 lp_setup_create( struct pipe_context *pipe,
                  struct draw_context *draw )
 {
-   unsigned i;
+   struct llvmpipe_screen *screen = llvmpipe_screen(pipe->screen);
    struct lp_setup_context *setup = CALLOC_STRUCT(lp_setup_context);
+   unsigned i;
 
    if (!setup)
       return NULL;
@@ -779,7 +780,8 @@ lp_setup_create( struct pipe_context *pipe,
 
    /* XXX: move this to the screen and share between contexts:
     */
-   setup->rast = lp_rast_create();
+   setup->num_threads = screen->num_threads;
+   setup->rast = lp_rast_create(screen->num_threads);
    if (!setup->rast) 
       goto fail;
 
index 4594f7597d5d7212ae604f43a8093646ac94b998..584764ce8ac76f24490c304b3e1f0eb542e464f3 100644 (file)
@@ -80,6 +80,7 @@ struct lp_setup_context
     * create/install this itself now.
     */
    struct draw_stage *vbuf;
+   unsigned num_threads;
    struct lp_rasterizer *rast;
    struct lp_scene *scenes[MAX_SCENES];  /**< all the scenes */
    struct lp_scene *scene;               /**< current scene being built */