Project Home
Project Home
Documents
Documents
Wiki
Wiki
Discussion Forums
Discussions
Project Information
Project Info
Forum Topic - Set the dimension and position of a NativeWindowSurface: (3 Items)
   
Set the dimension and position of a NativeWindowSurface  
I have created this simple code in order to attach and detach a NativeWindowType. I use it in order to work with 
OPENGLES in subframe of the main display surface. If the subframe change in dimension the code is used.
Since there is no parameter for the position to be passed to gf_3d_target_create, how I' unable to set the position. 
Actually I use gf_draw_blit2 to blit the surface[0] to the main display surface. 
My first question: is it possible to change the dimension of the surface without the overhead of destroy and recreate 
all?
My second question: how to set the position of the NativeWindowType and leave OpenGL to make the work? (e.g. 
eglSwapInterval)

gf_3d_target_t	        native;
int				nsurface;
gf_surface_t		*surface;
gf_surface_info_t	*surface_info;
gf_context_t		gf_context;

void detach_surface()
{
    if (gf_context)
    	gf_context_unset_surface(gf_context);

    if (native)
    	gf_3d_target_free(native);
    
    if (surface)
    {
    	for (int i = 0; i < nsurface; i++)
    	{
    	    if (surface[i])
    	    	gf_surface_free(surface[i]);
    	}
    	
    	delete[] surface;
    }
    
    if (surface_info)
    	delete[] surface_info;
	
    if (gf_context)
    	gf_context_free(gf_context);

    gf_context = 0;
    native = 0;
}


bool attach_surface(int width, int height)
{
	int err;
	gf_layer_t 	layer = *GF_layer_t();
	gf_dev_t	dev = *GF_gf_dev_t();
	gf_layer_info_t *layer_info = GF_layer_info_t();
	
	surface = new gf_surface_t[nsurface];
	surface_info = new gf_surface_info_t[nsurface];
	
	for (int i = 0; i < nsurface; i++)
	{		
		err = gf_surface_create(&surface[i], dev,\
				width, height, layer_info->format,\
				NULL, GF_SURFACE_CREATE_3D_ACCESSIBLE);
		if (err != GF_ERR_OK)
		{
			return false;
		}
    	gf_surface_get_info(surface[i], &surface_info[i]);
	}
	
	err = gf_3d_target_create(&native, layer,\
				&surface[0], nsurface, width, height,\
				layer_info->format);
	if (err != GF_ERR_OK)
	{
		return false;
	}
}


Thanks,

Mario
RE: Set the dimension and position of a NativeWindowSurface  
Hi Mario,
 
I can only answer part of your questions.  The only real option is to use gf_surface_create() and gf_surface_free() if 
you intend to "resize" surfaces.
 
There is the gf_surface_attach() and gf_surface_reattach(), but they take a memory buffer as a parameter, which is 
attached to the surface.  Unfortunately, this approach does not result in accelerated processing in most cases.
 
Regards,
-Derek

________________________________

From: Mario Mastrodicasa [mailto:community-noreply@qnx.com]
Sent: Thu 23/04/2009 3:35 AM
To: advanced-graphics
Subject: Set the dimension and position of a NativeWindowSurface



I have created this simple code in order to attach and detach a NativeWindowType. I use it in order to work with 
OPENGLES in subframe of the main display surface. If the subframe change in dimension the code is used.
Since there is no parameter for the position to be passed to gf_3d_target_create, how I' unable to set the position. 
Actually I use gf_draw_blit2 to blit the surface[0] to the main display surface.
My first question: is it possible to change the dimension of the surface without the overhead of destroy and recreate 
all?
My second question: how to set the position of the NativeWindowType and leave OpenGL to make the work? (e.g. 
eglSwapInterval)

gf_3d_target_t          native;
int                             nsurface;
gf_surface_t            *surface;
gf_surface_info_t       *surface_info;
gf_context_t            gf_context;

void detach_surface()
{
    if (gf_context)
        gf_context_unset_surface(gf_context);

    if (native)
        gf_3d_target_free(native);
   
    if (surface)
    {
        for (int i = 0; i < nsurface; i++)
        {
            if (surface[i])
                gf_surface_free(surface[i]);
        }
       
        delete[] surface;
    }
   
    if (surface_info)
        delete[] surface_info;
       
    if (gf_context)
        gf_context_free(gf_context);

    gf_context = 0;
    native = 0;
}


bool attach_surface(int width, int height)
{
        int err;
        gf_layer_t      layer = *GF_layer_t();
        gf_dev_t        dev = *GF_gf_dev_t();
        gf_layer_info_t *layer_info = GF_layer_info_t();
       
        surface = new gf_surface_t[nsurface];
        surface_info = new gf_surface_info_t[nsurface];
       
        for (int i = 0; i < nsurface; i++)
        {              
                err = gf_surface_create(&surface[i], dev,\
                                width, height, layer_info->format,\
                                NULL, GF_SURFACE_CREATE_3D_ACCESSIBLE);
                if (err != GF_ERR_OK)
                {
                        return false;
                }
        gf_surface_get_info(surface[i], &surface_info[i]);
        }
       
        err = gf_3d_target_create(&native, layer,\
                                &surface[0], nsurface, width, height,\
                                layer_info->format);
        if (err != GF_ERR_OK)
        {
                return false;
        }
}


Thanks,

Mario

_______________________________________________
Advanced Graphics
http://community.qnx.com/sf/go/post27847



Attachment: Text winmail.dat 8.44 KB
Re: RE: Set the dimension and position of a NativeWindowSurface  
Someone has news on draw the NativeWindowSurface in a generic position of the screen?
I have found a partial solution. 
In the posted example I create 2 surfaces where OpenGL draw into. 
gf-ph-3d example use a single buffer, right? I hope to use a double buffer approach. 
In order to display the 3d surface in the correct position I blit the most recent updated surface to the main screen. I 
think this approch is too expensive and unoptimized.

Thanks in advance.