On 17 May 2012 11:21, Ian Romanick <span dir="ltr">&lt;<a href="mailto:idr@freedesktop.org" target="_blank">idr@freedesktop.org</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On 05/14/2012 06:24 PM, Paul Berry wrote:<br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
On 14 May 2012 16:50, Ian Romanick &lt;<a href="mailto:idr@freedesktop.org" target="_blank">idr@freedesktop.org</a><br></div><div><div class="h5">
&lt;mailto:<a href="mailto:idr@freedesktop.org" target="_blank">idr@freedesktop.org</a>&gt;&gt; wrote:<br>
<br>
    On 05/14/2012 02:13 PM, Paul Berry wrote:<br>
<br>
        Just to update the list: I had an in-person meeting with Eric,<br>
        Ian, and<br>
        Ken today to discuss the design of the patch series and decide<br>
        what to<br>
        do about it.  We agreed to go ahead and push the patches to<br>
        master as<br>
        is, and to make further improvements as time goes on.<br>
<br>
        Specific improvements that were discussed:<br>
<br>
        - I seem to be the only person who thinks it makes sense for the<br>
        brw_blorp_params class to contain an exec() function.  In the<br>
        interest<br>
        of avoiding a rebasing nightmare, I will go ahead with the<br>
        patches as<br>
        they are, and submitt a follow up patch which replaces<br>
        brw_blorp_params::exec() with a global function brw_blorp_exec(const<br>
        brw_blorp_params *).<br>
<br>
<br>
    Part of the issue was that &quot;exec&quot; isn&#39;t a terrific name, and<br>
    exec&#39;ing a set of parameters doesn&#39;t have implicit meaning.  My<br>
    preference was for a function, similar to what you mention, called<br>
    brw_blorp_do_blit or similar.<br>
<br>
<br>
I&#39;m not going to try to change your mind, but in the spirit of<br>
clarifying the method that was behind my madness:<br>
<br>
I did not have the clarity of mind during our discussion today to point<br>
out that in creating the brw_blorp_params class, I was in fact trying to<br>
follow a standard design pattern, the Gang of Four &quot;command&quot; pattern<br>
(<a href="http://en.wikipedia.org/wiki/Command_pattern" target="_blank">http://en.wikipedia.org/wiki/<u></u>Command_pattern</a>).  The idea of that<br>
</div></div></blockquote>
<br>
There are some other places, mostly in the compiler, where various patterns are employed.  In those cases, I&#39;ve explicitly put in a comment like, &quot;This is pattern XYZ.  Refer to <a href="http://foo/" target="_blank">http://foo/</a> for the back story.&quot; The comment block in src/glsl/ir_hierarchical_<u></u>visitor.h is an example.<div class="im">
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
pattern is to encapsulate all of the information necessary to perform an<br>
action into a class; this allows the action to be treated as a first<br>
class object.  The usual reasons why it might be useful for the action<br>
to be a first class object are so that it can be stored in an undo<br>
history, so that its execution can be deferred, restarted, or repeated,<br>
or so that some other part of the program can take the opportunity to<br>
tweak the parameters before the action is performed.  In this particular<br>
case the benefit is that the various phases of the action can be<br>
performed by different functions without an explosion of parameter<br>
passing, and so that actions that share some, but not all, of their<br>
implementation (HiZ ops and blits, in this case) can be implemented by<br>
using a base class with virtual functions.  It&#39;s also possible that in<br>
the future, the blorp engine might be able to record the last command it<br>
executed, so that it can compare that to the command it&#39;s being asked to<br>
execute and avoid some redundant pipeline setup.  In the command<br>
pattern, it is conventional to make the function that performs the<br>
action a member of the command class and to call it &quot;exec&quot; or<br>
&quot;execute&quot;.  So from my point of view, this function name actually *does*<br>
have an implicit meaning.  I&#39;m aware, of course, that most of my fellow<br>
Mesa developers don&#39;t share my respect for Gang of Four-style design :)<br>
<br>
(Note that in a strict implementation of the &quot;command&quot; pattern there are<br>
other auxiliary classes involved, but I thought that would be way too<br>
heavyweight for this purpose).<br>
</blockquote>
<br></div>
I believe that it is also typical in the command pattern for the classes to have &quot;command&quot; in the name instead of &quot;parameters.&quot;  At least the examples in <a href="http://en.wikipedia.org/wiki/Command_pattern" target="_blank">http://en.wikipedia.org/wiki/<u></u>Command_pattern</a> and my &quot;Patterns in Java&quot; book suggest this.<br>

<br>
For me, the advantage of patterns is rarely technical.  For me, the advantage of patterns is in communication with other humans.  If a piece of code says, &quot;I&#39;m an implementation of the factory pattern&quot; people will have a set of expectations about what&#39;s coming.  In some sense they&#39;ll be familiar with the code before they even see it.<br>

<br>
There was, by necessity, a lot of moving parts in MSAA patch series. That combined with a slight deviation from the pattern (the previously mentioned parameters vs. command naming) caused me to not see the pattern.  For me, that defeated the improved communication of pattern use.<br>

<br>
Communication isn&#39;t just with other humans.  Perhaps if the class had been called brw_blorp_blit_command you would have remembered that you were using the command pattern while we were having the review meeting. :)</blockquote>
<div><br>Yes, you&#39;re right.  That would have helped.<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div class="h5"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
    If I see foo-&gt;exec() or exec(foo) in a pipe of code, I have to go<br>
    look at the declaration of foo to know what&#39;s going on.  If I see<br>
    do_some_action(foo) it&#39;s a bit more obvious.<br>
<br>
<br>
In this particular case (and in most uses of the command pattern, IMHO),<br>
the declaration is right next to the exec() call, so this isn&#39;t a<br>
problem.  E.g.:<br>
<br>
    /* Do the blit */<br>
    brw_blorp_blit_params params(brw_context(ctx), src_mt, dst_mt,<br>
                                 srcX0, srcY0, dstX0, dstY0, dstX1, dstY1,<br>
                                 mirror_x, mirror_y);<br>
    params.exec(intel);<br>
<br>
I agree that it looks kind of hokey, though.  Other alternatives I<br>
considered included:<br>
<br>
- Make intel_context a class, and make executing a blorp action a method<br>
on that class, so that last line would have been something like<br>
&quot;intel-&gt;do_blorp_op(params);&quot;.  Incidentally, I think we would get a lot<br>
of benefits out of making brw_context, intel_context, and gl_context a<br>
class hierarchy; for example, macros like OUT_BATCH() would become<br>
ordinary member functions, and we wouldn&#39;t have to do anywhere near as<br>
many explicit conversions between the three context types.  Also, the<br>
virtual function tables that we currently code up explicitly would be<br>
automatically created by the compiler, so we would have much less risk<br>
of problems like forgetting to dispatch through the virtual function<br>
table, forgetting to initialize a function pointer properly, or<br>
initializing a function pointer at the wrong time.  Of course, this<br>
would have been *way* too big a change to try to slip into this patch<br>
series.  By orders of magnitude.<br>
<br>
- Make a base class to represent the Blorp engine, with a derived class<br>
for Gen6 and a derived class for Gen7.  The appropriate object would be<br>
created at context creation time.  Then, instead of calling<br>
&quot;params.exec(intel);&quot;, you would do &quot;brw-&gt;blorp-&gt;exec(params);&quot;.  I<br>
largely dismissed this option because I had already done so much<br>
refactoring of the HiZ code that it seemed like it was time to settle<br>
down and actually implement some new functionality.  But I would still<br>
be open to it if people like the idea.<br>
</blockquote>
<br></div></div>
Wouldn&#39;t a more usual way to handle this kind of partitioning be with an abstract factory?<br>
</blockquote></div><br>Can you elaborate?  IIRC, an abstract factory is for when component A needs to do object creation, but component B knows how to do object creation, so you create an abstract factory class with a pure virtual &quot;create&quot; method.  Component B instantiates a concrete factory and hands it off to component A, and then component A can use the factory to create the objects without needing to know details about how they are created.  It&#39;s not obvious to me how to map this pattern onto the situation we have with brw_blorp_params.<br>