On Tue, Dec 16, 2014 at 3:18 AM, Chad Versace <chad.vers...@linux.intel.com> wrote: > Today, waffle_window() has only two parameters: width and height. > > Frank Henigman wants to extend Waffle's GBM backend with the ability to > post window contents to the display. Multiple methods exist for posting > content to the screen with the drm API, and that method should be > configurable per waffle_window. Therefore, we need to be able to pass > additional attributes to waffle_window_create(). > > It would also be nice to specify at time of creation that the > waffle_window should be full screen. Again, we need to pass additional > attributes to waffle_window_create(). > > The new function waffle_window_create2() is conceptually equivalent to > the original waffle_window_create() with the addition of an attrib_list > parameter. The only supported attributes are currently > WAFFLE_WINDOW_WIDTH and WAFFLE_WINDOW_HEIGHT. > > See the manpage changes for more details. > > Signed-off-by: Chad Versace <chad.vers...@linux.intel.com> > --- > include/waffle/waffle.h | 14 +++++++++ > man/waffle_enum.3.xml | 7 +++++ > man/waffle_window.3.xml | 27 ++++++++++++++++ > src/waffle/api/waffle_window.c | 71 > ++++++++++++++++++++++++++++++++++++++++++ > src/waffle/core/wcore_util.c | 2 ++ > 5 files changed, 121 insertions(+) > > diff --git a/include/waffle/waffle.h b/include/waffle/waffle.h > index e04b23f..820d012 100644 > --- a/include/waffle/waffle.h > +++ b/include/waffle/waffle.h > @@ -150,6 +150,13 @@ enum waffle_enum { > WAFFLE_DL_OPENGL_ES1 = 0x0302, > WAFFLE_DL_OPENGL_ES2 = 0x0303, > WAFFLE_DL_OPENGL_ES3 = 0x0304, > + > + // ------------------------------------------------------------------ > + // For waffle_window > + // ------------------------------------------------------------------ > + > + WAFFLE_WINDOW_WIDTH = 0x0310, > + WAFFLE_WINDOW_HEIGHT = 0x0311, > }; > > const char* > @@ -221,6 +228,13 @@ waffle_context_get_native(struct waffle_context *self); > // waffle_window > // > --------------------------------------------------------------------------- > > +#if WAFFLE_API_VERSION >= 0x0106 > +struct waffle_window* > +waffle_window_create2( > + struct waffle_config *config, > + const intptr_t attrib_list[]); > +#endif > + > struct waffle_window* > waffle_window_create( > struct waffle_config *config, > diff --git a/man/waffle_enum.3.xml b/man/waffle_enum.3.xml > index a96bd20..ee5f236 100644 > --- a/man/waffle_enum.3.xml > +++ b/man/waffle_enum.3.xml > @@ -141,6 +141,13 @@ enum waffle_enum { > WAFFLE_DL_OPENGL = 0x0301, > WAFFLE_DL_OPENGL_ES1 = 0x0302, > WAFFLE_DL_OPENGL_ES2 = 0x0303, > + > + // ------------------------------------------------------------------ > + // For waffle_window > + // ------------------------------------------------------------------ > + > + WAFFLE_WINDOW_WIDTH = 0x0310, > + WAFFLE_WINDOW_HEIGHT = 0x0311, > }; > ]]> > </programlisting> > diff --git a/man/waffle_window.3.xml b/man/waffle_window.3.xml > index de046fa..795152a 100644 > --- a/man/waffle_window.3.xml > +++ b/man/waffle_window.3.xml > @@ -56,6 +56,12 @@ struct waffle_window; > </funcprototype> > > <funcprototype> > + <funcdef>struct waffle_window* > <function>waffle_window_create2</function></funcdef> > + <paramdef>struct waffle_window > *<parameter>config</parameter></paramdef> > + <paramdef>const intptr_t > <parameter>attrib_list</parameter>[]</paramdef> > + </funcprototype> > + > + <funcprototype> > <funcdef>bool <function>waffle_window_destroy</function></funcdef> > <paramdef>struct waffle_window > *<parameter>self</parameter></paramdef> > </funcprototype> > @@ -104,6 +110,27 @@ struct waffle_window; > </varlistentry> > > <varlistentry> > + <term><function>waffle_window_create2()</function></term> > + <listitem> > + <para> > + Feature test macro: <code>WAFFLE_API_VERSION >= 0x0106</code>. > + (See > <citerefentry><refentrytitle>waffle_feature_test_macros</refentrytitle><manvolnum>7</manvolnum></citerefentry>). > + </para> > + <para> > + Create a window with the properties specified by > + <parameter>config</parameter> and > + <parameter>attrib_list</parameter>. > + > + <parameter>attrib_list</parameter> must contain the attributes > + <constant>WAFFLE_WINDOW_WIDTH</constant> and > + <constant>WAFFLE_WINDOW_HEIGHT</constant>, > + whose values must be positive > + and no greater than <constant>INT32_MAX</constant>. > + </para> > + </listitem> > + </varlistentry> > + > + <varlistentry> > <term><function>waffle_window_destroy()</function></term> > <listitem> > <para> > diff --git a/src/waffle/api/waffle_window.c b/src/waffle/api/waffle_window.c > index 34ecc4a..e04cadb 100644 > --- a/src/waffle/api/waffle_window.c > +++ b/src/waffle/api/waffle_window.c > @@ -27,12 +27,83 @@ > > #include "api_priv.h" > > +#include "wcore_attrib_list.h" > #include "wcore_config.h" > #include "wcore_error.h" > #include "wcore_platform.h" > #include "wcore_window.h" > > WAFFLE_API struct waffle_window* > +waffle_window_create2( > + struct waffle_config *config, > + const intptr_t attrib_list[]) > +{ > + struct wcore_window *wc_self = NULL; > + struct wcore_config *wc_config = wcore_config(config); > + intptr_t width, height; > + intptr_t *filtered_attribs = NULL; > + > + const struct api_object *obj_list[] = { > + wc_config ? &wc_config->api : NULL, > + }; > + > + if (!api_check_entry(obj_list, 1)) { > + goto done; > + } > + > + filtered_attribs = wcore_attrib_list_copy(attrib_list); > + > + if (!wcore_attrib_list_pop(filtered_attribs, > + WAFFLE_WINDOW_WIDTH, &width)) { > + wcore_errorf(WAFFLE_ERROR_BAD_ATTRIBUTE, > + "required attribute WAFFLE_WINDOW_WIDTH is missing"); > + goto done; > + } > + > + if (!wcore_attrib_list_pop(filtered_attribs, > + WAFFLE_WINDOW_HEIGHT, &height)) { > + wcore_errorf(WAFFLE_ERROR_BAD_ATTRIBUTE, > + "required attribute WAFFLE_WINDOW_HEIGHT is missing"); > + goto done; > + } > + > + if (width <= 0) { > + wcore_errorf(WAFFLE_ERROR_BAD_ATTRIBUTE, > + "WAFFLE_WINDOW_WIDTH is not positive"); > + goto done; > + } else if (width > INT32_MAX) { > + wcore_errorf(WAFFLE_ERROR_BAD_ATTRIBUTE, > + "WAFFLE_WINDOW_WIDTH is greater than INT32_MAX"); > + goto done; > + } > + > + if (height <= 0) { > + wcore_errorf(WAFFLE_ERROR_BAD_ATTRIBUTE, > + "WAFFLE_WINDOW_HEIGHT is not positive"); > + goto done; > + } else if (height > INT32_MAX) { > + wcore_errorf(WAFFLE_ERROR_BAD_ATTRIBUTE, > + "WAFFLE_WINDOW_HEIGHT is greater than INT32_MAX"); > + goto done; > + } > + > + wc_self = api_platform->vtbl->window.create(api_platform, > + wc_config, > + (int32_t) width, > + (int32_t) height, > + filtered_attribs);
I think we want the other way around: move the old waffle_window_create() code to the new waffle_window_create2() function, then have create call create2. The limited/specific function calls the more general one. > + > +done: > + free(filtered_attribs); > + > + if (!wc_self) { > + return NULL; > + } > + > + return waffle_window(wc_self); > +} > + > +WAFFLE_API struct waffle_window* > waffle_window_create( > struct waffle_config *config, > int32_t width, int32_t height) > diff --git a/src/waffle/core/wcore_util.c b/src/waffle/core/wcore_util.c > index deee1bf..6c4ef43 100644 > --- a/src/waffle/core/wcore_util.c > +++ b/src/waffle/core/wcore_util.c > @@ -88,6 +88,8 @@ wcore_enum_to_string(int32_t e) > CASE(WAFFLE_DL_OPENGL_ES1); > CASE(WAFFLE_DL_OPENGL_ES2); > CASE(WAFFLE_DL_OPENGL_ES3); > + CASE(WAFFLE_WINDOW_WIDTH); > + CASE(WAFFLE_WINDOW_HEIGHT); > > default: return NULL; > > -- > 2.2.0 > > _______________________________________________ > waffle mailing list > waffle@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/waffle _______________________________________________ waffle mailing list waffle@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/waffle