<div dir="ltr">Hi,<div><br></div><div>I'm testing two builds of mesa 11.2.0-rc-4 with scons options: </div><div>scons build=debug libgl-gdi osmesa (llvmpipe)</div><div>scons build=debug openmp=yes llvm=no (softpipe)</div><div><br></div><div>I'm trying to run osmesa rendering in parallel with openMP. For both methods I'm creating a vector of osmesa contexts (based on <span style="color:rgb(0,0,0);white-space:pre-wrap"> <a href="http://www.tux.org/pub/x/mesa/beta/MesaCVS/mtdemos/mt_osdemo.c">mt_osdemo.c</a>)</span>:</div><div><br></div><div>for (size_t i=0; i<MAXTHREADS; i++)</div><div> {</div><div><span class="" style="white-space:pre"> </span>/* create the OS Mesa contexts and result buffers */</div><div><span class="" style="white-space:pre">       </span>ctx[i] = OSMesaCreateContextExt( OSMESA_RGBA, 8, 8, 8, NULL );</div><div><span class="" style="white-space:pre">     </span>buffers[i] = calloc(Width * Height * 4, sizeof(GLubyte));</div><div>} <br clear="all"><div><br></div><div>I'm binding buffer to context and render images in parallel as follow (openmp case):</div><div><br></div><div><div>#pragma omp parallel for</div><div><span class="" style="white-space:pre"> </span>for(int i = 0; i < MAXTHREADS; ++i)</div><div><span class="" style="white-space:pre">     </span>{</div><div><span class="" style="white-space:pre">          </span>if (!OSMesaMakeCurrent(ctx[i], buffers[i], GL_UNSIGNED_BYTE, 512, 512))</div><div><span class="" style="white-space:pre">            </span>{</div><div><span class="" style="white-space:pre">                  </span>printf("OSMesaMakeCurrent failed!\n");</div><div><span class="" style="white-space:pre">           </span>}</div><div><span class="" style="white-space:pre">          </span>render_image();</div><div><span class="" style="white-space:pre">    </span>}</div></div><div>As a results only random buffers contains rendered data (proper) and rest of them are blank.</div><div>Do you have any ideas what may be wrong? Is it possible to use OSMesaContexts in parallel?</div><div><br></div><div><div style="font-size:12.8px"><br></div></div><div><br></div><div><div style="font-size:12.8px">//*********************************//</div><div style="font-size:12.8px">//                 Main openmp     //</div><div style="font-size:12.8px">//*********************************//</div></div><div><br></div><div><div>#define MAXTHREADS 8</div><div><br></div><div>void * buffers[MAXTHREADS];<span class="" style="white-space:pre">    </span>/* these are the different result buffers */</div><div>OSMesaContext ctx[MAXTHREADS];<span class="" style="white-space:pre"> </span>/* and these the used contexts */</div></div><div><br></div><div><div>int<span class="" style="white-space:pre">       </span>main(int argc, char *argv[])</div><div>{</div><div><span class="" style="white-space:pre">       </span>char *filename = NULL;</div><div><span class="" style="white-space:pre">     </span>if (argc < 2) {</div><div><span class="" style="white-space:pre">         </span>fprintf(stderr, "Usage:\n");</div><div><span class="" style="white-space:pre">             </span>fprintf(stderr, "  osdemo filename [width height]\n");</div><div><span class="" style="white-space:pre">          </span>return 0;</div><div><span class="" style="white-space:pre">  </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>filename = argv[1];</div><div><span class="" style="white-space:pre">        </span>if (argc == 4) {</div><div><span class="" style="white-space:pre">           </span>Width = atoi(argv[2]);</div><div><span class="" style="white-space:pre">             </span>Height = atoi(argv[3]);</div><div><span class="" style="white-space:pre">    </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>for (size_t i=0; i<MAXTHREADS; i++) {</div><div><span class="" style="white-space:pre">           </span>/* create the OS Mesa contexts and result buffers */</div><div><span class="" style="white-space:pre">               </span>ctx[i] = OSMesaCreateContextExt( OSMESA_RGBA, 8, 8, 8, NULL );</div><div><span class="" style="white-space:pre">             </span>//buffers[i] = calloc(Width * Height * 4, sizeof(GLubyte));</div><div><span class="" style="white-space:pre">                </span>buffers[i] = malloc(Width * Height * 4 * sizeof(GLubyte));</div><div><span class="" style="white-space:pre"> </span>}</div><div>#pragma omp parallel for</div><div><span class="" style="white-space:pre">   </span>for(int i = 0; i < MAXTHREADS; ++i)</div><div><span class="" style="white-space:pre">     </span>{</div><div><span class="" style="white-space:pre">          </span>if (!OSMesaMakeCurrent(ctx[i], buffers[i], GL_UNSIGNED_BYTE, 512, 512))</div><div><span class="" style="white-space:pre">            </span>{</div><div><span class="" style="white-space:pre">                  </span>printf("OSMesaMakeCurrent failed!\n");</div><div><span class="" style="white-space:pre">           </span>}</div><div><span class="" style="white-space:pre">          </span>render_image();</div><div><span class="" style="white-space:pre">    </span>}</div><div><span class="" style="white-space:pre">  </span>for (size_t i=0; i<MAXTHREADS; i++) {</div><div><span class="" style="white-space:pre">           </span></div><div><span class="" style="white-space:pre">           </span>OSMesaDestroyContext( ctx[i]);</div><div><span class="" style="white-space:pre">             </span>free(buffers[i]);</div><div><span class="" style="white-space:pre">  </span>}</div><div><span class="" style="white-space:pre">  </span></div><div><span class="" style="white-space:pre">   </span>return 0;</div><div>}</div></div><div><br></div><div><br></div><div><div><div style="font-size:12.8px">//*********************************//</div><div style="font-size:12.8px">//       Render functions          //</div><div style="font-size:12.8px">//*********************************//</div></div><div><br></div><div><div>static void render_image(void)</div><div>{</div><div>   GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };</div><div>   GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };</div><div>   GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };</div><div>   GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };</div><div>   GLfloat red_mat[]   = { 1.0, 0.2, 0.2, 1.0 };</div><div>   GLfloat green_mat[] = { 0.2, 1.0, 0.2, 1.0 };</div><div>   GLfloat blue_mat[]  = { 0.2, 0.2, 1.0, 1.0 };</div><div><br></div><div>   glViewport(0, 0, 512, 512);</div><div><br></div><div>   glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);</div><div>   glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);</div><div>   glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);</div><div>   glLightfv(GL_LIGHT0, GL_POSITION, light_position);</div><div>    </div><div>   glEnable(GL_LIGHTING);</div><div>   glEnable(GL_LIGHT0);</div><div>   glEnable(GL_DEPTH_TEST);</div><div><br></div><div>   glMatrixMode(GL_PROJECTION);</div><div>   glLoadIdentity();</div><div>   glOrtho(-2.5, 2.5, -2.5, 2.5, -10.0, 10.0);</div><div>   glMatrixMode(GL_MODELVIEW);</div><div><br></div><div>   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );</div><div><br></div><div>   glPushMatrix();</div><div>   glRotatef(20.0, 1.0, 0.0, 0.0);</div><div><br></div><div>   glPushMatrix();</div><div>   glTranslatef(-0.75, 0.5, 0.0); </div><div>   glRotatef(90.0, 1.0, 0.0, 0.0);</div><div>   glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red_mat );</div><div>   Torus(0.275, 0.85, 20, 20);</div><div>   glPopMatrix();</div><div><br></div><div>   glPopMatrix();</div><div>   glFinish();</div><div>}</div></div><div><br></div><div><div>static void Torus(float innerRadius, float outerRadius, int sides, int rings)</div><div>{</div><div>   /* from GLUT... */</div><div>   int i, j;</div><div>   GLfloat theta, phi, theta1;</div><div>   GLfloat cosTheta, sinTheta;</div><div>   GLfloat cosTheta1, sinTheta1;</div><div>   const GLfloat ringDelta = 2.0 * M_PI / rings;</div><div>   const GLfloat sideDelta = 2.0 * M_PI / sides;</div><div><br></div><div>   theta = 0.0;</div><div>   cosTheta = 1.0;</div><div>   sinTheta = 0.0;</div><div>   for (i = rings - 1; i >= 0; i--) {</div><div>      theta1 = theta + ringDelta;</div><div>      cosTheta1 = cos(theta1);</div><div>      sinTheta1 = sin(theta1);</div><div>      glBegin(GL_QUAD_STRIP);</div><div>      phi = 0.0;</div><div>      for (j = sides; j >= 0; j--) {</div><div>         GLfloat cosPhi, sinPhi, dist;</div><div><br></div><div>         phi += sideDelta;</div><div>         cosPhi = cos(phi);</div><div>         sinPhi = sin(phi);</div><div>         dist = outerRadius + innerRadius * cosPhi;</div><div><br></div><div>         glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);</div><div>         glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, innerRadius * sinPhi);</div><div>         glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);</div><div>         glVertex3f(cosTheta * dist, -sinTheta * dist,  innerRadius * sinPhi);</div><div>      }</div><div>      glEnd();</div><div>      theta = theta1;</div><div>      cosTheta = cosTheta1;</div><div>      sinTheta = sinTheta1;</div><div>   }</div><div>}</div></div></div><div><br></div>-- <br><div class="gmail_signature">Pozdrawiam<br>Jacek Blumenfeld</div>
</div></div>